diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index a44cac2cd1a..877273d7645 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -35,14 +35,14 @@ jobs: - name: Install Dependencies run: | - cd "Tools/changelog" + cd "Tools/changelogs" npm install shell: bash continue-on-error: true - name: Generate Changelog run: | - cd "Tools/changelog" + cd "Tools/changelogs" node changelog.js shell: bash continue-on-error: true diff --git a/.github/workflows/prtitlecase.yml b/.github/workflows/prtitlecase.yml new file mode 100644 index 00000000000..b3150dcc7e9 --- /dev/null +++ b/.github/workflows/prtitlecase.yml @@ -0,0 +1,34 @@ +name: PR Title Case +on: + pull_request_target: + types: [opened, edited, synchronize] + +env: + GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + +jobs: + prtitlecase: + runs-on: ubuntu-latest + steps: + - name: Checkout Master + uses: actions/checkout@v3 + with: + token: ${{ secrets.BOT_TOKEN }} + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version: 18.x + + - name: Install Dependencies + run: | + cd "Tools/prtitlecase" + npm install + shell: bash + + - name: Change Title + run: | + cd "Tools/prtitlecase" + node index.js + shell: bash diff --git a/.vscode/settings.json b/.vscode/settings.json index 0e0d3ae890c..dc6e26cbeaa 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,10 @@ { "omnisharp.analyzeOpenDocumentsOnly": true, - "dotnet.defaultSolution": "SpaceStation14.sln" + "dotnet.defaultSolution": "SpaceStation14.sln", + "json.schemas": [ + { + "fileMatch": [ "**/meta.json" ], + "url": "https://raw.githubusercontent.com/Simple-Station/Einstein-Engines/master/.github/rsi-schema.json" + } + ] } diff --git a/BuildChecker/BuildChecker.csproj b/BuildChecker/BuildChecker.csproj index 63d16fa9708..d4f9a412549 100644 --- a/BuildChecker/BuildChecker.csproj +++ b/BuildChecker/BuildChecker.csproj @@ -14,8 +14,6 @@ https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild --> - python3 - py -3 {C899FCA4-7037-4E49-ABC2-44DE72487110} .NETFramework, Version=v4.7.2 false @@ -39,7 +37,7 @@ https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild bin\DebugOpt\ - + diff --git a/BuildChecker/git_helper.py b/BuildChecker/git_helper.py deleted file mode 100644 index becd4506e82..00000000000 --- a/BuildChecker/git_helper.py +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env python3 -# Installs git hooks, updates them, updates submodules, that kind of thing. - -import subprocess -import sys -import os -import shutil -from pathlib import Path -from typing import List - -SOLUTION_PATH = Path("..") / "SpaceStation14.sln" -# If this doesn't match the saved version we overwrite them all. -CURRENT_HOOKS_VERSION = "2" -QUIET = len(sys.argv) == 2 and sys.argv[1] == "--quiet" - - -def run_command(command: List[str], capture: bool = False) -> subprocess.CompletedProcess: - """ - Runs a command with pretty output. - """ - text = ' '.join(command) - if not QUIET: - print("$ {}".format(text)) - - sys.stdout.flush() - - completed = None - - if capture: - completed = subprocess.run(command, cwd="..", stdout=subprocess.PIPE) - else: - completed = subprocess.run(command, cwd="..") - - if completed.returncode != 0: - print("Error: command exited with code {}!".format(completed.returncode)) - - return completed - - -def update_submodules(): - """ - Updates all submodules. - """ - - if ('GITHUB_ACTIONS' in os.environ): - return - - if os.path.isfile("DISABLE_SUBMODULE_AUTOUPDATE"): - return - - if shutil.which("git") is None: - raise FileNotFoundError("git not found in PATH") - - # If the status doesn't match, force VS to reload the solution. - # status = run_command(["git", "submodule", "status"], capture=True) - run_command(["git", "submodule", "update", "--init", "--recursive"]) - # status2 = run_command(["git", "submodule", "status"], capture=True) - - # Something changed. - # if status.stdout != status2.stdout: - # print("Git submodules changed. Reloading solution.") - # reset_solution() - - -def install_hooks(): - """ - Installs the necessary git hooks into .git/hooks. - """ - - # Read version file. - if os.path.isfile("INSTALLED_HOOKS_VERSION"): - with open("INSTALLED_HOOKS_VERSION", "r") as f: - if f.read() == CURRENT_HOOKS_VERSION: - if not QUIET: - print("No hooks change detected.") - return - - with open("INSTALLED_HOOKS_VERSION", "w") as f: - f.write(CURRENT_HOOKS_VERSION) - - print("Hooks need updating.") - - hooks_target_dir = Path("..")/".git"/"hooks" - hooks_source_dir = Path("hooks") - - # Clear entire tree since we need to kill deleted files too. - for filename in os.listdir(str(hooks_target_dir)): - os.remove(str(hooks_target_dir/filename)) - - for filename in os.listdir(str(hooks_source_dir)): - print("Copying hook {}".format(filename)) - shutil.copy2(str(hooks_source_dir/filename), - str(hooks_target_dir/filename)) - - -def reset_solution(): - """ - Force VS to think the solution has been changed to prompt the user to reload it, thus fixing any load errors. - """ - - with SOLUTION_PATH.open("r") as f: - content = f.read() - - with SOLUTION_PATH.open("w") as f: - f.write(content) - - -if __name__ == '__main__': - install_hooks() - update_submodules() diff --git a/BuildChecker/hooks/post-checkout b/BuildChecker/hooks/post-checkout deleted file mode 100755 index c5662445c27..00000000000 --- a/BuildChecker/hooks/post-checkout +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -gitroot=`git rev-parse --show-toplevel` - -cd "$gitroot/BuildChecker" - -if [[ `uname` == MINGW* || `uname` == CYGWIN* ]]; then - # Windows - py -3 git_helper.py --quiet -else - # Not Windows, so probably some other Unix thing. - python3 git_helper.py --quiet -fi diff --git a/BuildChecker/hooks/post-merge b/BuildChecker/hooks/post-merge deleted file mode 100755 index 85fe61d966c..00000000000 --- a/BuildChecker/hooks/post-merge +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -# Just call post-checkout since it does the same thing. -gitroot=`git rev-parse --show-toplevel` -bash "$gitroot/.git/hooks/post-checkout" diff --git a/Content.Client/Alerts/ClientAlertsSystem.cs b/Content.Client/Alerts/ClientAlertsSystem.cs index 237f24e3eae..223bf7876ac 100644 --- a/Content.Client/Alerts/ClientAlertsSystem.cs +++ b/Content.Client/Alerts/ClientAlertsSystem.cs @@ -49,24 +49,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/Announcements/Systems/AnnouncerSystem.cs b/Content.Client/Announcements/Systems/AnnouncerSystem.cs new file mode 100644 index 00000000000..de76396f705 --- /dev/null +++ b/Content.Client/Announcements/Systems/AnnouncerSystem.cs @@ -0,0 +1,69 @@ +using Content.Client.Audio; +using Content.Shared.Announcements.Events; +using Content.Shared.Announcements.Systems; +using Content.Shared.CCVar; +using Robust.Client.Audio; +using Robust.Client.Player; +using Robust.Client.ResourceManagement; +using Robust.Shared.Audio.Sources; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Configuration; + +namespace Content.Client.Announcements.Systems; + +public sealed class AnnouncerSystem : SharedAnnouncerSystem +{ + [Dependency] private readonly IPlayerManager _player = default!; + [Dependency] private readonly IConfigurationManager _config = default!; + [Dependency] private readonly IResourceCache _cache = default!; + [Dependency] private readonly IAudioManager _audioManager = default!; + + private IAudioSource? AnnouncerSource { get; set; } + private float AnnouncerVolume { get; set; } + + + public override void Initialize() + { + base.Initialize(); + + AnnouncerVolume = _config.GetCVar(CCVars.AnnouncerVolume) * 100f / ContentAudioSystem.AnnouncerMultiplier; + + SubscribeNetworkEvent(OnAnnouncementReceived); + _config.OnValueChanged(CCVars.AnnouncerVolume, OnAnnouncerVolumeChanged); + } + + public override void Shutdown() + { + base.Shutdown(); + + _config.UnsubValueChanged(CCVars.AnnouncerVolume, OnAnnouncerVolumeChanged); + } + + + private void OnAnnouncerVolumeChanged(float value) + { + AnnouncerVolume = value; + + if (AnnouncerSource != null) + AnnouncerSource.Gain = AnnouncerVolume; + } + + private void OnAnnouncementReceived(AnnouncementSendEvent ev) + { + if (!ev.Recipients.Contains(_player.LocalSession!.UserId) + || !_cache.TryGetResource(GetAnnouncementPath(ev.AnnouncementId, ev.AnnouncerId), + out var resource)) + return; + + var source = _audioManager.CreateAudioSource(resource); + if (source != null) + { + source.Gain = AnnouncerVolume * SharedAudioSystem.VolumeToGain(ev.AudioParams.Volume); + source.Global = true; + } + + AnnouncerSource?.Dispose(); + AnnouncerSource = source; + AnnouncerSource?.StartPlaying(); + } +} diff --git a/Content.Client/Audio/AmbientSoundSystem.cs b/Content.Client/Audio/AmbientSoundSystem.cs index 9d30cabb1ec..0206017baef 100644 --- a/Content.Client/Audio/AmbientSoundSystem.cs +++ b/Content.Client/Audio/AmbientSoundSystem.cs @@ -50,7 +50,6 @@ protected override void QueueUpdate(EntityUid uid, AmbientSoundComponent ambienc private static AudioParams _params = AudioParams.Default .WithVariation(0.01f) .WithLoop(true) - .WithAttenuation(Attenuation.LinearDistance) .WithMaxDistance(7f); /// diff --git a/Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs b/Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs index 0fdcc7a86dd..92c5b7a4191 100644 --- a/Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs +++ b/Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs @@ -23,8 +23,8 @@ public sealed partial class ContentAudioSystem [Dependency] private readonly IStateManager _stateManager = default!; [Dependency] private readonly IResourceCache _resourceCache = default!; - private readonly AudioParams _lobbySoundtrackParams = new(-5f, 1, "Master", 0, 0, 0, false, 0f); - private readonly AudioParams _roundEndSoundEffectParams = new(-5f, 1, "Master", 0, 0, 0, false, 0f); + private readonly AudioParams _lobbySoundtrackParams = new(-5f, 1, 0, 0, 0, false, 0f); + private readonly AudioParams _roundEndSoundEffectParams = new(-5f, 1, 0, 0, 0, false, 0f); /// /// EntityUid of lobby restart sound component. diff --git a/Content.Client/Audio/ContentAudioSystem.cs b/Content.Client/Audio/ContentAudioSystem.cs index f62b34b492c..a79ff74e797 100644 --- a/Content.Client/Audio/ContentAudioSystem.cs +++ b/Content.Client/Audio/ContentAudioSystem.cs @@ -29,7 +29,8 @@ public sealed partial class ContentAudioSystem : SharedContentAudioSystem public const float AmbientMusicMultiplier = 3f; public const float LobbyMultiplier = 3f; public const float InterfaceMultiplier = 2f; - + public const float AnnouncerMultiplier = 3f; + public override void Initialize() { base.Initialize(); diff --git a/Content.Client/Clothing/ClientClothingSystem.cs b/Content.Client/Clothing/ClientClothingSystem.cs index fbe9d5ec5bb..7e78ac7d707 100644 --- a/Content.Client/Clothing/ClientClothingSystem.cs +++ b/Content.Client/Clothing/ClientClothingSystem.cs @@ -133,7 +133,7 @@ private bool TryGetDefaultVisuals(EntityUid uid, ClothingComponent clothing, str else if (TryComp(uid, out SpriteComponent? sprite)) rsi = sprite.BaseRSI; - if (rsi == null || rsi.Path == null) + if (rsi == null) return false; var correctedSlot = slot; diff --git a/Content.Client/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUi.cs b/Content.Client/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUi.cs index ea5aa3cf256..2dbe923b2a6 100644 --- a/Content.Client/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUi.cs +++ b/Content.Client/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUi.cs @@ -18,15 +18,6 @@ public override Control GetUIFragmentRoot() public override void Setup(BoundUserInterface userInterface, EntityUid? fragmentOwner) { _fragment = new CrimeAssistUiFragment(); - - _fragment.OnSync += _ => SendSyncMessage(userInterface); - } - - private void SendSyncMessage(BoundUserInterface userInterface) - { - var syncMessage = new CrimeAssistSyncMessageEvent(); - var message = new CartridgeUiMessage(syncMessage); - userInterface.SendMessage(message); } public override void UpdateState(BoundUserInterfaceState state) diff --git a/Content.Client/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUiFragment.xaml.cs b/Content.Client/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUiFragment.xaml.cs index e3163975d12..fb085a8a799 100644 --- a/Content.Client/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUiFragment.xaml.cs +++ b/Content.Client/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUiFragment.xaml.cs @@ -1,7 +1,6 @@ using Content.Client.Message; using Content.Shared.DeltaV.CartridgeLoader.Cartridges; using Robust.Client.AutoGenerated; -using Robust.Client.ResourceManagement; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; using Robust.Shared.Prototypes; @@ -13,9 +12,7 @@ namespace Content.Client.DeltaV.CartridgeLoader.Cartridges; public sealed partial class CrimeAssistUiFragment : BoxContainer { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly IResourceCache _resourceCache = default!; - public event Action? OnSync; private CrimeAssistPage _currentPage; private List? _pages; diff --git a/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchEntryControl.xaml b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchEntryControl.xaml new file mode 100644 index 00000000000..2de8a37ff77 --- /dev/null +++ b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchEntryControl.xaml @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchEntryControl.xaml.cs b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchEntryControl.xaml.cs new file mode 100644 index 00000000000..e8dd4eea446 --- /dev/null +++ b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchEntryControl.xaml.cs @@ -0,0 +1,21 @@ +using Content.Shared.CartridgeLoader.Cartridges; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.XAML; + +namespace Content.Client.DeltaV.CartridgeLoader.Cartridges; + +[GenerateTypedNameReferences] +public sealed partial class SecWatchEntryControl : BoxContainer +{ + public SecWatchEntryControl(SecWatchEntry entry) + { + RobustXamlLoader.Load(this); + + Status.Text = Loc.GetString($"criminal-records-status-{entry.Status.ToString().ToLower()}"); + Title.Text = Loc.GetString("sec-watch-entry", ("name", entry.Name), ("job", entry.Job)); + + Reason.Text = entry.Reason ?? Loc.GetString("sec-watch-no-reason"); + } +} diff --git a/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUi.cs b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUi.cs new file mode 100644 index 00000000000..da5ff825b91 --- /dev/null +++ b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUi.cs @@ -0,0 +1,27 @@ +using Content.Client.UserInterface.Fragments; +using Content.Shared.CartridgeLoader; +using Content.Shared.CartridgeLoader.Cartridges; +using Robust.Client.UserInterface; + +namespace Content.Client.DeltaV.CartridgeLoader.Cartridges; + +public sealed partial class SecWatchUi : UIFragment +{ + private SecWatchUiFragment? _fragment; + + public override Control GetUIFragmentRoot() + { + return _fragment!; + } + + public override void Setup(BoundUserInterface ui, EntityUid? owner) + { + _fragment = new SecWatchUiFragment(); + } + + public override void UpdateState(BoundUserInterfaceState state) + { + if (state is SecWatchUiState cast) + _fragment?.UpdateState(cast); + } +} diff --git a/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUiFragment.xaml b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUiFragment.xaml new file mode 100644 index 00000000000..7fb2c42debc --- /dev/null +++ b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUiFragment.xaml @@ -0,0 +1,13 @@ + + + + diff --git a/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUiFragment.xaml.cs b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUiFragment.xaml.cs new file mode 100644 index 00000000000..ad152840529 --- /dev/null +++ b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUiFragment.xaml.cs @@ -0,0 +1,25 @@ +using Content.Shared.CartridgeLoader.Cartridges; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.XAML; + +namespace Content.Client.DeltaV.CartridgeLoader.Cartridges; + +[GenerateTypedNameReferences] +public sealed partial class SecWatchUiFragment : BoxContainer +{ + public SecWatchUiFragment() + { + RobustXamlLoader.Load(this); + } + + public void UpdateState(SecWatchUiState state) + { + NoEntries.Visible = state.Entries.Count == 0; + Entries.RemoveAllChildren(); + foreach (var entry in state.Entries) + { + Entries.AddChild(new SecWatchEntryControl(entry)); + } + } +} diff --git a/Content.Client/Doors/DoorSystem.cs b/Content.Client/Doors/DoorSystem.cs index 473ae97059a..bc52730b0e7 100644 --- a/Content.Client/Doors/DoorSystem.cs +++ b/Content.Client/Doors/DoorSystem.cs @@ -4,14 +4,12 @@ using Robust.Client.GameObjects; using Robust.Client.ResourceManagement; using Robust.Shared.Serialization.TypeSerializers.Implementations; -using Robust.Shared.Timing; namespace Content.Client.Doors; public sealed class DoorSystem : SharedDoorSystem { [Dependency] private readonly AnimationPlayerSystem _animationSystem = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly IResourceCache _resourceCache = default!; public override void Initialize() diff --git a/Content.Client/Entry/EntryPoint.cs b/Content.Client/Entry/EntryPoint.cs index 53a8051eecf..a1fc68bbd2f 100644 --- a/Content.Client/Entry/EntryPoint.cs +++ b/Content.Client/Entry/EntryPoint.cs @@ -124,6 +124,7 @@ public override void Init() _prototypeManager.RegisterIgnore("wireLayout"); _prototypeManager.RegisterIgnore("alertLevels"); _prototypeManager.RegisterIgnore("nukeopsRole"); + _prototypeManager.RegisterIgnore("stationGoal"); _componentFactory.GenerateNetIds(); _adminManager.Initialize(); diff --git a/Content.Client/Gameplay/GameplayState.cs b/Content.Client/Gameplay/GameplayState.cs index 1efee978f39..2ea16521e8f 100644 --- a/Content.Client/Gameplay/GameplayState.cs +++ b/Content.Client/Gameplay/GameplayState.cs @@ -93,17 +93,17 @@ private void LoadMainScreen() var screenTypeString = _configurationManager.GetCVar(CCVars.UILayout); if (!Enum.TryParse(screenTypeString, out ScreenType screenType)) { - screenType = default; + screenType = ScreenType.Separated; } switch (screenType) { - case ScreenType.Default: - _uiManager.LoadScreen(); - break; case ScreenType.Separated: _uiManager.LoadScreen(); break; + case ScreenType.Overlay: + _uiManager.LoadScreen(); + break; } _loadController.LoadScreen(); diff --git a/Content.Client/Humanoid/HumanoidAppearanceSystem.cs b/Content.Client/Humanoid/HumanoidAppearanceSystem.cs index 5bae35da5ba..8087d1833e6 100644 --- a/Content.Client/Humanoid/HumanoidAppearanceSystem.cs +++ b/Content.Client/Humanoid/HumanoidAppearanceSystem.cs @@ -1,3 +1,4 @@ +using System.Numerics; using Content.Shared.Humanoid; using Content.Shared.Humanoid.Markings; using Content.Shared.Humanoid.Prototypes; @@ -30,6 +31,15 @@ private void UpdateSprite(HumanoidAppearanceComponent component, SpriteComponent UpdateLayers(component, sprite); ApplyMarkingSet(component, sprite); + var speciesPrototype = _prototypeManager.Index(component.Species); + + var height = Math.Clamp(component.Height, speciesPrototype.MinHeight, speciesPrototype.MaxHeight); + var width = Math.Clamp(component.Width, speciesPrototype.MinWidth, speciesPrototype.MaxWidth); + component.Height = height; + component.Width = width; + + sprite.Scale = new Vector2(width, height); + sprite[sprite.LayerMapReserveBlank(HumanoidVisualLayers.Eyes)].Color = component.EyeColor; } @@ -194,6 +204,8 @@ public override void LoadProfile(EntityUid uid, HumanoidCharacterProfile profile humanoid.Species = profile.Species; humanoid.SkinColor = profile.Appearance.SkinColor; humanoid.EyeColor = profile.Appearance.EyeColor; + humanoid.Height = profile.Height; + humanoid.Width = profile.Width; UpdateSprite(humanoid, Comp(uid)); } diff --git a/Content.Client/IconSmoothing/IconSmoothSystem.cs b/Content.Client/IconSmoothing/IconSmoothSystem.cs index 0ab33c65202..4b025608465 100644 --- a/Content.Client/IconSmoothing/IconSmoothSystem.cs +++ b/Content.Client/IconSmoothing/IconSmoothSystem.cs @@ -16,8 +16,6 @@ namespace Content.Client.IconSmoothing [UsedImplicitly] public sealed partial class IconSmoothSystem : EntitySystem { - [Dependency] private readonly IMapManager _mapManager = default!; - private readonly Queue _dirtyEntities = new(); private readonly Queue _anchorChangedEntities = new(); @@ -47,7 +45,7 @@ private void OnStartup(EntityUid uid, IconSmoothComponent component, ComponentSt var xform = Transform(uid); if (xform.Anchored) { - component.LastPosition = _mapManager.TryGetGrid(xform.GridUid, out var grid) + component.LastPosition = TryComp(xform.GridUid, out var grid) ? (xform.GridUid.Value, grid.TileIndicesFor(xform.Coordinates)) : (null, new Vector2i(0, 0)); @@ -134,7 +132,7 @@ public void DirtyNeighbours(EntityUid uid, IconSmoothComponent? comp = null, Tra Vector2i pos; - if (transform.Anchored && _mapManager.TryGetGrid(transform.GridUid, out var grid)) + if (transform.Anchored && TryComp(transform.GridUid, out var grid)) { pos = grid.CoordinatesToTile(transform.Coordinates); } @@ -144,7 +142,7 @@ public void DirtyNeighbours(EntityUid uid, IconSmoothComponent? comp = null, Tra if (comp.LastPosition is not (EntityUid gridId, Vector2i oldPos)) return; - if (!_mapManager.TryGetGrid(gridId, out grid)) + if (!TryComp(gridId, out grid)) return; pos = oldPos; @@ -206,7 +204,7 @@ private void CalculateNewSprite(EntityUid uid, { var directions = DirectionFlag.None; - if (_mapManager.TryGetGrid(xform.GridUid, out grid)) + if (TryComp(xform.GridUid, out grid)) { var pos = grid.TileIndicesFor(xform.Coordinates); @@ -240,7 +238,7 @@ private void CalculateNewSprite(EntityUid uid, if (xform.Anchored) { - if (!_mapManager.TryGetGrid(xform.GridUid, out grid)) + if (!TryComp(xform.GridUid, out grid)) { Log.Error($"Failed to calculate IconSmoothComponent sprite in {uid} because grid {xform.GridUid} was missing."); return; diff --git a/Content.Client/Input/ContentContexts.cs b/Content.Client/Input/ContentContexts.cs index 03f4f3f38b7..07c1349aac7 100644 --- a/Content.Client/Input/ContentContexts.cs +++ b/Content.Client/Input/ContentContexts.cs @@ -55,6 +55,7 @@ public static void SetupContexts(IInputContextContainer contexts) human.AddFunction(ContentKeyFunctions.UseItemInHand); human.AddFunction(ContentKeyFunctions.AltUseItemInHand); human.AddFunction(ContentKeyFunctions.OpenCharacterMenu); + human.AddFunction(ContentKeyFunctions.OpenLanguageMenu); human.AddFunction(ContentKeyFunctions.ActivateItemInWorld); human.AddFunction(ContentKeyFunctions.ThrowItemInHand); human.AddFunction(ContentKeyFunctions.AltActivateItemInWorld); @@ -67,6 +68,8 @@ public static void SetupContexts(IInputContextContainer contexts) human.AddFunction(ContentKeyFunctions.SmartEquipBelt); human.AddFunction(ContentKeyFunctions.OpenBackpack); human.AddFunction(ContentKeyFunctions.OpenBelt); + human.AddFunction(ContentKeyFunctions.OfferItem); + human.AddFunction(ContentKeyFunctions.ToggleStanding); human.AddFunction(ContentKeyFunctions.MouseMiddle); human.AddFunction(ContentKeyFunctions.ArcadeUp); human.AddFunction(ContentKeyFunctions.ArcadeDown); diff --git a/Content.Client/Inventory/StrippableBoundUserInterface.cs b/Content.Client/Inventory/StrippableBoundUserInterface.cs index f8eb12df914..4bb49fecc14 100644 --- a/Content.Client/Inventory/StrippableBoundUserInterface.cs +++ b/Content.Client/Inventory/StrippableBoundUserInterface.cs @@ -19,6 +19,7 @@ using Robust.Client.GameObjects; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; +using Robust.Client.Player; using Robust.Shared.Input; using Robust.Shared.Map; using Robust.Shared.Prototypes; @@ -31,6 +32,7 @@ namespace Content.Client.Inventory public sealed class StrippableBoundUserInterface : BoundUserInterface { [Dependency] private readonly IUserInterfaceManager _ui = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; private readonly ExamineSystem _examine; private readonly InventorySystem _inv; private readonly SharedCuffableSystem _cuffable; @@ -198,7 +200,8 @@ private void AddInventoryButton(EntityUid invUid, string slotId, InventoryCompon var entity = container.ContainedEntity; // If this is a full pocket, obscure the real entity - if (entity != null && slotDef.StripHidden) + if (entity != null && slotDef.StripHidden + && !(EntMan.TryGetComponent(_playerManager.LocalEntity, out var thiefcomponent) && thiefcomponent.IgnoreStripHidden)) entity = _virtualHiddenEntity; var button = new SlotButton(new SlotData(slotDef, container)); diff --git a/Content.Client/Items/Systems/ItemSystem.cs b/Content.Client/Items/Systems/ItemSystem.cs index e406ba2b557..5e60d06d0ce 100644 --- a/Content.Client/Items/Systems/ItemSystem.cs +++ b/Content.Client/Items/Systems/ItemSystem.cs @@ -93,7 +93,7 @@ private bool TryGetDefaultVisuals(EntityUid uid, ItemComponent item, string defa else if (TryComp(uid, out SpriteComponent? sprite)) rsi = sprite.BaseRSI; - if (rsi == null || rsi.Path == null) + if (rsi == null) return false; var state = (item.HeldPrefix == null) diff --git a/Content.Client/Language/LanguageMenuWindow.xaml b/Content.Client/Language/LanguageMenuWindow.xaml new file mode 100644 index 00000000000..ff33a6ddf56 --- /dev/null +++ b/Content.Client/Language/LanguageMenuWindow.xaml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/Content.Client/Language/LanguageMenuWindow.xaml.cs b/Content.Client/Language/LanguageMenuWindow.xaml.cs new file mode 100644 index 00000000000..11d1c290d16 --- /dev/null +++ b/Content.Client/Language/LanguageMenuWindow.xaml.cs @@ -0,0 +1,131 @@ +using Content.Client.Language.Systems; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.CustomControls; +using Robust.Client.UserInterface.XAML; + +namespace Content.Client.Language; + +[GenerateTypedNameReferences] +public sealed partial class LanguageMenuWindow : DefaultWindow +{ + private readonly LanguageSystem _clientLanguageSystem; + private readonly List _entries = new(); + + + public LanguageMenuWindow() + { + RobustXamlLoader.Load(this); + _clientLanguageSystem = IoCManager.Resolve().GetEntitySystem(); + } + + protected override void Opened() + { + // Refresh the window when it gets opened. + // This actually causes two refreshes: one immediately, and one after the server sends a state message. + UpdateState(_clientLanguageSystem.CurrentLanguage, _clientLanguageSystem.SpokenLanguages); + _clientLanguageSystem.RequestStateUpdate(); + } + + + public void UpdateState(string currentLanguage, List spokenLanguages) + { + var langName = Loc.GetString($"language-{currentLanguage}-name"); + CurrentLanguageLabel.Text = Loc.GetString("language-menu-current-language", ("language", langName)); + + OptionsList.RemoveAllChildren(); + _entries.Clear(); + + foreach (var language in spokenLanguages) + { + AddLanguageEntry(language); + } + + // Disable the button for the currently chosen language + foreach (var entry in _entries) + { + if (entry.button != null) + entry.button.Disabled = entry.language == currentLanguage; + } + } + + private void AddLanguageEntry(string language) + { + var proto = _clientLanguageSystem.GetLanguagePrototype(language); + var state = new EntryState { language = language }; + + var container = new BoxContainer { Orientation = BoxContainer.LayoutOrientation.Vertical }; + + #region Header + var header = new BoxContainer + { + Orientation = BoxContainer.LayoutOrientation.Horizontal, + HorizontalExpand = true, + SeparationOverride = 2 + }; + + var name = new Label + { + Text = proto?.Name ?? Loc.GetString("generic-error"), + MinWidth = 50, + HorizontalExpand = true + }; + + var button = new Button { Text = "Choose" }; + button.OnPressed += _ => OnLanguageChosen(language); + state.button = button; + + header.AddChild(name); + header.AddChild(button); + + container.AddChild(header); + #endregion + + #region Collapsible description + var body = new CollapsibleBody + { + HorizontalExpand = true, + Margin = new Thickness(4f, 4f) + }; + + var description = new RichTextLabel { HorizontalExpand = true }; + description.SetMessage(proto?.Description ?? Loc.GetString("generic-error")); + body.AddChild(description); + + var collapser = new Collapsible(Loc.GetString("language-menu-description-header"), body) + { + Orientation = BoxContainer.LayoutOrientation.Vertical, + HorizontalExpand = true + }; + + container.AddChild(collapser); + #endregion + + // Before adding, wrap the new container in a PanelContainer to give it a distinct look + var wrapper = new PanelContainer(); + wrapper.StyleClasses.Add("PdaBorderRect"); + + wrapper.AddChild(container); + OptionsList.AddChild(wrapper); + + _entries.Add(state); + } + + + private void OnLanguageChosen(string id) + { + var proto = _clientLanguageSystem.GetLanguagePrototype(id); + if (proto == null) + return; + + _clientLanguageSystem.RequestSetLanguage(proto); + UpdateState(id, _clientLanguageSystem.SpokenLanguages); + } + + + private struct EntryState + { + public string language; + public Button? button; + } +} diff --git a/Content.Client/Language/Systems/LanguageSystem.cs b/Content.Client/Language/Systems/LanguageSystem.cs new file mode 100644 index 00000000000..5dc2fc1f4e7 --- /dev/null +++ b/Content.Client/Language/Systems/LanguageSystem.cs @@ -0,0 +1,75 @@ +using Content.Shared.Language; +using Content.Shared.Language.Events; +using Content.Shared.Language.Systems; +using Robust.Client; + +namespace Content.Client.Language.Systems; + +/// +/// Client-side language system. +/// +/// +/// Unlike the server, the client is not aware of other entities' languages; it's only notified about the entity that it posesses. +/// Due to that, this system stores such information in a static manner. +/// +public sealed class LanguageSystem : SharedLanguageSystem +{ + [Dependency] private readonly IBaseClient _client = default!; + + /// + /// The current language of the entity currently possessed by the player. + /// + public string CurrentLanguage { get; private set; } = default!; + /// + /// The list of languages the currently possessed entity can speak. + /// + public List SpokenLanguages { get; private set; } = new(); + /// + /// The list of languages the currently possessed entity can understand. + /// + public List UnderstoodLanguages { get; private set; } = new(); + + public override void Initialize() + { + base.Initialize(); + + SubscribeNetworkEvent(OnLanguagesUpdated); + _client.RunLevelChanged += OnRunLevelChanged; + } + + private void OnLanguagesUpdated(LanguagesUpdatedMessage message) + { + CurrentLanguage = message.CurrentLanguage; + SpokenLanguages = message.Spoken; + UnderstoodLanguages = message.Understood; + } + + private void OnRunLevelChanged(object? sender, RunLevelChangedEventArgs args) + { + // Request an update when entering a game + if (args.NewLevel == ClientRunLevel.InGame) + RequestStateUpdate(); + } + + /// + /// Sends a network request to the server to update this system's state. + /// The server may ignore the said request if the player is not possessing an entity. + /// + public void RequestStateUpdate() + { + RaiseNetworkEvent(new RequestLanguagesMessage()); + } + + public void RequestSetLanguage(LanguagePrototype language) + { + if (language.ID == CurrentLanguage) + return; + + RaiseNetworkEvent(new LanguagesSetMessage(language.ID)); + + // May cause some minor desync... + // So to reduce the probability of desync, we replicate the change locally too + if (SpokenLanguages.Contains(language.ID)) + CurrentLanguage = language.ID; + } +} diff --git a/Content.Client/Movement/Systems/JetpackSystem.cs b/Content.Client/Movement/Systems/JetpackSystem.cs index f0836ee9b6f..b7f5e48821f 100644 --- a/Content.Client/Movement/Systems/JetpackSystem.cs +++ b/Content.Client/Movement/Systems/JetpackSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Movement.Systems; using Robust.Client.GameObjects; using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; using Robust.Shared.Timing; @@ -12,7 +13,6 @@ namespace Content.Client.Movement.Systems; public sealed class JetpackSystem : SharedJetpackSystem { [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly ClothingSystem _clothing = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; @@ -75,7 +75,7 @@ private void CreateParticles(EntityUid uid) var coordinates = uidXform.Coordinates; var gridUid = coordinates.GetGridUid(EntityManager); - if (_mapManager.TryGetGrid(gridUid, out var grid)) + if (TryComp(gridUid, out var grid)) { coordinates = new EntityCoordinates(gridUid.Value, grid.WorldToLocal(coordinates.ToMapPos(EntityManager, _transform))); } diff --git a/Content.Client/NPC/PathfindingSystem.cs b/Content.Client/NPC/PathfindingSystem.cs index 7bf3df1f0b9..709601a57b6 100644 --- a/Content.Client/NPC/PathfindingSystem.cs +++ b/Content.Client/NPC/PathfindingSystem.cs @@ -289,7 +289,6 @@ private void DrawScreen(OverlayDrawArgs args, DrawingHandleScreen screenHandle) var invGridMatrix = gridXform.InvWorldMatrix; DebugPathPoly? nearest = null; - var nearestDistance = float.MaxValue; foreach (var poly in tile) { diff --git a/Content.Client/NodeContainer/NodeVisualizationOverlay.cs b/Content.Client/NodeContainer/NodeVisualizationOverlay.cs index f10eb9ed8b1..691bcb41dbd 100644 --- a/Content.Client/NodeContainer/NodeVisualizationOverlay.cs +++ b/Content.Client/NodeContainer/NodeVisualizationOverlay.cs @@ -80,7 +80,7 @@ private void DrawScreen(in OverlayDrawArgs args) var xform = _entityManager.GetComponent(_entityManager.GetEntity(node.Entity)); - if (!_mapManager.TryGetGrid(xform.GridUid, out var grid)) + if (!_entityManager.TryGetComponent(xform.GridUid, out var grid)) return; var gridTile = grid.TileIndicesFor(xform.Coordinates); @@ -145,7 +145,7 @@ private void DrawWorld(in OverlayDrawArgs overlayDrawArgs) foreach (var (gridId, gridDict) in _gridIndex) { - var grid = _mapManager.GetGrid(gridId); + var grid = _entityManager.GetComponent(gridId); var (_, _, worldMatrix, invMatrix) = _entityManager.GetComponent(gridId).GetWorldPositionRotationMatrixWithInv(); var lCursorBox = invMatrix.TransformBox(cursorBox); diff --git a/Content.Client/OfferItem/OfferItemIndicatorsOverlay.cs b/Content.Client/OfferItem/OfferItemIndicatorsOverlay.cs new file mode 100644 index 00000000000..16a314a2cf4 --- /dev/null +++ b/Content.Client/OfferItem/OfferItemIndicatorsOverlay.cs @@ -0,0 +1,72 @@ +using System.Numerics; +using Robust.Client.GameObjects; +using Robust.Client.Graphics; +using Robust.Client.Input; +using Robust.Client.UserInterface; +using Robust.Shared.Enums; +using Robust.Shared.Utility; + +namespace Content.Client.OfferItem; + +public sealed class OfferItemIndicatorsOverlay : Overlay +{ + private readonly IInputManager _inputManager; + private readonly IEntityManager _entMan; + private readonly IEyeManager _eye; + private readonly OfferItemSystem _offer; + + private readonly Texture _sight; + + public override OverlaySpace Space => OverlaySpace.ScreenSpace; + + private readonly Color _mainColor = Color.White.WithAlpha(0.3f); + private readonly Color _strokeColor = Color.Black.WithAlpha(0.5f); + private readonly float _scale = 0.6f; // 1 is a little big + + public OfferItemIndicatorsOverlay(IInputManager input, IEntityManager entMan, + IEyeManager eye, OfferItemSystem offerSys) + { + _inputManager = input; + _entMan = entMan; + _eye = eye; + _offer = offerSys; + + var spriteSys = _entMan.EntitySysManager.GetEntitySystem(); + _sight = spriteSys.Frame0(new SpriteSpecifier.Rsi(new ResPath("/Textures/Interface/Misc/give_item.rsi"), + "give_item")); + } + + protected override bool BeforeDraw(in OverlayDrawArgs args) + { + if (!_offer.IsInOfferMode()) + return false; + + return base.BeforeDraw(in args); + } + + protected override void Draw(in OverlayDrawArgs args) + { + var mouseScreenPosition = _inputManager.MouseScreenPosition; + var mousePosMap = _eye.PixelToMap(mouseScreenPosition); + if (mousePosMap.MapId != args.MapId) + return; + + + var mousePos = mouseScreenPosition.Position; + var uiScale = (args.ViewportControl as Control)?.UIScale ?? 1f; + var limitedScale = uiScale > 1.25f ? 1.25f : uiScale; + + DrawSight(_sight, args.ScreenHandle, mousePos, limitedScale * _scale); + } + + private void DrawSight(Texture sight, DrawingHandleScreen screen, Vector2 centerPos, float scale) + { + var sightSize = sight.Size * scale; + var expandedSize = sightSize + new Vector2(7f, 7f); + + screen.DrawTextureRect(sight, + UIBox2.FromDimensions(centerPos - sightSize * 0.5f, sightSize), _strokeColor); + screen.DrawTextureRect(sight, + UIBox2.FromDimensions(centerPos - expandedSize * 0.5f, expandedSize), _mainColor); + } +} diff --git a/Content.Client/OfferItem/OfferItemSystem.cs b/Content.Client/OfferItem/OfferItemSystem.cs new file mode 100644 index 00000000000..51b8dcbc0bc --- /dev/null +++ b/Content.Client/OfferItem/OfferItemSystem.cs @@ -0,0 +1,51 @@ +using Content.Shared.CCVar; +using Content.Shared.OfferItem; +using Robust.Client.Graphics; +using Robust.Client.Input; +using Robust.Client.Player; +using Robust.Shared.Configuration; + +namespace Content.Client.OfferItem; + +public sealed class OfferItemSystem : SharedOfferItemSystem +{ + [Dependency] private readonly IOverlayManager _overlayManager = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; + [Dependency] private readonly IInputManager _inputManager = default!; + [Dependency] private readonly IEyeManager _eye = default!; + + public override void Initialize() + { + Subs.CVar(_cfg, CCVars.OfferModeIndicatorsPointShow, OnShowOfferIndicatorsChanged, true); + } + public override void Shutdown() + { + _overlayManager.RemoveOverlay(); + + base.Shutdown(); + } + + public bool IsInOfferMode() + { + var entity = _playerManager.LocalEntity; + + if (entity == null) + return false; + + return IsInOfferMode(entity.Value); + } + private void OnShowOfferIndicatorsChanged(bool isShow) + { + if (isShow) + { + _overlayManager.AddOverlay(new OfferItemIndicatorsOverlay( + _inputManager, + EntityManager, + _eye, + this)); + } + else + _overlayManager.RemoveOverlay(); + } +} diff --git a/Content.Client/Options/UI/Tabs/AudioTab.xaml b/Content.Client/Options/UI/Tabs/AudioTab.xaml index e54b0dc34ee..8dd723d446d 100644 --- a/Content.Client/Options/UI/Tabs/AudioTab.xaml +++ b/Content.Client/Options/UI/Tabs/AudioTab.xaml @@ -100,6 +100,19 @@ protected async Task AddGravity(EntityUid? uid = null) { - var target = uid ?? MapData.GridUid; + var target = uid ?? MapData.Grid; await Server.WaitPost(() => { var gravity = SEntMan.EnsureComponent(target); diff --git a/Content.IntegrationTests/Tests/Interaction/InteractionTest.cs b/Content.IntegrationTests/Tests/Interaction/InteractionTest.cs index bed27ba6efe..a4ed31e9983 100644 --- a/Content.IntegrationTests/Tests/Interaction/InteractionTest.cs +++ b/Content.IntegrationTests/Tests/Interaction/InteractionTest.cs @@ -184,7 +184,7 @@ public virtual async Task Setup() await Pair.CreateTestMap(); PlayerCoords = SEntMan.GetNetCoordinates(MapData.GridCoords.Offset(new Vector2(0.5f, 0.5f)).WithEntityId(MapData.MapUid, Transform, SEntMan)); TargetCoords = SEntMan.GetNetCoordinates(MapData.GridCoords.Offset(new Vector2(1.5f, 0.5f)).WithEntityId(MapData.MapUid, Transform, SEntMan)); - await SetTile(Plating, grid: MapData.MapGrid); + await SetTile(Plating, grid: MapData.Grid.Comp); // Get player data var sPlayerMan = Server.ResolveDependency(); diff --git a/Content.IntegrationTests/Tests/Interaction/MovementTest.cs b/Content.IntegrationTests/Tests/Interaction/MovementTest.cs index 553b031c2b7..dc5aec92cfc 100644 --- a/Content.IntegrationTests/Tests/Interaction/MovementTest.cs +++ b/Content.IntegrationTests/Tests/Interaction/MovementTest.cs @@ -31,7 +31,7 @@ public override async Task Setup() for (var i = -Tiles; i <= Tiles; i++) { - await SetTile(Plating, SEntMan.GetNetCoordinates(pCoords.Offset(new Vector2(i, 0))), MapData.MapGrid); + await SetTile(Plating, SEntMan.GetNetCoordinates(pCoords.Offset(new Vector2(i, 0))), MapData.Grid.Comp); } AssertGridCount(1); diff --git a/Content.IntegrationTests/Tests/Linter/StaticFieldValidationTest.cs b/Content.IntegrationTests/Tests/Linter/StaticFieldValidationTest.cs new file mode 100644 index 00000000000..30724b50a6d --- /dev/null +++ b/Content.IntegrationTests/Tests/Linter/StaticFieldValidationTest.cs @@ -0,0 +1,150 @@ +using System.Collections.Generic; +using System.Linq; +using Content.Shared.Tag; +using Robust.Shared.Prototypes; +using Robust.Shared.Reflection; +using Robust.Shared.Serialization.Manager.Attributes; + +namespace Content.IntegrationTests.Tests.Linter; + +/// +/// Verify that the yaml linter successfully validates static fields +/// +[TestFixture] +public sealed class StaticFieldValidationTest +{ + [Test] + public async Task TestStaticFieldValidation() + { + await using var pair = await PoolManager.GetServerClient(); + var protoMan = pair.Server.ProtoMan; + + var protos = new Dictionary>(); + foreach (var kind in protoMan.EnumeratePrototypeKinds()) + { + var ids = protoMan.EnumeratePrototypes(kind).Select(x => x.ID).ToHashSet(); + protos.Add(kind, ids); + } + + Assert.That(protoMan.ValidateStaticFields(typeof(StringValid), protos).Count, Is.Zero); + Assert.That(protoMan.ValidateStaticFields(typeof(StringArrayValid), protos).Count, Is.Zero); + Assert.That(protoMan.ValidateStaticFields(typeof(EntProtoIdValid), protos).Count, Is.Zero); + Assert.That(protoMan.ValidateStaticFields(typeof(EntProtoIdArrayValid), protos).Count, Is.Zero); + Assert.That(protoMan.ValidateStaticFields(typeof(ProtoIdTestValid), protos).Count, Is.Zero); + Assert.That(protoMan.ValidateStaticFields(typeof(ProtoIdArrayValid), protos).Count, Is.Zero); + Assert.That(protoMan.ValidateStaticFields(typeof(ProtoIdListValid), protos).Count, Is.Zero); + Assert.That(protoMan.ValidateStaticFields(typeof(ProtoIdSetValid), protos).Count, Is.Zero); + Assert.That(protoMan.ValidateStaticFields(typeof(PrivateProtoIdArrayValid), protos).Count, Is.Zero); + + Assert.That(protoMan.ValidateStaticFields(typeof(StringInvalid), protos).Count, Is.EqualTo(1)); + Assert.That(protoMan.ValidateStaticFields(typeof(StringArrayInvalid), protos).Count, Is.EqualTo(2)); + Assert.That(protoMan.ValidateStaticFields(typeof(EntProtoIdInvalid), protos).Count, Is.EqualTo(1)); + Assert.That(protoMan.ValidateStaticFields(typeof(EntProtoIdArrayInvalid), protos).Count, Is.EqualTo(2)); + Assert.That(protoMan.ValidateStaticFields(typeof(ProtoIdTestInvalid), protos).Count, Is.EqualTo(1)); + Assert.That(protoMan.ValidateStaticFields(typeof(ProtoIdArrayInvalid), protos).Count, Is.EqualTo(2)); + Assert.That(protoMan.ValidateStaticFields(typeof(ProtoIdListInvalid), protos).Count, Is.EqualTo(2)); + Assert.That(protoMan.ValidateStaticFields(typeof(ProtoIdSetInvalid), protos).Count, Is.EqualTo(2)); + Assert.That(protoMan.ValidateStaticFields(typeof(PrivateProtoIdArrayInvalid), protos).Count, Is.EqualTo(2)); + + await pair.CleanReturnAsync(); + } + + [TestPrototypes] + private const string TestPrototypes = @" +- type: entity + id: StaticFieldTestEnt + +- type: Tag + id: StaticFieldTestTag +"; + + [Reflect(false)] private sealed class StringValid + { + [ValidatePrototypeId] public static string Tag = "StaticFieldTestTag"; + } + + [Reflect(false)] private sealed class StringInvalid + { + [ValidatePrototypeId] public static string Tag = string.Empty; + } + + [Reflect(false)] private sealed class StringArrayValid + { + [ValidatePrototypeId] public static string[] Tag = {"StaticFieldTestTag", "StaticFieldTestTag"}; + } + + [Reflect(false)] private sealed class StringArrayInvalid + { + [ValidatePrototypeId] public static string[] Tag = {string.Empty, "StaticFieldTestTag", string.Empty}; + } + + [Reflect(false)] private sealed class EntProtoIdValid + { + public static EntProtoId Tag = "StaticFieldTestEnt"; + } + + [Reflect(false)] private sealed class EntProtoIdInvalid + { + public static EntProtoId Tag = string.Empty; + } + + [Reflect(false)] private sealed class EntProtoIdArrayValid + { + public static EntProtoId[] Tag = {"StaticFieldTestEnt", "StaticFieldTestEnt"}; + } + + [Reflect(false)] private sealed class EntProtoIdArrayInvalid + { + public static EntProtoId[] Tag = {string.Empty, "StaticFieldTestEnt", string.Empty}; + } + + [Reflect(false)] private sealed class ProtoIdTestValid + { + public static ProtoId Tag = "StaticFieldTestTag"; + } + + [Reflect(false)] private sealed class ProtoIdTestInvalid + { + public static ProtoId Tag = string.Empty; + } + + [Reflect(false)] private sealed class ProtoIdArrayValid + { + public static ProtoId[] Tag = {"StaticFieldTestTag", "StaticFieldTestTag"}; + } + + [Reflect(false)] private sealed class ProtoIdArrayInvalid + { + public static ProtoId[] Tag = {string.Empty, "StaticFieldTestTag", string.Empty}; + } + + [Reflect(false)] private sealed class ProtoIdListValid + { + public static List> Tag = new() {"StaticFieldTestTag", "StaticFieldTestTag"}; + } + + [Reflect(false)] private sealed class ProtoIdListInvalid + { + public static List> Tag = new() {string.Empty, "StaticFieldTestTag", string.Empty}; + } + + [Reflect(false)] private sealed class ProtoIdSetValid + { + public static HashSet> Tag = new() {"StaticFieldTestTag", "StaticFieldTestTag"}; + } + + [Reflect(false)] private sealed class ProtoIdSetInvalid + { + public static HashSet> Tag = new() {string.Empty, "StaticFieldTestTag", string.Empty, " "}; + } + + [Reflect(false)] private sealed class PrivateProtoIdArrayValid + { + private static ProtoId[] Tag = {"StaticFieldTestTag", "StaticFieldTestTag"}; + } + + [Reflect(false)] private sealed class PrivateProtoIdArrayInvalid + { + private static ProtoId[] Tag = {string.Empty, "StaticFieldTestTag", string.Empty}; + } +} diff --git a/Content.IntegrationTests/Tests/Power/PowerTest.cs b/Content.IntegrationTests/Tests/Power/PowerTest.cs index d4e2cde9b0d..a6af3e6a65b 100644 --- a/Content.IntegrationTests/Tests/Power/PowerTest.cs +++ b/Content.IntegrationTests/Tests/Power/PowerTest.cs @@ -176,16 +176,18 @@ await server.WaitAssertion(() => var map = mapManager.CreateMap(); var grid = mapManager.CreateGrid(map); + var gridOwner = grid.Owner; + // Power only works when anchored for (var i = 0; i < 3; i++) { grid.SetTile(new Vector2i(0, i), new Tile(1)); - entityManager.SpawnEntity("CableHV", grid.ToCoordinates(0, i)); + entityManager.SpawnEntity("CableHV", gridOwner.ToCoordinates(0, i)); } - var generatorEnt = entityManager.SpawnEntity("GeneratorDummy", grid.ToCoordinates()); - var consumerEnt1 = entityManager.SpawnEntity("ConsumerDummy", grid.ToCoordinates(0, 1)); - var consumerEnt2 = entityManager.SpawnEntity("ConsumerDummy", grid.ToCoordinates(0, 2)); + var generatorEnt = entityManager.SpawnEntity("GeneratorDummy", gridOwner.ToCoordinates()); + var consumerEnt1 = entityManager.SpawnEntity("ConsumerDummy", gridOwner.ToCoordinates(0, 1)); + var consumerEnt2 = entityManager.SpawnEntity("ConsumerDummy", gridOwner.ToCoordinates(0, 2)); supplier = entityManager.GetComponent(generatorEnt); consumer1 = entityManager.GetComponent(consumerEnt1); @@ -237,16 +239,18 @@ await server.WaitAssertion(() => var map = mapManager.CreateMap(); var grid = mapManager.CreateGrid(map); + var gridOwner = grid.Owner; + // Power only works when anchored for (var i = 0; i < 3; i++) { grid.SetTile(new Vector2i(0, i), new Tile(1)); - entityManager.SpawnEntity("CableHV", grid.ToCoordinates(0, i)); + entityManager.SpawnEntity("CableHV", gridOwner.ToCoordinates(0, i)); } - var generatorEnt = entityManager.SpawnEntity("GeneratorDummy", grid.ToCoordinates()); - var consumerEnt1 = entityManager.SpawnEntity("ConsumerDummy", grid.ToCoordinates(0, 1)); - var consumerEnt2 = entityManager.SpawnEntity("ConsumerDummy", grid.ToCoordinates(0, 2)); + var generatorEnt = entityManager.SpawnEntity("GeneratorDummy", gridOwner.ToCoordinates()); + var consumerEnt1 = entityManager.SpawnEntity("ConsumerDummy", gridOwner.ToCoordinates(0, 1)); + var consumerEnt2 = entityManager.SpawnEntity("ConsumerDummy", gridOwner.ToCoordinates(0, 2)); supplier = entityManager.GetComponent(generatorEnt); consumer1 = entityManager.GetComponent(consumerEnt1); @@ -292,16 +296,17 @@ await server.WaitAssertion(() => { var map = mapManager.CreateMap(); var grid = mapManager.CreateGrid(map); + var gridOwner = grid.Owner; // Power only works when anchored for (var i = 0; i < 3; i++) { grid.SetTile(new Vector2i(0, i), new Tile(1)); - entityManager.SpawnEntity("CableHV", grid.ToCoordinates(0, i)); + entityManager.SpawnEntity("CableHV", gridOwner.ToCoordinates(0, i)); } - var generatorEnt = entityManager.SpawnEntity("GeneratorDummy", grid.ToCoordinates()); - var consumerEnt = entityManager.SpawnEntity("ConsumerDummy", grid.ToCoordinates(0, 2)); + var generatorEnt = entityManager.SpawnEntity("GeneratorDummy", gridOwner.ToCoordinates()); + var consumerEnt = entityManager.SpawnEntity("ConsumerDummy", gridOwner.ToCoordinates(0, 2)); supplier = entityManager.GetComponent(generatorEnt); consumer = entityManager.GetComponent(consumerEnt); @@ -383,16 +388,17 @@ await server.WaitAssertion(() => { var map = mapManager.CreateMap(); var grid = mapManager.CreateGrid(map); + var gridOwner = grid.Owner; // Power only works when anchored for (var i = 0; i < 3; i++) { grid.SetTile(new Vector2i(0, i), new Tile(1)); - entityManager.SpawnEntity("CableHV", grid.ToCoordinates(0, i)); + entityManager.SpawnEntity("CableHV", gridOwner.ToCoordinates(0, i)); } - var generatorEnt = entityManager.SpawnEntity("DischargingBatteryDummy", grid.ToCoordinates()); - var consumerEnt = entityManager.SpawnEntity("ConsumerDummy", grid.ToCoordinates(0, 2)); + var generatorEnt = entityManager.SpawnEntity("DischargingBatteryDummy", gridOwner.ToCoordinates()); + var consumerEnt = entityManager.SpawnEntity("ConsumerDummy", gridOwner.ToCoordinates(0, 2)); netBattery = entityManager.GetComponent(generatorEnt); battery = entityManager.GetComponent(generatorEnt); @@ -486,17 +492,18 @@ await server.WaitAssertion(() => { var map = mapManager.CreateMap(); var grid = mapManager.CreateGrid(map); + var gridOwner = grid.Owner; // Power only works when anchored for (var i = 0; i < 3; i++) { grid.SetTile(new Vector2i(0, i), new Tile(1)); - entityManager.SpawnEntity("CableHV", grid.ToCoordinates(0, i)); + entityManager.SpawnEntity("CableHV", gridOwner.ToCoordinates(0, i)); } - var generatorEnt = entityManager.SpawnEntity("GeneratorDummy", grid.ToCoordinates()); - var consumerEnt = entityManager.SpawnEntity("ConsumerDummy", grid.ToCoordinates(0, 1)); - var batteryEnt = entityManager.SpawnEntity("DischargingBatteryDummy", grid.ToCoordinates(0, 2)); + var generatorEnt = entityManager.SpawnEntity("GeneratorDummy", gridOwner.ToCoordinates()); + var consumerEnt = entityManager.SpawnEntity("ConsumerDummy", gridOwner.ToCoordinates(0, 1)); + var batteryEnt = entityManager.SpawnEntity("DischargingBatteryDummy", gridOwner.ToCoordinates(0, 2)); netBattery = entityManager.GetComponent(batteryEnt); battery = entityManager.GetComponent(batteryEnt); supplier = entityManager.GetComponent(generatorEnt); @@ -577,16 +584,17 @@ await server.WaitAssertion(() => { var map = mapManager.CreateMap(); var grid = mapManager.CreateGrid(map); + var gridOwner = grid.Owner; // Power only works when anchored for (var i = 0; i < 3; i++) { grid.SetTile(new Vector2i(0, i), new Tile(1)); - entityManager.SpawnEntity("CableHV", grid.ToCoordinates(0, i)); + entityManager.SpawnEntity("CableHV", gridOwner.ToCoordinates(0, i)); } - var generatorEnt = entityManager.SpawnEntity("GeneratorDummy", grid.ToCoordinates()); - var batteryEnt = entityManager.SpawnEntity("ChargingBatteryDummy", grid.ToCoordinates(0, 2)); + var generatorEnt = entityManager.SpawnEntity("GeneratorDummy", gridOwner.ToCoordinates()); + var batteryEnt = entityManager.SpawnEntity("ChargingBatteryDummy", gridOwner.ToCoordinates(0, 2)); supplier = entityManager.GetComponent(generatorEnt); var netBattery = entityManager.GetComponent(batteryEnt); @@ -635,20 +643,21 @@ await server.WaitAssertion(() => { var map = mapManager.CreateMap(); var grid = mapManager.CreateGrid(map); + var gridOwner = grid.Owner; // Power only works when anchored for (var i = 0; i < 4; i++) { grid.SetTile(new Vector2i(0, i), new Tile(1)); - entityManager.SpawnEntity("CableHV", grid.ToCoordinates(0, i)); + entityManager.SpawnEntity("CableHV", gridOwner.ToCoordinates(0, i)); } - var terminal = entityManager.SpawnEntity("CableTerminal", grid.ToCoordinates(0, 1)); + var terminal = entityManager.SpawnEntity("CableTerminal", gridOwner.ToCoordinates(0, 1)); entityManager.GetComponent(terminal).LocalRotation = Angle.FromDegrees(180); - var batteryEnt = entityManager.SpawnEntity("FullBatteryDummy", grid.ToCoordinates(0, 2)); - var supplyEnt = entityManager.SpawnEntity("GeneratorDummy", grid.ToCoordinates(0, 0)); - var consumerEnt = entityManager.SpawnEntity("ConsumerDummy", grid.ToCoordinates(0, 3)); + var batteryEnt = entityManager.SpawnEntity("FullBatteryDummy", gridOwner.ToCoordinates(0, 2)); + var supplyEnt = entityManager.SpawnEntity("GeneratorDummy", gridOwner.ToCoordinates(0, 0)); + var consumerEnt = entityManager.SpawnEntity("ConsumerDummy", gridOwner.ToCoordinates(0, 3)); consumer = entityManager.GetComponent(consumerEnt); supplier = entityManager.GetComponent(supplyEnt); @@ -712,20 +721,21 @@ await server.WaitAssertion(() => { var map = mapManager.CreateMap(); var grid = mapManager.CreateGrid(map); + var gridOwner = grid.Owner; // Power only works when anchored for (var i = 0; i < 4; i++) { grid.SetTile(new Vector2i(0, i), new Tile(1)); - entityManager.SpawnEntity("CableHV", grid.ToCoordinates(0, i)); + entityManager.SpawnEntity("CableHV", gridOwner.ToCoordinates(0, i)); } - var terminal = entityManager.SpawnEntity("CableTerminal", grid.ToCoordinates(0, 1)); + var terminal = entityManager.SpawnEntity("CableTerminal", gridOwner.ToCoordinates(0, 1)); entityManager.GetComponent(terminal).LocalRotation = Angle.FromDegrees(180); - var batteryEnt = entityManager.SpawnEntity("FullBatteryDummy", grid.ToCoordinates(0, 2)); - var supplyEnt = entityManager.SpawnEntity("GeneratorDummy", grid.ToCoordinates(0, 0)); - var consumerEnt = entityManager.SpawnEntity("ConsumerDummy", grid.ToCoordinates(0, 3)); + var batteryEnt = entityManager.SpawnEntity("FullBatteryDummy", gridOwner.ToCoordinates(0, 2)); + var supplyEnt = entityManager.SpawnEntity("GeneratorDummy", gridOwner.ToCoordinates(0, 0)); + var consumerEnt = entityManager.SpawnEntity("ConsumerDummy", gridOwner.ToCoordinates(0, 3)); consumer = entityManager.GetComponent(consumerEnt); supplier = entityManager.GetComponent(supplyEnt); @@ -787,6 +797,7 @@ await server.WaitAssertion(() => { var map = mapManager.CreateMap(); var grid = mapManager.CreateGrid(map); + var gridOwner = grid.Owner; // Map layout here is // C - consumer @@ -800,18 +811,18 @@ await server.WaitAssertion(() => for (var i = 0; i < 5; i++) { grid.SetTile(new Vector2i(0, i), new Tile(1)); - entityManager.SpawnEntity("CableHV", grid.ToCoordinates(0, i)); + entityManager.SpawnEntity("CableHV", gridOwner.ToCoordinates(0, i)); } - entityManager.SpawnEntity("CableTerminal", grid.ToCoordinates(0, 2)); - var terminal = entityManager.SpawnEntity("CableTerminal", grid.ToCoordinates(0, 2)); + entityManager.SpawnEntity("CableTerminal", gridOwner.ToCoordinates(0, 2)); + var terminal = entityManager.SpawnEntity("CableTerminal", gridOwner.ToCoordinates(0, 2)); entityManager.GetComponent(terminal).LocalRotation = Angle.FromDegrees(180); - var batteryEnt1 = entityManager.SpawnEntity("FullBatteryDummy", grid.ToCoordinates(0, 1)); - var batteryEnt2 = entityManager.SpawnEntity("FullBatteryDummy", grid.ToCoordinates(0, 3)); - var supplyEnt = entityManager.SpawnEntity("GeneratorDummy", grid.ToCoordinates(0, 2)); - var consumerEnt1 = entityManager.SpawnEntity("ConsumerDummy", grid.ToCoordinates(0, 0)); - var consumerEnt2 = entityManager.SpawnEntity("ConsumerDummy", grid.ToCoordinates(0, 4)); + var batteryEnt1 = entityManager.SpawnEntity("FullBatteryDummy", gridOwner.ToCoordinates(0, 1)); + var batteryEnt2 = entityManager.SpawnEntity("FullBatteryDummy", gridOwner.ToCoordinates(0, 3)); + var supplyEnt = entityManager.SpawnEntity("GeneratorDummy", gridOwner.ToCoordinates(0, 2)); + var consumerEnt1 = entityManager.SpawnEntity("ConsumerDummy", gridOwner.ToCoordinates(0, 0)); + var consumerEnt2 = entityManager.SpawnEntity("ConsumerDummy", gridOwner.ToCoordinates(0, 4)); consumer1 = entityManager.GetComponent(consumerEnt1); consumer2 = entityManager.GetComponent(consumerEnt2); @@ -888,6 +899,7 @@ await server.WaitAssertion(() => { var map = mapManager.CreateMap(); var grid = mapManager.CreateGrid(map); + var gridOwner = grid.Owner; // Layout is two generators, two batteries, and one load. As to why two: because previously this test // would fail ONLY if there were more than two batteries present, because each of them tries to supply @@ -900,16 +912,16 @@ await server.WaitAssertion(() => for (var i = -2; i <= 2; i++) { grid.SetTile(new Vector2i(0, i), new Tile(1)); - entityManager.SpawnEntity("CableHV", grid.ToCoordinates(0, i)); + entityManager.SpawnEntity("CableHV", gridOwner.ToCoordinates(0, i)); } - var batteryEnt1 = entityManager.SpawnEntity("FullBatteryDummy", grid.ToCoordinates(0, 2)); - var batteryEnt2 = entityManager.SpawnEntity("FullBatteryDummy", grid.ToCoordinates(0, -2)); + var batteryEnt1 = entityManager.SpawnEntity("FullBatteryDummy", gridOwner.ToCoordinates(0, 2)); + var batteryEnt2 = entityManager.SpawnEntity("FullBatteryDummy", gridOwner.ToCoordinates(0, -2)); - var supplyEnt1 = entityManager.SpawnEntity("GeneratorDummy", grid.ToCoordinates(0, 1)); - var supplyEnt2 = entityManager.SpawnEntity("GeneratorDummy", grid.ToCoordinates(0, -1)); + var supplyEnt1 = entityManager.SpawnEntity("GeneratorDummy", gridOwner.ToCoordinates(0, 1)); + var supplyEnt2 = entityManager.SpawnEntity("GeneratorDummy", gridOwner.ToCoordinates(0, -1)); - var consumerEnt = entityManager.SpawnEntity("ConsumerDummy", grid.ToCoordinates(0, 0)); + var consumerEnt = entityManager.SpawnEntity("ConsumerDummy", gridOwner.ToCoordinates(0, 0)); consumer = entityManager.GetComponent(consumerEnt); supplier1 = entityManager.GetComponent(supplyEnt1); @@ -981,6 +993,7 @@ await server.WaitAssertion(() => { var map = mapManager.CreateMap(); var grid = mapManager.CreateGrid(map); + var gridOwner = grid.Owner; // Map layout here is // C - consumer @@ -994,18 +1007,18 @@ await server.WaitAssertion(() => for (var i = 0; i < 5; i++) { grid.SetTile(new Vector2i(0, i), new Tile(1)); - entityManager.SpawnEntity("CableHV", grid.ToCoordinates(0, i)); + entityManager.SpawnEntity("CableHV", gridOwner.ToCoordinates(0, i)); } - entityManager.SpawnEntity("CableTerminal", grid.ToCoordinates(0, 2)); - var terminal = entityManager.SpawnEntity("CableTerminal", grid.ToCoordinates(0, 2)); + entityManager.SpawnEntity("CableTerminal", gridOwner.ToCoordinates(0, 2)); + var terminal = entityManager.SpawnEntity("CableTerminal", gridOwner.ToCoordinates(0, 2)); entityManager.GetComponent(terminal).LocalRotation = Angle.FromDegrees(180); - var batteryEnt1 = entityManager.SpawnEntity("FullBatteryDummy", grid.ToCoordinates(0, 1)); - var batteryEnt2 = entityManager.SpawnEntity("FullBatteryDummy", grid.ToCoordinates(0, 3)); - var supplyEnt = entityManager.SpawnEntity("GeneratorDummy", grid.ToCoordinates(0, 2)); - var consumerEnt1 = entityManager.SpawnEntity("ConsumerDummy", grid.ToCoordinates(0, 0)); - var consumerEnt2 = entityManager.SpawnEntity("ConsumerDummy", grid.ToCoordinates(0, 4)); + var batteryEnt1 = entityManager.SpawnEntity("FullBatteryDummy", gridOwner.ToCoordinates(0, 1)); + var batteryEnt2 = entityManager.SpawnEntity("FullBatteryDummy", gridOwner.ToCoordinates(0, 3)); + var supplyEnt = entityManager.SpawnEntity("GeneratorDummy", gridOwner.ToCoordinates(0, 2)); + var consumerEnt1 = entityManager.SpawnEntity("ConsumerDummy", gridOwner.ToCoordinates(0, 0)); + var consumerEnt2 = entityManager.SpawnEntity("ConsumerDummy", gridOwner.ToCoordinates(0, 4)); consumer1 = entityManager.GetComponent(consumerEnt1); consumer2 = entityManager.GetComponent(consumerEnt2); @@ -1068,20 +1081,21 @@ await server.WaitPost(() => { var map = mapManager.CreateMap(); var grid = mapManager.CreateGrid(map); + var gridOwner = grid.Owner; // Power only works when anchored for (var i = 0; i < 4; i++) { grid.SetTile(new Vector2i(0, i), new Tile(1)); - entityManager.SpawnEntity("CableHV", grid.ToCoordinates(0, i)); + entityManager.SpawnEntity("CableHV", gridOwner.ToCoordinates(0, i)); } - var terminal = entityManager.SpawnEntity("CableTerminal", grid.ToCoordinates(0, 1)); + var terminal = entityManager.SpawnEntity("CableTerminal", gridOwner.ToCoordinates(0, 1)); entityManager.GetComponent(terminal).LocalRotation = Angle.FromDegrees(180); - var batteryEnt = entityManager.SpawnEntity("FullBatteryDummy", grid.ToCoordinates(0, 2)); - var supplyEnt = entityManager.SpawnEntity("GeneratorDummy", grid.ToCoordinates(0, 0)); - var consumerEnt = entityManager.SpawnEntity("ConsumerDummy", grid.ToCoordinates(0, 3)); + var batteryEnt = entityManager.SpawnEntity("FullBatteryDummy", gridOwner.ToCoordinates(0, 2)); + var supplyEnt = entityManager.SpawnEntity("GeneratorDummy", gridOwner.ToCoordinates(0, 0)); + var consumerEnt = entityManager.SpawnEntity("ConsumerDummy", gridOwner.ToCoordinates(0, 3)); consumer = entityManager.GetComponent(consumerEnt); supplier = entityManager.GetComponent(supplyEnt); @@ -1153,6 +1167,7 @@ await server.WaitAssertion(() => { var map = mapManager.CreateMap(); var grid = mapManager.CreateGrid(map); + var gridOwner = grid.Owner; // Power only works when anchored for (var i = 0; i < 4; i++) @@ -1160,15 +1175,15 @@ await server.WaitAssertion(() => grid.SetTile(new Vector2i(0, i), new Tile(1)); } - var leftEnt = entityManager.SpawnEntity("CableHV", grid.ToCoordinates(0, 0)); - entityManager.SpawnEntity("CableHV", grid.ToCoordinates(0, 1)); - entityManager.SpawnEntity("CableHV", grid.ToCoordinates(0, 2)); - var rightEnt = entityManager.SpawnEntity("CableHV", grid.ToCoordinates(0, 3)); + var leftEnt = entityManager.SpawnEntity("CableHV", gridOwner.ToCoordinates(0, 0)); + entityManager.SpawnEntity("CableHV", gridOwner.ToCoordinates(0, 1)); + entityManager.SpawnEntity("CableHV", gridOwner.ToCoordinates(0, 2)); + var rightEnt = entityManager.SpawnEntity("CableHV", gridOwner.ToCoordinates(0, 3)); - var terminal = entityManager.SpawnEntity("CableTerminal", grid.ToCoordinates(0, 1)); + var terminal = entityManager.SpawnEntity("CableTerminal", gridOwner.ToCoordinates(0, 1)); entityManager.GetComponent(terminal).LocalRotation = Angle.FromDegrees(180); - var battery = entityManager.SpawnEntity("FullBatteryDummy", grid.ToCoordinates(0, 2)); + var battery = entityManager.SpawnEntity("FullBatteryDummy", gridOwner.ToCoordinates(0, 2)); var batteryNodeContainer = entityManager.GetComponent(battery); if (nodeContainer.TryGetNode(entityManager.GetComponent(leftEnt), @@ -1216,6 +1231,7 @@ await server.WaitAssertion(() => { var map = mapManager.CreateMap(); var grid = mapManager.CreateGrid(map); + var gridOwner = grid.Owner; // Power only works when anchored for (var i = 0; i < 3; i++) @@ -1223,14 +1239,14 @@ await server.WaitAssertion(() => grid.SetTile(new Vector2i(0, i), new Tile(1)); } - entityManager.SpawnEntity("CableHV", grid.ToCoordinates(0, 0)); - entityManager.SpawnEntity("CableHV", grid.ToCoordinates(0, 1)); - entityManager.SpawnEntity("CableMV", grid.ToCoordinates(0, 1)); - entityManager.SpawnEntity("CableMV", grid.ToCoordinates(0, 2)); + entityManager.SpawnEntity("CableHV", gridOwner.ToCoordinates(0, 0)); + entityManager.SpawnEntity("CableHV", gridOwner.ToCoordinates(0, 1)); + entityManager.SpawnEntity("CableMV", gridOwner.ToCoordinates(0, 1)); + entityManager.SpawnEntity("CableMV", gridOwner.ToCoordinates(0, 2)); - var generatorEnt = entityManager.SpawnEntity("GeneratorDummy", grid.ToCoordinates(0, 0)); - var substationEnt = entityManager.SpawnEntity("SubstationDummy", grid.ToCoordinates(0, 1)); - var apcEnt = entityManager.SpawnEntity("ApcDummy", grid.ToCoordinates(0, 2)); + var generatorEnt = entityManager.SpawnEntity("GeneratorDummy", gridOwner.ToCoordinates(0, 0)); + var substationEnt = entityManager.SpawnEntity("SubstationDummy", gridOwner.ToCoordinates(0, 1)); + var apcEnt = entityManager.SpawnEntity("ApcDummy", gridOwner.ToCoordinates(0, 2)); var generatorSupplier = entityManager.GetComponent(generatorEnt); substationNetBattery = entityManager.GetComponent(substationEnt); @@ -1273,6 +1289,7 @@ await server.WaitAssertion(() => { var map = mapManager.CreateMap(); var grid = mapManager.CreateGrid(map); + var gridOwner = grid.Owner; const int range = 5; @@ -1282,15 +1299,15 @@ await server.WaitAssertion(() => grid.SetTile(new Vector2i(0, i), new Tile(1)); } - var apcEnt = entityManager.SpawnEntity("ApcDummy", grid.ToCoordinates(0, 0)); - var apcExtensionEnt = entityManager.SpawnEntity("CableApcExtension", grid.ToCoordinates(0, 0)); + var apcEnt = entityManager.SpawnEntity("ApcDummy", gridOwner.ToCoordinates(0, 0)); + var apcExtensionEnt = entityManager.SpawnEntity("CableApcExtension", gridOwner.ToCoordinates(0, 0)); // Create a powered receiver in range (range is 0 indexed) - var powerReceiverEnt = entityManager.SpawnEntity("ApcPowerReceiverDummy", grid.ToCoordinates(0, range - 1)); + var powerReceiverEnt = entityManager.SpawnEntity("ApcPowerReceiverDummy", gridOwner.ToCoordinates(0, range - 1)); receiver = entityManager.GetComponent(powerReceiverEnt); // Create an unpowered receiver outside range - var unpoweredReceiverEnt = entityManager.SpawnEntity("ApcPowerReceiverDummy", grid.ToCoordinates(0, range)); + var unpoweredReceiverEnt = entityManager.SpawnEntity("ApcPowerReceiverDummy", gridOwner.ToCoordinates(0, range)); unpoweredReceiver = entityManager.GetComponent(unpoweredReceiverEnt); var battery = entityManager.GetComponent(apcEnt); diff --git a/Content.IntegrationTests/Tests/Preferences/ServerDbSqliteTests.cs b/Content.IntegrationTests/Tests/Preferences/ServerDbSqliteTests.cs index 2845e451470..b4417200242 100644 --- a/Content.IntegrationTests/Tests/Preferences/ServerDbSqliteTests.cs +++ b/Content.IntegrationTests/Tests/Preferences/ServerDbSqliteTests.cs @@ -41,6 +41,8 @@ private static HumanoidCharacterProfile CharlieCharlieson() "Charlie Charlieson", "The biggest boy around.", "Human", + 1, + 1, 21, Sex.Male, Gender.Epicene, diff --git a/Content.IntegrationTests/Tests/PrototypeSaveTest.cs b/Content.IntegrationTests/Tests/PrototypeSaveTest.cs index 6096c497efa..9e26fa5eaa2 100644 --- a/Content.IntegrationTests/Tests/PrototypeSaveTest.cs +++ b/Content.IntegrationTests/Tests/PrototypeSaveTest.cs @@ -38,31 +38,15 @@ public async Task UninitializedSaveTest() var mapManager = server.ResolveDependency(); var entityMan = server.ResolveDependency(); var prototypeMan = server.ResolveDependency(); - var tileDefinitionManager = server.ResolveDependency(); var seriMan = server.ResolveDependency(); var compFact = server.ResolveDependency(); var prototypes = new List(); - MapGridComponent grid = default!; EntityUid uid; - MapId mapId = default; - //Build up test environment - await server.WaitPost(() => - { - // Create a one tile grid to stave off the grid 0 monsters - mapId = mapManager.CreateMap(); - - mapManager.AddUninitializedMap(mapId); - - grid = mapManager.CreateGrid(mapId); - - var tileDefinition = tileDefinitionManager["FloorSteel"]; // Wires n such disable ambiance while under the floor - var tile = new Tile(tileDefinition.TileId); - var coordinates = grid.ToCoordinates(); - - grid.SetTile(coordinates, tile); - }); + await pair.CreateTestMap(false, "FloorSteel"); // Wires n such disable ambiance while under the floor + var mapId = pair.TestMap.MapId; + var grid = pair.TestMap.Grid; await server.WaitRunTicks(5); @@ -94,7 +78,7 @@ await server.WaitPost(() => await server.WaitAssertion(() => { Assert.That(!mapManager.IsMapInitialized(mapId)); - var testLocation = grid.ToCoordinates(); + var testLocation = grid.Owner.ToCoordinates(); Assert.Multiple(() => { diff --git a/Content.IntegrationTests/Tests/Puller/PullerTest.cs b/Content.IntegrationTests/Tests/Puller/PullerTest.cs index ba91f54ff77..87d174f7272 100644 --- a/Content.IntegrationTests/Tests/Puller/PullerTest.cs +++ b/Content.IntegrationTests/Tests/Puller/PullerTest.cs @@ -1,6 +1,6 @@ using Content.Shared.Hands.Components; +using Content.Shared.Movement.Pulling.Components; using Content.Shared.Prototypes; -using Content.Shared.Pulling.Components; using Robust.Shared.GameObjects; using Robust.Shared.Prototypes; @@ -29,7 +29,7 @@ await server.WaitAssertion(() => { foreach (var proto in protoManager.EnumeratePrototypes()) { - if (!proto.TryGetComponent(out SharedPullerComponent? puller)) + if (!proto.TryGetComponent(out PullerComponent? puller)) continue; if (!puller.NeedsHands) diff --git a/Content.IntegrationTests/Tests/Shuttle/DockTest.cs b/Content.IntegrationTests/Tests/Shuttle/DockTest.cs index b6fc273570a..a1aa462a697 100644 --- a/Content.IntegrationTests/Tests/Shuttle/DockTest.cs +++ b/Content.IntegrationTests/Tests/Shuttle/DockTest.cs @@ -39,7 +39,7 @@ public async Task TestDockingConfig(Vector2 dock1Pos, Vector2 dock2Pos, Angle do await server.WaitAssertion(() => { - entManager.DeleteEntity(map.GridUid); + entManager.DeleteEntity(map.Grid); var grid1 = mapManager.CreateGridEntity(mapId); var grid2 = mapManager.CreateGridEntity(mapId); var grid1Ent = grid1.Owner; @@ -104,7 +104,7 @@ public async Task TestPlanetDock() // Spawn shuttle and affirm no valid docks. await server.WaitAssertion(() => { - entManager.DeleteEntity(map.GridUid); + entManager.DeleteEntity(map.Grid); Assert.That(entManager.System().TryLoad(otherMap.MapId, "/Maps/Shuttles/emergency.yml", out var rootUids)); shuttle = rootUids[0]; diff --git a/Content.IntegrationTests/Tests/Tiles/TileConstructionTests.cs b/Content.IntegrationTests/Tests/Tiles/TileConstructionTests.cs index 0a2af88887a..083e817d697 100644 --- a/Content.IntegrationTests/Tests/Tiles/TileConstructionTests.cs +++ b/Content.IntegrationTests/Tests/Tiles/TileConstructionTests.cs @@ -37,7 +37,7 @@ public async Task CutThenPlaceLatticeNewGrid() // Remove grid await SetTile(null); await SetTile(null, PlayerCoords); - Assert.That(MapData.MapGrid.Deleted); + Assert.That(MapData.Grid.Comp.Deleted); AssertGridCount(0); // Place Lattice @@ -70,7 +70,7 @@ public async Task FloorConstructDeconstruct() // Remove grid await SetTile(null); await SetTile(null, PlayerCoords); - Assert.That(MapData.MapGrid.Deleted); + Assert.That(MapData.Grid.Comp.Deleted); AssertGridCount(0); // Space -> Lattice diff --git a/Content.Packaging/ClientPackaging.cs b/Content.Packaging/ClientPackaging.cs index a989ebd968e..a66d4ec5b91 100644 --- a/Content.Packaging/ClientPackaging.cs +++ b/Content.Packaging/ClientPackaging.cs @@ -13,7 +13,7 @@ public static class ClientPackaging /// /// Be advised this can be called from server packaging during a HybridACZ build. /// - public static async Task PackageClient(bool skipBuild, IPackageLogger logger) + public static async Task PackageClient(bool skipBuild, string configuration, IPackageLogger logger) { logger.Info("Building client..."); @@ -26,7 +26,7 @@ await ProcessHelpers.RunCheck(new ProcessStartInfo { "build", Path.Combine("Content.Client", "Content.Client.csproj"), - "-c", "Release", + "-c", configuration, "--nologo", "/v:m", "/t:Rebuild", diff --git a/Content.Packaging/CommandLineArgs.cs b/Content.Packaging/CommandLineArgs.cs index 9f2b0755357..23f661921e0 100644 --- a/Content.Packaging/CommandLineArgs.cs +++ b/Content.Packaging/CommandLineArgs.cs @@ -31,6 +31,11 @@ public sealed class CommandLineArgs /// public bool HybridAcz { get; set; } + /// + /// Configuration used for when packaging the server. (Release, Debug, Tools) + /// + public string Configuration { get; set; } + // CommandLineArgs, 3rd of her name. public static bool TryParse(IReadOnlyList args, [NotNullWhen(true)] out CommandLineArgs? parsed) { @@ -39,6 +44,7 @@ public static bool TryParse(IReadOnlyList args, [NotNullWhen(true)] out var skipBuild = false; var wipeRelease = true; var hybridAcz = false; + var configuration = "Release"; List? platforms = null; using var enumerator = args.GetEnumerator(); @@ -89,6 +95,16 @@ public static bool TryParse(IReadOnlyList args, [NotNullWhen(true)] out platforms ??= new List(); platforms.Add(enumerator.Current); } + else if (arg == "--configuration") + { + if (!enumerator.MoveNext()) + { + Console.WriteLine("No configuration provided"); + return false; + } + + configuration = enumerator.Current; + } else if (arg == "--help") { PrintHelp(); @@ -106,7 +122,7 @@ public static bool TryParse(IReadOnlyList args, [NotNullWhen(true)] out return false; } - parsed = new CommandLineArgs(client.Value, skipBuild, wipeRelease, hybridAcz, platforms); + parsed = new CommandLineArgs(client.Value, skipBuild, wipeRelease, hybridAcz, platforms, configuration); return true; } @@ -120,6 +136,7 @@ private static void PrintHelp() --no-wipe-release Don't wipe the release folder before creating files. --hybrid-acz Use HybridACZ for server builds. --platform Platform for server builds. Default will output several x64 targets. + --configuration Configuration to use for building the server (Release, Debug, Tools). Default is Release. "); } @@ -128,12 +145,14 @@ private CommandLineArgs( bool skipBuild, bool wipeRelease, bool hybridAcz, - List? platforms) + List? platforms, + string configuration) { Client = client; SkipBuild = skipBuild; WipeRelease = wipeRelease; HybridAcz = hybridAcz; Platforms = platforms; + Configuration = configuration; } } diff --git a/Content.Packaging/Program.cs b/Content.Packaging/Program.cs index ba5924ec3e9..65c0e0131a4 100644 --- a/Content.Packaging/Program.cs +++ b/Content.Packaging/Program.cs @@ -17,11 +17,11 @@ if (parsed.Client) { - await ClientPackaging.PackageClient(parsed.SkipBuild, logger); + await ClientPackaging.PackageClient(parsed.SkipBuild, parsed.Configuration, logger); } else { - await ServerPackaging.PackageServer(parsed.SkipBuild, parsed.HybridAcz, logger, parsed.Platforms); + await ServerPackaging.PackageServer(parsed.SkipBuild, parsed.HybridAcz, logger, parsed.Configuration, parsed.Platforms); } void WipeBin() diff --git a/Content.Packaging/ServerPackaging.cs b/Content.Packaging/ServerPackaging.cs index ba489629f79..d9ca57c4d11 100644 --- a/Content.Packaging/ServerPackaging.cs +++ b/Content.Packaging/ServerPackaging.cs @@ -69,7 +69,7 @@ public static class ServerPackaging "zh-Hant" }; - public static async Task PackageServer(bool skipBuild, bool hybridAcz, IPackageLogger logger, List? platforms = null) + public static async Task PackageServer(bool skipBuild, bool hybridAcz, IPackageLogger logger, string configuration, List? platforms = null) { if (platforms == null) { @@ -82,7 +82,7 @@ public static async Task PackageServer(bool skipBuild, bool hybridAcz, IPackageL // Rather than hosting the client ZIP on the watchdog or on a separate server, // Hybrid ACZ uses the ACZ hosting functionality to host it as part of the status host, // which means that features such as automatic UPnP forwarding still work properly. - await ClientPackaging.PackageClient(skipBuild, logger); + await ClientPackaging.PackageClient(skipBuild, configuration, logger); } // Good variable naming right here. @@ -91,13 +91,13 @@ public static async Task PackageServer(bool skipBuild, bool hybridAcz, IPackageL if (!platforms.Contains(platform.Rid)) continue; - await BuildPlatform(platform, skipBuild, hybridAcz, logger); + await BuildPlatform(platform, skipBuild, hybridAcz, configuration, logger); } } - private static async Task BuildPlatform(PlatformReg platform, bool skipBuild, bool hybridAcz, IPackageLogger logger) + private static async Task BuildPlatform(PlatformReg platform, bool skipBuild, bool hybridAcz, string configuration, IPackageLogger logger) { - logger.Info($"Building project for {platform}..."); + logger.Info($"Building project for {platform.TargetOs}..."); if (!skipBuild) { @@ -108,7 +108,7 @@ await ProcessHelpers.RunCheck(new ProcessStartInfo { "build", Path.Combine("Content.Server", "Content.Server.csproj"), - "-c", "Release", + "-c", configuration, "--nologo", "/v:m", $"/p:TargetOs={platform.TargetOs}", @@ -118,7 +118,7 @@ await ProcessHelpers.RunCheck(new ProcessStartInfo } }); - await PublishClientServer(platform.Rid, platform.TargetOs); + await PublishClientServer(platform.Rid, platform.TargetOs, configuration); } logger.Info($"Packaging {platform.Rid} server..."); @@ -137,7 +137,7 @@ await ProcessHelpers.RunCheck(new ProcessStartInfo logger.Info($"Finished packaging server in {sw.Elapsed}"); } - private static async Task PublishClientServer(string runtime, string targetOs) + private static async Task PublishClientServer(string runtime, string targetOs, string configuration) { await ProcessHelpers.RunCheck(new ProcessStartInfo { @@ -147,7 +147,7 @@ await ProcessHelpers.RunCheck(new ProcessStartInfo "publish", "--runtime", runtime, "--no-self-contained", - "-c", "Release", + "-c", configuration, $"/p:TargetOs={targetOs}", "/p:FullRelease=True", "/m", diff --git a/Content.Server.Database/Migrations/Postgres/20240127102028_Height.Designer.cs b/Content.Server.Database/Migrations/Postgres/20240127102028_Height.Designer.cs new file mode 100644 index 00000000000..6720412dc34 --- /dev/null +++ b/Content.Server.Database/Migrations/Postgres/20240127102028_Height.Designer.cs @@ -0,0 +1,1372 @@ +// +using System; +using System.Net; +using System.Text.Json; +using Content.Server.Database; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Content.Server.Database.Migrations.Postgres +{ + [DbContext(typeof(PostgresServerDbContext))] + [Migration("20230711102742_HeightWidth")] + partial class HeightWidth + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.4") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Content.Server.Database.Admin", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("AdminRankId") + .HasColumnType("integer") + .HasColumnName("admin_rank_id"); + + b.Property("Title") + .HasColumnType("text") + .HasColumnName("title"); + + b.HasKey("UserId") + .HasName("PK_admin"); + + b.HasIndex("AdminRankId") + .HasDatabaseName("IX_admin_admin_rank_id"); + + b.ToTable("admin", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminFlag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("admin_flag_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AdminId") + .HasColumnType("uuid") + .HasColumnName("admin_id"); + + b.Property("Flag") + .IsRequired() + .HasColumnType("text") + .HasColumnName("flag"); + + b.Property("Negative") + .HasColumnType("boolean") + .HasColumnName("negative"); + + b.HasKey("Id") + .HasName("PK_admin_flag"); + + b.HasIndex("AdminId") + .HasDatabaseName("IX_admin_flag_admin_id"); + + b.HasIndex("Flag", "AdminId") + .IsUnique(); + + b.ToTable("admin_flag", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("admin_log_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("RoundId") + .HasColumnType("integer") + .HasColumnName("round_id"); + + b.Property("Date") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Impact") + .HasColumnType("smallint") + .HasColumnName("impact"); + + b.Property("Json") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("json"); + + b.Property("Message") + .IsRequired() + .HasColumnType("text") + .HasColumnName("message"); + + b.Property("Type") + .HasColumnType("integer") + .HasColumnName("type"); + + b.HasKey("Id", "RoundId") + .HasName("PK_admin_log"); + + b.HasIndex("Date"); + + b.HasIndex("Message") + .HasAnnotation("Npgsql:TsVectorConfig", "english"); + + NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("Message"), "GIN"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_admin_log_round_id"); + + b.HasIndex("Type") + .HasDatabaseName("IX_admin_log_type"); + + b.ToTable("admin_log", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLogEntity", b => + { + b.Property("Uid") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("uid"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Uid")); + + b.Property("AdminLogId") + .HasColumnType("integer") + .HasColumnName("admin_log_id"); + + b.Property("AdminLogRoundId") + .HasColumnType("integer") + .HasColumnName("admin_log_round_id"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.HasKey("Uid") + .HasName("PK_admin_log_entity"); + + b.HasIndex("AdminLogId", "AdminLogRoundId") + .HasDatabaseName("IX_admin_log_entity_admin_log_id_admin_log_round_id"); + + b.ToTable("admin_log_entity", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => + { + b.Property("PlayerUserId") + .HasColumnType("uuid") + .HasColumnName("player_user_id"); + + b.Property("LogId") + .HasColumnType("integer") + .HasColumnName("log_id"); + + b.Property("RoundId") + .HasColumnType("integer") + .HasColumnName("round_id"); + + b.HasKey("PlayerUserId", "LogId", "RoundId") + .HasName("PK_admin_log_player"); + + b.HasIndex("LogId", "RoundId"); + + b.ToTable("admin_log_player", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminNote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("admin_notes_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("uuid") + .HasColumnName("created_by_id"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedById") + .HasColumnType("uuid") + .HasColumnName("deleted_by_id"); + + b.Property("LastEditedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("uuid") + .HasColumnName("last_edited_by_id"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(4096) + .HasColumnType("character varying(4096)") + .HasColumnName("message"); + + b.Property("PlayerUserId") + .HasColumnType("uuid") + .HasColumnName("player_user_id"); + + b.Property("RoundId") + .HasColumnType("integer") + .HasColumnName("round_id"); + + b.Property("ShownToPlayer") + .HasColumnType("boolean") + .HasColumnName("shown_to_player"); + + b.HasKey("Id") + .HasName("PK_admin_notes"); + + b.HasIndex("CreatedById"); + + b.HasIndex("DeletedById"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_admin_notes_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_admin_notes_round_id"); + + b.ToTable("admin_notes", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRank", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("admin_rank_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.HasKey("Id") + .HasName("PK_admin_rank"); + + b.ToTable("admin_rank", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("admin_rank_flag_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AdminRankId") + .HasColumnType("integer") + .HasColumnName("admin_rank_id"); + + b.Property("Flag") + .IsRequired() + .HasColumnType("text") + .HasColumnName("flag"); + + b.HasKey("Id") + .HasName("PK_admin_rank_flag"); + + b.HasIndex("AdminRankId"); + + b.HasIndex("Flag", "AdminRankId") + .IsUnique(); + + b.ToTable("admin_rank_flag", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Antag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("antag_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AntagName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("antag_name"); + + b.Property("ProfileId") + .HasColumnType("integer") + .HasColumnName("profile_id"); + + b.HasKey("Id") + .HasName("PK_antag"); + + b.HasIndex("ProfileId", "AntagName") + .IsUnique(); + + b.ToTable("antag", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AssignedUserId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("assigned_user_id_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_name"); + + b.HasKey("Id") + .HasName("PK_assigned_user_id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.HasIndex("UserName") + .IsUnique(); + + b.ToTable("assigned_user_id", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("connection_log_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Address") + .IsRequired() + .HasColumnType("inet") + .HasColumnName("address"); + + b.Property("Denied") + .HasColumnType("smallint") + .HasColumnName("denied"); + + b.Property("HWId") + .HasColumnType("bytea") + .HasColumnName("hwid"); + + b.Property("Time") + .HasColumnType("timestamp with time zone") + .HasColumnName("time"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_name"); + + b.HasKey("Id") + .HasName("PK_connection_log"); + + b.HasIndex("UserId"); + + b.ToTable("connection_log", null, t => + { + t.HasCheckConstraint("AddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= address"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.Job", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("job_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("JobName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("job_name"); + + b.Property("Priority") + .HasColumnType("integer") + .HasColumnName("priority"); + + b.Property("ProfileId") + .HasColumnType("integer") + .HasColumnName("profile_id"); + + b.HasKey("Id") + .HasName("PK_job"); + + b.HasIndex("ProfileId"); + + b.HasIndex("ProfileId", "JobName") + .IsUnique(); + + b.HasIndex(new[] { "ProfileId" }, "IX_job_one_high_priority") + .IsUnique() + .HasFilter("priority = 3"); + + b.ToTable("job", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.PlayTime", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("play_time_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("PlayerId") + .HasColumnType("uuid") + .HasColumnName("player_id"); + + b.Property("TimeSpent") + .HasColumnType("interval") + .HasColumnName("time_spent"); + + b.Property("Tracker") + .IsRequired() + .HasColumnType("text") + .HasColumnName("tracker"); + + b.HasKey("Id") + .HasName("PK_play_time"); + + b.HasIndex("PlayerId", "Tracker") + .IsUnique(); + + b.ToTable("play_time", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Player", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("player_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FirstSeenTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("first_seen_time"); + + b.Property("LastReadRules") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_read_rules"); + + b.Property("LastSeenAddress") + .IsRequired() + .HasColumnType("inet") + .HasColumnName("last_seen_address"); + + b.Property("LastSeenHWId") + .HasColumnType("bytea") + .HasColumnName("last_seen_hwid"); + + b.Property("LastSeenTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_seen_time"); + + b.Property("LastSeenUserName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("last_seen_user_name"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_player"); + + b.HasAlternateKey("UserId") + .HasName("ak_player_user_id"); + + b.HasIndex("LastSeenUserName"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("player", null, t => + { + t.HasCheckConstraint("LastSeenAddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= last_seen_address"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.Preference", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("preference_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AdminOOCColor") + .IsRequired() + .HasColumnType("text") + .HasColumnName("admin_ooc_color"); + + b.Property("SelectedCharacterSlot") + .HasColumnType("integer") + .HasColumnName("selected_character_slot"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_preference"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("preference", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Profile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("profile_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Age") + .HasColumnType("integer") + .HasColumnName("age"); + + b.Property("Backpack") + .IsRequired() + .HasColumnType("text") + .HasColumnName("backpack"); + + b.Property("CharacterName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("char_name"); + + b.Property("Clothing") + .IsRequired() + .HasColumnType("text") + .HasColumnName("clothing"); + + b.Property("EyeColor") + .IsRequired() + .HasColumnType("text") + .HasColumnName("eye_color"); + + b.Property("FacialHairColor") + .IsRequired() + .HasColumnType("text") + .HasColumnName("facial_hair_color"); + + b.Property("FacialHairName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("facial_hair_name"); + + b.Property("FlavorText") + .IsRequired() + .HasColumnType("text") + .HasColumnName("flavor_text"); + + b.Property("Gender") + .IsRequired() + .HasColumnType("text") + .HasColumnName("gender"); + + b.Property("HairColor") + .IsRequired() + .HasColumnType("text") + .HasColumnName("hair_color"); + + b.Property("HairName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("hair_name"); + + b.Property("Height") + .HasColumnType("real") + .HasColumnName("height"); + + b.Property("Width") + .HasColumnType("real") + .HasColumnName("width"); + + b.Property("Markings") + .HasColumnType("jsonb") + .HasColumnName("markings"); + + b.Property("PreferenceId") + .HasColumnType("integer") + .HasColumnName("preference_id"); + + b.Property("PreferenceUnavailable") + .HasColumnType("integer") + .HasColumnName("pref_unavailable"); + + b.Property("Sex") + .IsRequired() + .HasColumnType("text") + .HasColumnName("sex"); + + b.Property("SkinColor") + .IsRequired() + .HasColumnType("text") + .HasColumnName("skin_color"); + + b.Property("Slot") + .HasColumnType("integer") + .HasColumnName("slot"); + + b.Property("Species") + .IsRequired() + .HasColumnType("text") + .HasColumnName("species"); + + b.HasKey("Id") + .HasName("PK_profile"); + + b.HasIndex("PreferenceId") + .HasDatabaseName("IX_profile_preference_id"); + + b.HasIndex("Slot", "PreferenceId") + .IsUnique(); + + b.ToTable("profile", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Round", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("round_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ServerId") + .HasColumnType("integer") + .HasColumnName("server_id"); + + b.HasKey("Id") + .HasName("PK_round"); + + b.HasIndex("ServerId") + .HasDatabaseName("IX_round_server_id"); + + b.ToTable("round", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Server", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("server_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.HasKey("Id") + .HasName("PK_server"); + + b.ToTable("server", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("server_ban_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property?>("Address") + .HasColumnType("inet") + .HasColumnName("address"); + + b.Property("AutoDelete") + .HasColumnType("boolean") + .HasColumnName("auto_delete"); + + b.Property("BanTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("ban_time"); + + b.Property("BanningAdmin") + .HasColumnType("uuid") + .HasColumnName("banning_admin"); + + b.Property("ExemptFlags") + .HasColumnType("integer") + .HasColumnName("exempt_flags"); + + b.Property("ExpirationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("expiration_time"); + + b.Property("HWId") + .HasColumnType("bytea") + .HasColumnName("hwid"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("text") + .HasColumnName("reason"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_server_ban"); + + b.HasIndex("Address"); + + b.HasIndex("UserId"); + + b.ToTable("server_ban", null, t => + { + t.HasCheckConstraint("AddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= address"); + + t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR user_id IS NOT NULL OR hwid IS NOT NULL"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBanExemption", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("Flags") + .HasColumnType("integer") + .HasColumnName("flags"); + + b.HasKey("UserId") + .HasName("PK_server_ban_exemption"); + + b.ToTable("server_ban_exemption", null, t => + { + t.HasCheckConstraint("FlagsNotZero", "flags != 0"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("server_ban_hit_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BanId") + .HasColumnType("integer") + .HasColumnName("ban_id"); + + b.Property("ConnectionId") + .HasColumnType("integer") + .HasColumnName("connection_id"); + + b.HasKey("Id") + .HasName("PK_server_ban_hit"); + + b.HasIndex("BanId") + .HasDatabaseName("IX_server_ban_hit_ban_id"); + + b.HasIndex("ConnectionId") + .HasDatabaseName("IX_server_ban_hit_connection_id"); + + b.ToTable("server_ban_hit", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("server_role_ban_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property?>("Address") + .HasColumnType("inet") + .HasColumnName("address"); + + b.Property("BanTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("ban_time"); + + b.Property("BanningAdmin") + .HasColumnType("uuid") + .HasColumnName("banning_admin"); + + b.Property("ExpirationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("expiration_time"); + + b.Property("HWId") + .HasColumnType("bytea") + .HasColumnName("hwid"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("text") + .HasColumnName("reason"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("role_id"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_server_role_ban"); + + b.HasIndex("Address"); + + b.HasIndex("UserId"); + + b.ToTable("server_role_ban", null, t => + { + t.HasCheckConstraint("AddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= address"); + + t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR user_id IS NOT NULL OR hwid IS NOT NULL"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("role_unban_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BanId") + .HasColumnType("integer") + .HasColumnName("ban_id"); + + b.Property("UnbanTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("unban_time"); + + b.Property("UnbanningAdmin") + .HasColumnType("uuid") + .HasColumnName("unbanning_admin"); + + b.HasKey("Id") + .HasName("PK_server_role_unban"); + + b.HasIndex("BanId") + .IsUnique(); + + b.ToTable("server_role_unban", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ServerUnban", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("unban_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BanId") + .HasColumnType("integer") + .HasColumnName("ban_id"); + + b.Property("UnbanTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("unban_time"); + + b.Property("UnbanningAdmin") + .HasColumnType("uuid") + .HasColumnName("unbanning_admin"); + + b.HasKey("Id") + .HasName("PK_server_unban"); + + b.HasIndex("BanId") + .IsUnique(); + + b.ToTable("server_unban", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Trait", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("trait_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ProfileId") + .HasColumnType("integer") + .HasColumnName("profile_id"); + + b.Property("TraitName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("trait_name"); + + b.HasKey("Id") + .HasName("PK_trait"); + + b.HasIndex("ProfileId", "TraitName") + .IsUnique(); + + b.ToTable("trait", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.UploadedResourceLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("uploaded_resource_log_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Data") + .IsRequired() + .HasColumnType("bytea") + .HasColumnName("data"); + + b.Property("Date") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text") + .HasColumnName("path"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_uploaded_resource_log"); + + b.ToTable("uploaded_resource_log", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Whitelist", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("UserId") + .HasName("PK_whitelist"); + + b.ToTable("whitelist", (string)null); + }); + + modelBuilder.Entity("PlayerRound", b => + { + b.Property("PlayersId") + .HasColumnType("integer") + .HasColumnName("players_id"); + + b.Property("RoundsId") + .HasColumnType("integer") + .HasColumnName("rounds_id"); + + b.HasKey("PlayersId", "RoundsId") + .HasName("PK_player_round"); + + b.HasIndex("RoundsId") + .HasDatabaseName("IX_player_round_rounds_id"); + + b.ToTable("player_round", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Admin", b => + { + b.HasOne("Content.Server.Database.AdminRank", "AdminRank") + .WithMany("Admins") + .HasForeignKey("AdminRankId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_admin_rank_admin_rank_id"); + + b.Navigation("AdminRank"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminFlag", b => + { + b.HasOne("Content.Server.Database.Admin", "Admin") + .WithMany("Flags") + .HasForeignKey("AdminId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_flag_admin_admin_id"); + + b.Navigation("Admin"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLog", b => + { + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany("AdminLogs") + .HasForeignKey("RoundId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_log_round_round_id"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLogEntity", b => + { + b.HasOne("Content.Server.Database.AdminLog", null) + .WithMany("Entities") + .HasForeignKey("AdminLogId", "AdminLogRoundId") + .HasConstraintName("FK_admin_log_entity_admin_log_admin_log_id_admin_log_round_id"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => + { + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminLogs") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_log_player_player_player_user_id"); + + b.HasOne("Content.Server.Database.AdminLog", "Log") + .WithMany("Players") + .HasForeignKey("LogId", "RoundId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_log_player_admin_log_log_id_round_id"); + + b.Navigation("Log"); + + b.Navigation("Player"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminNote", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminNotesCreated") + .HasForeignKey("CreatedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_notes_player_created_by_id"); + + b.HasOne("Content.Server.Database.Player", "DeletedBy") + .WithMany("AdminNotesDeleted") + .HasForeignKey("DeletedById") + .HasPrincipalKey("UserId") + .HasConstraintName("FK_admin_notes_player_deleted_by_id"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminNotesLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_notes_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminNotesReceived") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_notes_player_player_user_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_admin_notes_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("DeletedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Player"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => + { + b.HasOne("Content.Server.Database.AdminRank", "Rank") + .WithMany("Flags") + .HasForeignKey("AdminRankId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_rank_flag_admin_rank_admin_rank_id"); + + b.Navigation("Rank"); + }); + + modelBuilder.Entity("Content.Server.Database.Antag", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Antags") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_antag_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("Content.Server.Database.Job", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Jobs") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_job_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("Content.Server.Database.Profile", b => + { + b.HasOne("Content.Server.Database.Preference", "Preference") + .WithMany("Profiles") + .HasForeignKey("PreferenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_profile_preference_preference_id"); + + b.Navigation("Preference"); + }); + + modelBuilder.Entity("Content.Server.Database.Round", b => + { + b.HasOne("Content.Server.Database.Server", "Server") + .WithMany("Rounds") + .HasForeignKey("ServerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_round_server_server_id"); + + b.Navigation("Server"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => + { + b.HasOne("Content.Server.Database.ServerBan", "Ban") + .WithMany("BanHits") + .HasForeignKey("BanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_ban_hit_server_ban_ban_id"); + + b.HasOne("Content.Server.Database.ConnectionLog", "Connection") + .WithMany("BanHits") + .HasForeignKey("ConnectionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_ban_hit_connection_log_connection_id"); + + b.Navigation("Ban"); + + b.Navigation("Connection"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => + { + b.HasOne("Content.Server.Database.ServerRoleBan", "Ban") + .WithOne("Unban") + .HasForeignKey("Content.Server.Database.ServerRoleUnban", "BanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_role_unban_server_role_ban_ban_id"); + + b.Navigation("Ban"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerUnban", b => + { + b.HasOne("Content.Server.Database.ServerBan", "Ban") + .WithOne("Unban") + .HasForeignKey("Content.Server.Database.ServerUnban", "BanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_unban_server_ban_ban_id"); + + b.Navigation("Ban"); + }); + + modelBuilder.Entity("Content.Server.Database.Trait", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Traits") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_trait_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("PlayerRound", b => + { + b.HasOne("Content.Server.Database.Player", null) + .WithMany() + .HasForeignKey("PlayersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_player_round_player_players_id"); + + b.HasOne("Content.Server.Database.Round", null) + .WithMany() + .HasForeignKey("RoundsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_player_round_round_rounds_id"); + }); + + modelBuilder.Entity("Content.Server.Database.Admin", b => + { + b.Navigation("Flags"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLog", b => + { + b.Navigation("Entities"); + + b.Navigation("Players"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRank", b => + { + b.Navigation("Admins"); + + b.Navigation("Flags"); + }); + + modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => + { + b.Navigation("BanHits"); + }); + + modelBuilder.Entity("Content.Server.Database.Player", b => + { + b.Navigation("AdminLogs"); + + b.Navigation("AdminNotesCreated"); + + b.Navigation("AdminNotesDeleted"); + + b.Navigation("AdminNotesLastEdited"); + + b.Navigation("AdminNotesReceived"); + }); + + modelBuilder.Entity("Content.Server.Database.Preference", b => + { + b.Navigation("Profiles"); + }); + + modelBuilder.Entity("Content.Server.Database.Profile", b => + { + b.Navigation("Antags"); + + b.Navigation("Jobs"); + + b.Navigation("Traits"); + }); + + modelBuilder.Entity("Content.Server.Database.Round", b => + { + b.Navigation("AdminLogs"); + }); + + modelBuilder.Entity("Content.Server.Database.Server", b => + { + b.Navigation("Rounds"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBan", b => + { + b.Navigation("BanHits"); + + b.Navigation("Unban"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => + { + b.Navigation("Unban"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Content.Server.Database/Migrations/Postgres/20240127102028_Height.cs b/Content.Server.Database/Migrations/Postgres/20240127102028_Height.cs new file mode 100644 index 00000000000..35f49bc7413 --- /dev/null +++ b/Content.Server.Database/Migrations/Postgres/20240127102028_Height.cs @@ -0,0 +1,40 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Content.Server.Database.Migrations.Postgres +{ + /// + public partial class HeightWidth : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "height", + table: "profile", + type: "REAL", + nullable: false, + defaultValue: 1f); + + migrationBuilder.AddColumn( + name: "width", + table: "profile", + type: "REAL", + nullable: false, + defaultValue: 1f); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "height", + table: "profile"); + + migrationBuilder.DropColumn( + name: "width", + table: "profile"); + } + } +} diff --git a/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs b/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs index 79e478006b0..f6ae50c269f 100644 --- a/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs +++ b/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs @@ -812,6 +812,16 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("text") .HasColumnName("hair_name"); + // Parkstation-HeightSlider Start + b.Property("Height") + .HasColumnType("real") + .HasColumnName("height"); + + b.Property("Width") + .HasColumnType("real") + .HasColumnName("width"); + // Parkstation-HeightSlider End + b.Property("Markings") .HasColumnType("jsonb") .HasColumnName("markings"); diff --git a/Content.Server.Database/Migrations/Sqlite/20240127102028_Height.Designer.cs b/Content.Server.Database/Migrations/Sqlite/20240127102028_Height.Designer.cs new file mode 100644 index 00000000000..dde6b84e3c9 --- /dev/null +++ b/Content.Server.Database/Migrations/Sqlite/20240127102028_Height.Designer.cs @@ -0,0 +1,1304 @@ +// +using System; +using Content.Server.Database; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Content.Server.Database.Migrations.Sqlite +{ + [DbContext(typeof(SqliteServerDbContext))] + [Migration("20230711102028_HeightWidth")] + partial class HeightWidth + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.4"); + + modelBuilder.Entity("Content.Server.Database.Admin", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.Property("AdminRankId") + .HasColumnType("INTEGER") + .HasColumnName("admin_rank_id"); + + b.Property("Title") + .HasColumnType("TEXT") + .HasColumnName("title"); + + b.HasKey("UserId") + .HasName("PK_admin"); + + b.HasIndex("AdminRankId") + .HasDatabaseName("IX_admin_admin_rank_id"); + + b.ToTable("admin", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminFlag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("admin_flag_id"); + + b.Property("AdminId") + .HasColumnType("TEXT") + .HasColumnName("admin_id"); + + b.Property("Flag") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("flag"); + + b.Property("Negative") + .HasColumnType("INTEGER") + .HasColumnName("negative"); + + b.HasKey("Id") + .HasName("PK_admin_flag"); + + b.HasIndex("AdminId") + .HasDatabaseName("IX_admin_flag_admin_id"); + + b.HasIndex("Flag", "AdminId") + .IsUnique(); + + b.ToTable("admin_flag", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("admin_log_id"); + + b.Property("RoundId") + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.Property("Date") + .HasColumnType("TEXT") + .HasColumnName("date"); + + b.Property("Impact") + .HasColumnType("INTEGER") + .HasColumnName("impact"); + + b.Property("Json") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("json"); + + b.Property("Message") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("message"); + + b.Property("Type") + .HasColumnType("INTEGER") + .HasColumnName("type"); + + b.HasKey("Id", "RoundId") + .HasName("PK_admin_log"); + + b.HasIndex("Date"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_admin_log_round_id"); + + b.HasIndex("Type") + .HasDatabaseName("IX_admin_log_type"); + + b.ToTable("admin_log", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLogEntity", b => + { + b.Property("Uid") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("uid"); + + b.Property("AdminLogId") + .HasColumnType("INTEGER") + .HasColumnName("admin_log_id"); + + b.Property("AdminLogRoundId") + .HasColumnType("INTEGER") + .HasColumnName("admin_log_round_id"); + + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.HasKey("Uid") + .HasName("PK_admin_log_entity"); + + b.HasIndex("AdminLogId", "AdminLogRoundId") + .HasDatabaseName("IX_admin_log_entity_admin_log_id_admin_log_round_id"); + + b.ToTable("admin_log_entity", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => + { + b.Property("PlayerUserId") + .HasColumnType("TEXT") + .HasColumnName("player_user_id"); + + b.Property("LogId") + .HasColumnType("INTEGER") + .HasColumnName("log_id"); + + b.Property("RoundId") + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.HasKey("PlayerUserId", "LogId", "RoundId") + .HasName("PK_admin_log_player"); + + b.HasIndex("LogId", "RoundId"); + + b.ToTable("admin_log_player", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminNote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("admin_notes_id"); + + b.Property("CreatedAt") + .HasColumnType("TEXT") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("TEXT") + .HasColumnName("created_by_id"); + + b.Property("Deleted") + .HasColumnType("INTEGER") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("TEXT") + .HasColumnName("deleted_at"); + + b.Property("DeletedById") + .HasColumnType("TEXT") + .HasColumnName("deleted_by_id"); + + b.Property("LastEditedAt") + .HasColumnType("TEXT") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("TEXT") + .HasColumnName("last_edited_by_id"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(4096) + .HasColumnType("TEXT") + .HasColumnName("message"); + + b.Property("PlayerUserId") + .HasColumnType("TEXT") + .HasColumnName("player_user_id"); + + b.Property("RoundId") + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.Property("ShownToPlayer") + .HasColumnType("INTEGER") + .HasColumnName("shown_to_player"); + + b.HasKey("Id") + .HasName("PK_admin_notes"); + + b.HasIndex("CreatedById"); + + b.HasIndex("DeletedById"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_admin_notes_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_admin_notes_round_id"); + + b.ToTable("admin_notes", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRank", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("admin_rank_id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.HasKey("Id") + .HasName("PK_admin_rank"); + + b.ToTable("admin_rank", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("admin_rank_flag_id"); + + b.Property("AdminRankId") + .HasColumnType("INTEGER") + .HasColumnName("admin_rank_id"); + + b.Property("Flag") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("flag"); + + b.HasKey("Id") + .HasName("PK_admin_rank_flag"); + + b.HasIndex("AdminRankId"); + + b.HasIndex("Flag", "AdminRankId") + .IsUnique(); + + b.ToTable("admin_rank_flag", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Antag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("antag_id"); + + b.Property("AntagName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("antag_name"); + + b.Property("ProfileId") + .HasColumnType("INTEGER") + .HasColumnName("profile_id"); + + b.HasKey("Id") + .HasName("PK_antag"); + + b.HasIndex("ProfileId", "AntagName") + .IsUnique(); + + b.ToTable("antag", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AssignedUserId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("assigned_user_id_id"); + + b.Property("UserId") + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("user_name"); + + b.HasKey("Id") + .HasName("PK_assigned_user_id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.HasIndex("UserName") + .IsUnique(); + + b.ToTable("assigned_user_id", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("connection_log_id"); + + b.Property("Address") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("address"); + + b.Property("Denied") + .HasColumnType("INTEGER") + .HasColumnName("denied"); + + b.Property("HWId") + .HasColumnType("BLOB") + .HasColumnName("hwid"); + + b.Property("Time") + .HasColumnType("TEXT") + .HasColumnName("time"); + + b.Property("UserId") + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("user_name"); + + b.HasKey("Id") + .HasName("PK_connection_log"); + + b.HasIndex("UserId"); + + b.ToTable("connection_log", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Job", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("job_id"); + + b.Property("JobName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("job_name"); + + b.Property("Priority") + .HasColumnType("INTEGER") + .HasColumnName("priority"); + + b.Property("ProfileId") + .HasColumnType("INTEGER") + .HasColumnName("profile_id"); + + b.HasKey("Id") + .HasName("PK_job"); + + b.HasIndex("ProfileId"); + + b.HasIndex("ProfileId", "JobName") + .IsUnique(); + + b.HasIndex(new[] { "ProfileId" }, "IX_job_one_high_priority") + .IsUnique() + .HasFilter("priority = 3"); + + b.ToTable("job", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.PlayTime", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("play_time_id"); + + b.Property("PlayerId") + .HasColumnType("TEXT") + .HasColumnName("player_id"); + + b.Property("TimeSpent") + .HasColumnType("TEXT") + .HasColumnName("time_spent"); + + b.Property("Tracker") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("tracker"); + + b.HasKey("Id") + .HasName("PK_play_time"); + + b.HasIndex("PlayerId", "Tracker") + .IsUnique(); + + b.ToTable("play_time", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Player", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("player_id"); + + b.Property("FirstSeenTime") + .HasColumnType("TEXT") + .HasColumnName("first_seen_time"); + + b.Property("LastReadRules") + .HasColumnType("TEXT") + .HasColumnName("last_read_rules"); + + b.Property("LastSeenAddress") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("last_seen_address"); + + b.Property("LastSeenHWId") + .HasColumnType("BLOB") + .HasColumnName("last_seen_hwid"); + + b.Property("LastSeenTime") + .HasColumnType("TEXT") + .HasColumnName("last_seen_time"); + + b.Property("LastSeenUserName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("last_seen_user_name"); + + b.Property("UserId") + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_player"); + + b.HasAlternateKey("UserId") + .HasName("ak_player_user_id"); + + b.HasIndex("LastSeenUserName"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("player", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Preference", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("preference_id"); + + b.Property("AdminOOCColor") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("admin_ooc_color"); + + b.Property("SelectedCharacterSlot") + .HasColumnType("INTEGER") + .HasColumnName("selected_character_slot"); + + b.Property("UserId") + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_preference"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("preference", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Profile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("profile_id"); + + b.Property("Age") + .HasColumnType("INTEGER") + .HasColumnName("age"); + + b.Property("Backpack") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("backpack"); + + b.Property("CharacterName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("char_name"); + + b.Property("Clothing") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("clothing"); + + b.Property("EyeColor") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("eye_color"); + + b.Property("FacialHairColor") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("facial_hair_color"); + + b.Property("FacialHairName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("facial_hair_name"); + + b.Property("FlavorText") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("flavor_text"); + + b.Property("Gender") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("gender"); + + b.Property("HairColor") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("hair_color"); + + b.Property("HairName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("hair_name"); + + b.Property("Height") + .HasColumnType("REAL") + .HasColumnName("height"); + + b.Property("Width") + .HasColumnType("REAL") + .HasColumnName("width"); + + b.Property("Markings") + .HasColumnType("jsonb") + .HasColumnName("markings"); + + b.Property("PreferenceId") + .HasColumnType("INTEGER") + .HasColumnName("preference_id"); + + b.Property("PreferenceUnavailable") + .HasColumnType("INTEGER") + .HasColumnName("pref_unavailable"); + + b.Property("Sex") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("sex"); + + b.Property("SkinColor") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("skin_color"); + + b.Property("Slot") + .HasColumnType("INTEGER") + .HasColumnName("slot"); + + b.Property("Species") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("species"); + + b.HasKey("Id") + .HasName("PK_profile"); + + b.HasIndex("PreferenceId") + .HasDatabaseName("IX_profile_preference_id"); + + b.HasIndex("Slot", "PreferenceId") + .IsUnique(); + + b.ToTable("profile", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Round", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.Property("ServerId") + .HasColumnType("INTEGER") + .HasColumnName("server_id"); + + b.HasKey("Id") + .HasName("PK_round"); + + b.HasIndex("ServerId") + .HasDatabaseName("IX_round_server_id"); + + b.ToTable("round", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Server", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("server_id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.HasKey("Id") + .HasName("PK_server"); + + b.ToTable("server", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("server_ban_id"); + + b.Property("Address") + .HasColumnType("TEXT") + .HasColumnName("address"); + + b.Property("AutoDelete") + .HasColumnType("INTEGER") + .HasColumnName("auto_delete"); + + b.Property("BanTime") + .HasColumnType("TEXT") + .HasColumnName("ban_time"); + + b.Property("BanningAdmin") + .HasColumnType("TEXT") + .HasColumnName("banning_admin"); + + b.Property("ExemptFlags") + .HasColumnType("INTEGER") + .HasColumnName("exempt_flags"); + + b.Property("ExpirationTime") + .HasColumnType("TEXT") + .HasColumnName("expiration_time"); + + b.Property("HWId") + .HasColumnType("BLOB") + .HasColumnName("hwid"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("reason"); + + b.Property("UserId") + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_server_ban"); + + b.HasIndex("Address"); + + b.HasIndex("UserId"); + + b.ToTable("server_ban", null, t => + { + t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR user_id IS NOT NULL OR hwid IS NOT NULL"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBanExemption", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.Property("Flags") + .HasColumnType("INTEGER") + .HasColumnName("flags"); + + b.HasKey("UserId") + .HasName("PK_server_ban_exemption"); + + b.ToTable("server_ban_exemption", null, t => + { + t.HasCheckConstraint("FlagsNotZero", "flags != 0"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("server_ban_hit_id"); + + b.Property("BanId") + .HasColumnType("INTEGER") + .HasColumnName("ban_id"); + + b.Property("ConnectionId") + .HasColumnType("INTEGER") + .HasColumnName("connection_id"); + + b.HasKey("Id") + .HasName("PK_server_ban_hit"); + + b.HasIndex("BanId") + .HasDatabaseName("IX_server_ban_hit_ban_id"); + + b.HasIndex("ConnectionId") + .HasDatabaseName("IX_server_ban_hit_connection_id"); + + b.ToTable("server_ban_hit", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("server_role_ban_id"); + + b.Property("Address") + .HasColumnType("TEXT") + .HasColumnName("address"); + + b.Property("BanTime") + .HasColumnType("TEXT") + .HasColumnName("ban_time"); + + b.Property("BanningAdmin") + .HasColumnType("TEXT") + .HasColumnName("banning_admin"); + + b.Property("ExpirationTime") + .HasColumnType("TEXT") + .HasColumnName("expiration_time"); + + b.Property("HWId") + .HasColumnType("BLOB") + .HasColumnName("hwid"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("reason"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("role_id"); + + b.Property("UserId") + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_server_role_ban"); + + b.HasIndex("Address"); + + b.HasIndex("UserId"); + + b.ToTable("server_role_ban", null, t => + { + t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR user_id IS NOT NULL OR hwid IS NOT NULL"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("role_unban_id"); + + b.Property("BanId") + .HasColumnType("INTEGER") + .HasColumnName("ban_id"); + + b.Property("UnbanTime") + .HasColumnType("TEXT") + .HasColumnName("unban_time"); + + b.Property("UnbanningAdmin") + .HasColumnType("TEXT") + .HasColumnName("unbanning_admin"); + + b.HasKey("Id") + .HasName("PK_server_role_unban"); + + b.HasIndex("BanId") + .IsUnique(); + + b.ToTable("server_role_unban", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ServerUnban", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("unban_id"); + + b.Property("BanId") + .HasColumnType("INTEGER") + .HasColumnName("ban_id"); + + b.Property("UnbanTime") + .HasColumnType("TEXT") + .HasColumnName("unban_time"); + + b.Property("UnbanningAdmin") + .HasColumnType("TEXT") + .HasColumnName("unbanning_admin"); + + b.HasKey("Id") + .HasName("PK_server_unban"); + + b.HasIndex("BanId") + .IsUnique(); + + b.ToTable("server_unban", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Trait", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("trait_id"); + + b.Property("ProfileId") + .HasColumnType("INTEGER") + .HasColumnName("profile_id"); + + b.Property("TraitName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("trait_name"); + + b.HasKey("Id") + .HasName("PK_trait"); + + b.HasIndex("ProfileId", "TraitName") + .IsUnique(); + + b.ToTable("trait", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.UploadedResourceLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("uploaded_resource_log_id"); + + b.Property("Data") + .IsRequired() + .HasColumnType("BLOB") + .HasColumnName("data"); + + b.Property("Date") + .HasColumnType("TEXT") + .HasColumnName("date"); + + b.Property("Path") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("path"); + + b.Property("UserId") + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_uploaded_resource_log"); + + b.ToTable("uploaded_resource_log", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Whitelist", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.HasKey("UserId") + .HasName("PK_whitelist"); + + b.ToTable("whitelist", (string)null); + }); + + modelBuilder.Entity("PlayerRound", b => + { + b.Property("PlayersId") + .HasColumnType("INTEGER") + .HasColumnName("players_id"); + + b.Property("RoundsId") + .HasColumnType("INTEGER") + .HasColumnName("rounds_id"); + + b.HasKey("PlayersId", "RoundsId") + .HasName("PK_player_round"); + + b.HasIndex("RoundsId") + .HasDatabaseName("IX_player_round_rounds_id"); + + b.ToTable("player_round", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Admin", b => + { + b.HasOne("Content.Server.Database.AdminRank", "AdminRank") + .WithMany("Admins") + .HasForeignKey("AdminRankId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_admin_rank_admin_rank_id"); + + b.Navigation("AdminRank"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminFlag", b => + { + b.HasOne("Content.Server.Database.Admin", "Admin") + .WithMany("Flags") + .HasForeignKey("AdminId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_flag_admin_admin_id"); + + b.Navigation("Admin"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLog", b => + { + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany("AdminLogs") + .HasForeignKey("RoundId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_log_round_round_id"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLogEntity", b => + { + b.HasOne("Content.Server.Database.AdminLog", null) + .WithMany("Entities") + .HasForeignKey("AdminLogId", "AdminLogRoundId") + .HasConstraintName("FK_admin_log_entity_admin_log_admin_log_id_admin_log_round_id"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => + { + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminLogs") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_log_player_player_player_user_id"); + + b.HasOne("Content.Server.Database.AdminLog", "Log") + .WithMany("Players") + .HasForeignKey("LogId", "RoundId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_log_player_admin_log_log_id_round_id"); + + b.Navigation("Log"); + + b.Navigation("Player"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminNote", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminNotesCreated") + .HasForeignKey("CreatedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_notes_player_created_by_id"); + + b.HasOne("Content.Server.Database.Player", "DeletedBy") + .WithMany("AdminNotesDeleted") + .HasForeignKey("DeletedById") + .HasPrincipalKey("UserId") + .HasConstraintName("FK_admin_notes_player_deleted_by_id"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminNotesLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_notes_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminNotesReceived") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_notes_player_player_user_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_admin_notes_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("DeletedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Player"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => + { + b.HasOne("Content.Server.Database.AdminRank", "Rank") + .WithMany("Flags") + .HasForeignKey("AdminRankId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_rank_flag_admin_rank_admin_rank_id"); + + b.Navigation("Rank"); + }); + + modelBuilder.Entity("Content.Server.Database.Antag", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Antags") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_antag_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("Content.Server.Database.Job", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Jobs") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_job_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("Content.Server.Database.Profile", b => + { + b.HasOne("Content.Server.Database.Preference", "Preference") + .WithMany("Profiles") + .HasForeignKey("PreferenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_profile_preference_preference_id"); + + b.Navigation("Preference"); + }); + + modelBuilder.Entity("Content.Server.Database.Round", b => + { + b.HasOne("Content.Server.Database.Server", "Server") + .WithMany("Rounds") + .HasForeignKey("ServerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_round_server_server_id"); + + b.Navigation("Server"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => + { + b.HasOne("Content.Server.Database.ServerBan", "Ban") + .WithMany("BanHits") + .HasForeignKey("BanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_ban_hit_server_ban_ban_id"); + + b.HasOne("Content.Server.Database.ConnectionLog", "Connection") + .WithMany("BanHits") + .HasForeignKey("ConnectionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_ban_hit_connection_log_connection_id"); + + b.Navigation("Ban"); + + b.Navigation("Connection"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => + { + b.HasOne("Content.Server.Database.ServerRoleBan", "Ban") + .WithOne("Unban") + .HasForeignKey("Content.Server.Database.ServerRoleUnban", "BanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_role_unban_server_role_ban_ban_id"); + + b.Navigation("Ban"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerUnban", b => + { + b.HasOne("Content.Server.Database.ServerBan", "Ban") + .WithOne("Unban") + .HasForeignKey("Content.Server.Database.ServerUnban", "BanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_unban_server_ban_ban_id"); + + b.Navigation("Ban"); + }); + + modelBuilder.Entity("Content.Server.Database.Trait", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Traits") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_trait_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("PlayerRound", b => + { + b.HasOne("Content.Server.Database.Player", null) + .WithMany() + .HasForeignKey("PlayersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_player_round_player_players_id"); + + b.HasOne("Content.Server.Database.Round", null) + .WithMany() + .HasForeignKey("RoundsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_player_round_round_rounds_id"); + }); + + modelBuilder.Entity("Content.Server.Database.Admin", b => + { + b.Navigation("Flags"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLog", b => + { + b.Navigation("Entities"); + + b.Navigation("Players"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRank", b => + { + b.Navigation("Admins"); + + b.Navigation("Flags"); + }); + + modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => + { + b.Navigation("BanHits"); + }); + + modelBuilder.Entity("Content.Server.Database.Player", b => + { + b.Navigation("AdminLogs"); + + b.Navigation("AdminNotesCreated"); + + b.Navigation("AdminNotesDeleted"); + + b.Navigation("AdminNotesLastEdited"); + + b.Navigation("AdminNotesReceived"); + }); + + modelBuilder.Entity("Content.Server.Database.Preference", b => + { + b.Navigation("Profiles"); + }); + + modelBuilder.Entity("Content.Server.Database.Profile", b => + { + b.Navigation("Antags"); + + b.Navigation("Jobs"); + + b.Navigation("Traits"); + }); + + modelBuilder.Entity("Content.Server.Database.Round", b => + { + b.Navigation("AdminLogs"); + }); + + modelBuilder.Entity("Content.Server.Database.Server", b => + { + b.Navigation("Rounds"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBan", b => + { + b.Navigation("BanHits"); + + b.Navigation("Unban"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => + { + b.Navigation("Unban"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Content.Server.Database/Migrations/Sqlite/20240127102028_Height.cs b/Content.Server.Database/Migrations/Sqlite/20240127102028_Height.cs new file mode 100644 index 00000000000..f05ad96859d --- /dev/null +++ b/Content.Server.Database/Migrations/Sqlite/20240127102028_Height.cs @@ -0,0 +1,40 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Content.Server.Database.Migrations.Sqlite +{ + /// + public partial class HeightWidth : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "height", + table: "profile", + type: "REAL", + nullable: false, + defaultValue: 1f); + + migrationBuilder.AddColumn( + name: "width", + table: "profile", + type: "REAL", + nullable: false, + defaultValue: 1f); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "height", + table: "profile"); + + migrationBuilder.DropColumn( + name: "width", + table: "profile"); + } + } +} diff --git a/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs b/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs index 89ca243fae6..8aa2e579222 100644 --- a/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs +++ b/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs @@ -763,6 +763,16 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("TEXT") .HasColumnName("hair_name"); + // Parkstation-HeightSlider Start + b.Property("Height") + .HasColumnType("REAL") + .HasColumnName("height"); + + b.Property("Width") + .HasColumnType("REAL") + .HasColumnName("width"); + // Parkstation-HeightSlider End + b.Property("Markings") .HasColumnType("jsonb") .HasColumnName("markings"); diff --git a/Content.Server.Database/Model.cs b/Content.Server.Database/Model.cs index eb9581b21e7..dfb584b3f4b 100644 --- a/Content.Server.Database/Model.cs +++ b/Content.Server.Database/Model.cs @@ -338,6 +338,8 @@ public class Profile public string Sex { get; set; } = null!; public string Gender { get; set; } = null!; public string Species { get; set; } = null!; + public float Height { get; set; } = 1f; + public float Width { get; set; } = 1f; [Column(TypeName = "jsonb")] public JsonDocument? Markings { get; set; } = null!; public string HairName { get; set; } = null!; public string HairColor { get; set; } = null!; diff --git a/Content.Server/Administration/Commands/AdminWhoCommand.cs b/Content.Server/Administration/Commands/AdminWhoCommand.cs index 9765e8385f0..cf2f8c453c8 100644 --- a/Content.Server/Administration/Commands/AdminWhoCommand.cs +++ b/Content.Server/Administration/Commands/AdminWhoCommand.cs @@ -19,6 +19,16 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) var adminMgr = IoCManager.Resolve(); var afk = IoCManager.Resolve(); + var seeStealth = true; + + // If null it (hopefully) means it is being called from the console. + if (shell.Player != null) + { + var playerData = adminMgr.GetAdminData(shell.Player); + + seeStealth = playerData != null && playerData.CanStealth(); + } + var sb = new StringBuilder(); var first = true; foreach (var admin in adminMgr.ActiveAdmins) @@ -30,10 +40,16 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) var adminData = adminMgr.GetAdminData(admin)!; DebugTools.AssertNotNull(adminData); + if (adminData.Stealth && !seeStealth) + continue; + sb.Append(admin.Name); if (adminData.Title is { } title) sb.Append($": [{title}]"); + if (adminData.Stealth) + sb.Append(" (S)"); + if (shell.Player is { } player && adminMgr.HasAdminFlag(player, AdminFlags.Admin)) { if (afk.IsAfk(admin)) diff --git a/Content.Server/Administration/Commands/PersistenceSaveCommand.cs b/Content.Server/Administration/Commands/PersistenceSaveCommand.cs index 2684e85d5f1..7ef1932c568 100644 --- a/Content.Server/Administration/Commands/PersistenceSaveCommand.cs +++ b/Content.Server/Administration/Commands/PersistenceSaveCommand.cs @@ -1,11 +1,6 @@ -using Content.Server.GameTicking; -using Content.Server.Ghost.Components; -using Content.Server.Players; using Content.Shared.Administration; using Content.Shared.CCVar; -using Content.Shared.Ghost; using Robust.Server.GameObjects; -using Robust.Server.Player; using Robust.Shared.Configuration; using Robust.Shared.Console; using Robust.Shared.Map; @@ -17,7 +12,6 @@ namespace Content.Server.Administration.Commands; public sealed class PersistenceSave : IConsoleCommand { [Dependency] private readonly IConfigurationManager _config = default!; - [Dependency] private readonly IEntityManager _entities = default!; [Dependency] private readonly IEntitySystemManager _system = default!; [Dependency] private readonly IMapManager _map = default!; diff --git a/Content.Server/Administration/Commands/PlayGlobalSoundCommand.cs b/Content.Server/Administration/Commands/PlayGlobalSoundCommand.cs index ac55ce83259..f1a5a57aa65 100644 --- a/Content.Server/Administration/Commands/PlayGlobalSoundCommand.cs +++ b/Content.Server/Administration/Commands/PlayGlobalSoundCommand.cs @@ -6,6 +6,7 @@ using Robust.Shared.Console; using Robust.Shared.ContentPack; using Robust.Shared.Player; +using Robust.Shared.Prototypes; namespace Content.Server.Administration.Commands; @@ -14,6 +15,7 @@ public sealed class PlayGlobalSoundCommand : IConsoleCommand { [Dependency] private readonly IEntityManager _entManager = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] private readonly IPrototypeManager _protoManager = default!; [Dependency] private readonly IResourceManager _res = default!; public string Command => "playglobalsound"; @@ -95,7 +97,7 @@ public CompletionResult GetCompletion(IConsoleShell shell, string[] args) { var hint = Loc.GetString("play-global-sound-command-arg-path"); - var options = CompletionHelper.ContentFilePath(args[0], _res); + var options = CompletionHelper.AudioFilePath(args[0], _protoManager, _res); return CompletionResult.FromHintOptions(options, hint); } diff --git a/Content.Server/Administration/Commands/StealthminCommand.cs b/Content.Server/Administration/Commands/StealthminCommand.cs new file mode 100644 index 00000000000..aa0e77a794a --- /dev/null +++ b/Content.Server/Administration/Commands/StealthminCommand.cs @@ -0,0 +1,34 @@ +using Content.Server.Administration.Managers; +using Content.Shared.Administration; +using JetBrains.Annotations; +using Robust.Shared.Console; +using Robust.Shared.Utility; + +namespace Content.Server.Administration.Commands; + +[UsedImplicitly] +[AdminCommand(AdminFlags.Stealth)] +public sealed class StealthminCommand : LocalizedCommands +{ + public override string Command => "stealthmin"; + + public override void Execute(IConsoleShell shell, string argStr, string[] args) + { + var player = shell.Player; + if (player == null) + { + shell.WriteLine(Loc.GetString("cmd-stealthmin-no-console")); + return; + } + + var mgr = IoCManager.Resolve(); + var adminData = mgr.GetAdminData(player); + + DebugTools.AssertNotNull(adminData); + + if (!adminData!.Stealth) + mgr.Stealth(player); + else + mgr.UnStealth(player); + } +} diff --git a/Content.Server/Administration/Commands/VariantizeCommand.cs b/Content.Server/Administration/Commands/VariantizeCommand.cs index 7aabd76335e..3f9b7efd07e 100644 --- a/Content.Server/Administration/Commands/VariantizeCommand.cs +++ b/Content.Server/Administration/Commands/VariantizeCommand.cs @@ -3,7 +3,6 @@ using Robust.Shared.Console; using Robust.Shared.Map; using Robust.Shared.Map.Components; -using Robust.Shared.Random; namespace Content.Server.Administration.Commands; @@ -11,7 +10,6 @@ namespace Content.Server.Administration.Commands; public sealed class VariantizeCommand : IConsoleCommand { [Dependency] private readonly IEntityManager _entManager = default!; - [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ITileDefinitionManager _tileDefManager = default!; public string Command => "variantize"; diff --git a/Content.Server/Administration/Managers/AdminManager.cs b/Content.Server/Administration/Managers/AdminManager.cs index b1cca46e63f..8fb28b7ec4d 100644 --- a/Content.Server/Administration/Managers/AdminManager.cs +++ b/Content.Server/Administration/Managers/AdminManager.cs @@ -98,6 +98,40 @@ public void DeAdmin(ICommonSession session) UpdateAdminStatus(session); } + public void Stealth(ICommonSession session) + { + if (!_admins.TryGetValue(session, out var reg)) + throw new ArgumentException($"Player {session} is not an admin"); + + if (reg.Data.Stealth) + return; + + var playerData = session.ContentData()!; + playerData.Stealthed = true; + reg.Data.Stealth = true; + + _chat.DispatchServerMessage(session, Loc.GetString("admin-manager-stealthed-message")); + _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-de-admin-message", ("exAdminName", session.Name)), AdminFlags.Stealth); + _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-enable-stealth", ("stealthAdminName", session.Name)), flagWhitelist: AdminFlags.Stealth); + } + + public void UnStealth(ICommonSession session) + { + if (!_admins.TryGetValue(session, out var reg)) + throw new ArgumentException($"Player {session} is not an admin"); + + if (!reg.Data.Stealth) + return; + + var playerData = session.ContentData()!; + playerData.Stealthed = false; + reg.Data.Stealth = false; + + _chat.DispatchServerMessage(session, Loc.GetString("admin-manager-unstealthed-message")); + _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-re-admin-message", ("newAdminName", session.Name)), flagBlacklist: AdminFlags.Stealth); + _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-disable-stealth", ("exStealthAdminName", session.Name)), flagWhitelist: AdminFlags.Stealth); + } + public void ReAdmin(ICommonSession session) { if (!_admins.TryGetValue(session, out var reg)) @@ -116,7 +150,16 @@ public void ReAdmin(ICommonSession session) plyData.ExplicitlyDeadminned = false; reg.Data.Active = true; - _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-re-admin-message", ("newAdminName", session.Name))); + if (reg.Data.Stealth) + { + _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-re-admin-message", ("newAdminName", session.Name))); + } + else + { + _chat.DispatchServerMessage(session, Loc.GetString("admin-manager-stealthed-message")); + _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-re-admin-message", + ("newAdminName", session.Name)), flagWhitelist: AdminFlags.Stealth); + } SendPermsChangedEvent(session); UpdateAdminStatus(session); @@ -168,6 +211,9 @@ public async void ReloadAdmin(ICommonSession player) _chat.DispatchServerMessage(player, Loc.GetString("admin-manager-admin-permissions-updated-message")); } + + if (player.ContentData()!.Stealthed) + aData.Stealth = true; } SendPermsChangedEvent(player); @@ -290,9 +336,14 @@ private void PlayerStatusChanged(object? sender, SessionStatusEventArgs e) } else if (e.NewStatus == SessionStatus.Disconnected) { - if (_admins.Remove(e.Session) && _cfg.GetCVar(CCVars.AdminAnnounceLogout)) + if (_admins.Remove(e.Session, out var reg ) && _cfg.GetCVar(CCVars.AdminAnnounceLogout)) { - _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-admin-logout-message", ("name", e.Session.Name))); + if (reg.Data.Stealth) + _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-admin-logout-message", + ("name", e.Session.Name)), flagWhitelist: AdminFlags.Stealth); + else + _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-admin-logout-message", + ("name", e.Session.Name))); } } } @@ -315,13 +366,27 @@ private async void LoginAdminMaybe(ICommonSession session) _admins.Add(session, reg); - if (!session.ContentData()!.ExplicitlyDeadminned) + if (session.ContentData()!.Stealthed) + reg.Data.Stealth = true; + + if (!session.ContentData()?.ExplicitlyDeadminned ?? false) { reg.Data.Active = true; if (_cfg.GetCVar(CCVars.AdminAnnounceLogin)) { - _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-admin-login-message", ("name", session.Name))); + if (reg.Data.Stealth) + { + + _chat.DispatchServerMessage(session, Loc.GetString("admin-manager-stealthed-message")); + _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-admin-login-message", + ("name", session.Name)), flagWhitelist: AdminFlags.Stealth); + } + else + { + _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-admin-login-message", + ("name", session.Name))); + } } SendPermsChangedEvent(session); diff --git a/Content.Server/Administration/Managers/IAdminManager.cs b/Content.Server/Administration/Managers/IAdminManager.cs index a52ec7b099c..95967b24aca 100644 --- a/Content.Server/Administration/Managers/IAdminManager.cs +++ b/Content.Server/Administration/Managers/IAdminManager.cs @@ -41,6 +41,16 @@ public interface IAdminManager : ISharedAdminManager /// void ReAdmin(ICommonSession session); + /// + /// Make admin hidden from adminwho. + /// + void Stealth(ICommonSession session); + + /// + /// Unhide admin from adminwho. + /// + void UnStealth(ICommonSession session); + /// /// Re-loads the permissions of an player in case their admin data changed DB-side. /// diff --git a/Content.Server/Administration/UI/AdminAnnounceEui.cs b/Content.Server/Administration/UI/AdminAnnounceEui.cs index b6a6ba99840..e6d17b5af40 100644 --- a/Content.Server/Administration/UI/AdminAnnounceEui.cs +++ b/Content.Server/Administration/UI/AdminAnnounceEui.cs @@ -5,6 +5,8 @@ using Content.Server.EUI; using Content.Shared.Administration; using Content.Shared.Eui; +using Content.Server.Announcements.Systems; +using Robust.Shared.Player; namespace Content.Server.Administration.UI { @@ -12,11 +14,14 @@ public sealed class AdminAnnounceEui : BaseEui { [Dependency] private readonly IAdminManager _adminManager = default!; [Dependency] private readonly IChatManager _chatManager = default!; + private readonly AnnouncerSystem _announcer; private readonly ChatSystem _chatSystem; public AdminAnnounceEui() { IoCManager.InjectDependencies(this); + + _announcer = IoCManager.Resolve().GetEntitySystem(); _chatSystem = IoCManager.Resolve().GetEntitySystem(); } @@ -50,7 +55,8 @@ public override void HandleMessage(EuiMessageBase msg) break; // TODO: Per-station announcement support case AdminAnnounceType.Station: - _chatSystem.DispatchGlobalAnnouncement(doAnnounce.Announcement, doAnnounce.Announcer, colorOverride: Color.Gold); + _announcer.SendAnnouncement(_announcer.GetAnnouncementId("Announce"), Filter.Broadcast(), + doAnnounce.Announcement, doAnnounce.Announcer, Color.Gold); break; } diff --git a/Content.Server/Alert/Click/AcceptingOffer.cs b/Content.Server/Alert/Click/AcceptingOffer.cs new file mode 100644 index 00000000000..b6adbf83bd3 --- /dev/null +++ b/Content.Server/Alert/Click/AcceptingOffer.cs @@ -0,0 +1,24 @@ +using Content.Shared.OfferItem; +using Content.Server.OfferItem; +using Content.Shared.Alert; +using JetBrains.Annotations; + +namespace Content.Server.Alert.Click; + +/// +/// Accepting the offer and receive item +/// +[UsedImplicitly] +[DataDefinition] +public sealed partial class AcceptOffer : IAlertClick +{ + public void AlertClicked(EntityUid player) + { + var entManager = IoCManager.Resolve(); + + if (entManager.TryGetComponent(player, out OfferItemComponent? offerItem)) + { + entManager.System().Receive(player, offerItem); + } + } +} diff --git a/Content.Server/Alert/Click/StopBeingPulled.cs b/Content.Server/Alert/Click/StopBeingPulled.cs index 2cf076fbeed..b02da38ecfa 100644 --- a/Content.Server/Alert/Click/StopBeingPulled.cs +++ b/Content.Server/Alert/Click/StopBeingPulled.cs @@ -1,7 +1,7 @@ using Content.Shared.ActionBlocker; using Content.Shared.Alert; -using Content.Shared.Pulling.Components; -using Content.Shared.Pulling; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; using JetBrains.Annotations; namespace Content.Server.Alert.Click @@ -20,9 +20,9 @@ public void AlertClicked(EntityUid player) if (!entityManager.System().CanInteract(player, null)) return; - if (entityManager.TryGetComponent(player, out SharedPullableComponent? playerPullable)) + if (entityManager.TryGetComponent(player, out PullableComponent? playerPullable)) { - entityManager.System().TryStopPull(playerPullable); + entityManager.System().TryStopPull(player, playerPullable, user: player); } } } diff --git a/Content.Server/Alert/Click/StopPulling.cs b/Content.Server/Alert/Click/StopPulling.cs index 00a41495985..76f9569429f 100644 --- a/Content.Server/Alert/Click/StopPulling.cs +++ b/Content.Server/Alert/Click/StopPulling.cs @@ -1,6 +1,6 @@ using Content.Shared.Alert; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; using JetBrains.Annotations; namespace Content.Server.Alert.Click @@ -15,12 +15,12 @@ public sealed partial class StopPulling : IAlertClick public void AlertClicked(EntityUid player) { var entManager = IoCManager.Resolve(); + var ps = entManager.System(); - var ps = entManager.System(); - var playerTarget = ps.GetPulled(player); - if (playerTarget != default && entManager.TryGetComponent(playerTarget, out SharedPullableComponent? playerPullable)) + if (entManager.TryGetComponent(player, out PullerComponent? puller) && + entManager.TryGetComponent(puller.Pulling, out PullableComponent? pullableComp)) { - ps.TryStopPull(playerPullable); + ps.TryStopPull(puller.Pulling.Value, pullableComp, user: player); } } } diff --git a/Content.Server/AlertLevel/AlertLevelSystem.cs b/Content.Server/AlertLevel/AlertLevelSystem.cs index 848170ba9dc..d856fab9da7 100644 --- a/Content.Server/AlertLevel/AlertLevelSystem.cs +++ b/Content.Server/AlertLevel/AlertLevelSystem.cs @@ -6,6 +6,7 @@ using Robust.Shared.Audio.Systems; using Robust.Shared.Configuration; using Robust.Shared.Prototypes; +using Content.Server.Announcements.Systems; namespace Content.Server.AlertLevel; @@ -16,6 +17,7 @@ public sealed class AlertLevelSystem : EntitySystem [Dependency] private readonly ChatSystem _chatSystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly StationSystem _stationSystem = default!; + [Dependency] private readonly AnnouncerSystem _announcer = default!; // Until stations are a prototype, this is how it's going to have to be. public const string DefaultAlertLevelSet = "stationAlerts"; @@ -122,18 +124,14 @@ public void SetLevel(EntityUid station, string level, bool playSound, bool annou || component.AlertLevels == null || !component.AlertLevels.Levels.TryGetValue(level, out var detail) || component.CurrentLevel == level) - { return; - } if (!force) { if (!detail.Selectable || component.CurrentDelay > 0 || component.IsLevelLocked) - { return; - } component.CurrentDelay = _cfg.GetCVar(CCVars.GameAlertLevelChangeDelay); component.ActiveDelay = true; @@ -142,64 +140,31 @@ public void SetLevel(EntityUid station, string level, bool playSound, bool annou component.CurrentLevel = level; component.IsLevelLocked = locked; - var stationName = dataComponent.EntityName; - var name = level.ToLower(); - if (Loc.TryGetString($"alert-level-{level}", out var locName)) - { name = locName.ToLower(); - } // Announcement text. Is passed into announcementFull. var announcement = detail.Announcement; if (Loc.TryGetString(detail.Announcement, out var locAnnouncement)) - { announcement = locAnnouncement; - } - // The full announcement to be spat out into chat. - var announcementFull = Loc.GetString("alert-level-announcement", ("name", name), ("announcement", announcement)); - - var playDefault = false; + var alert = _announcer.GetAnnouncementId($"Alert{level}"); if (playSound) - { - if (detail.Sound != null) - { - var filter = _stationSystem.GetInOwningStation(station); - _audio.PlayGlobal(detail.Sound, filter, true, detail.Sound.Params); - } - else - { - playDefault = true; - } - } - + _announcer.SendAnnouncementAudio(alert, _stationSystem.GetInOwningStation(station)); if (announce) - { - _chatSystem.DispatchStationAnnouncement(station, announcementFull, playDefaultSound: playDefault, - colorOverride: detail.Color, sender: stationName); - } + _announcer.SendAnnouncementMessage(alert, "alert-level-announcement", null, detail.Color, null, null, + ("name", name), ("announcement", announcement)); RaiseLocalEvent(new AlertLevelChangedEvent(station, level)); } } -public sealed class AlertLevelDelayFinishedEvent : EntityEventArgs -{} - -public sealed class AlertLevelPrototypeReloadedEvent : EntityEventArgs -{} - -public sealed class AlertLevelChangedEvent : EntityEventArgs +public sealed class AlertLevelDelayFinishedEvent : EntityEventArgs; +public sealed class AlertLevelPrototypeReloadedEvent : EntityEventArgs; +public sealed class AlertLevelChangedEvent(EntityUid station, string alertLevel) : EntityEventArgs { - public EntityUid Station { get; } - public string AlertLevel { get; } - - public AlertLevelChangedEvent(EntityUid station, string alertLevel) - { - Station = station; - AlertLevel = alertLevel; - } + public EntityUid Station { get; } = station; + public string AlertLevel { get; } = alertLevel; } diff --git a/Content.Server/Announcements/AnnounceCommand.cs b/Content.Server/Announcements/AnnounceCommand.cs index cedde3fc140..c7158eac009 100644 --- a/Content.Server/Announcements/AnnounceCommand.cs +++ b/Content.Server/Announcements/AnnounceCommand.cs @@ -1,8 +1,11 @@ +using System.Linq; using Content.Server.Administration; -using Content.Server.Chat; -using Content.Server.Chat.Systems; +using Content.Server.Announcements.Systems; using Content.Shared.Administration; +using Content.Shared.Announcements.Prototypes; using Robust.Shared.Console; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; namespace Content.Server.Announcements { @@ -11,27 +14,77 @@ public sealed class AnnounceCommand : IConsoleCommand { public string Command => "announce"; public string Description => "Send an in-game announcement."; - public string Help => $"{Command} or {Command} to send announcement as CentCom."; + public string Help => $"{Command} "; public void Execute(IConsoleShell shell, string argStr, string[] args) { - var chat = IoCManager.Resolve().GetEntitySystem(); + var announcer = IoCManager.Resolve().GetEntitySystem(); + var proto = IoCManager.Resolve(); - if (args.Length == 0) + switch (args.Length) { - shell.WriteError("Not enough arguments! Need at least 1."); - return; + case 0: + shell.WriteError("Not enough arguments! Need at least 1."); + return; + case 1: + announcer.SendAnnouncement(announcer.GetAnnouncementId("CommandReport"), Filter.Broadcast(), + args[0], "Central Command", Color.Gold); + break; + case 2: + announcer.SendAnnouncement(announcer.GetAnnouncementId("CommandReport"), Filter.Broadcast(), + args[1], args[0], Color.Gold); + break; + case 3: + announcer.SendAnnouncement(announcer.GetAnnouncementId(args[2]), Filter.Broadcast(), args[1], + args[0], Color.Gold); + break; + case 4: + if (!proto.TryIndex(args[3], out AnnouncerPrototype? prototype)) + { + shell.WriteError($"No announcer prototype with ID {args[3]} found!"); + return; + } + announcer.SendAnnouncement(args[2], Filter.Broadcast(), args[1], args[0], Color.Gold, null, + prototype); + break; } - if (args.Length == 1) - { - chat.DispatchGlobalAnnouncement(args[0], colorOverride: Color.Gold); - } - else + shell.WriteLine("Sent!"); + } + + public CompletionResult GetCompletion(IConsoleShell shell, string[] args) + { + switch (args.Length) { - var message = string.Join(' ', new ArraySegment(args, 1, args.Length-1)); - chat.DispatchGlobalAnnouncement(message, args[0], colorOverride: Color.Gold); + case 3: + { + var list = new List(); + + foreach (var prototype in IoCManager.Resolve() + .EnumeratePrototypes() + .SelectMany(p => p.Announcements.Select(a => a.ID))) + { + if (!list.Contains(prototype)) + list.Add(prototype); + } + + return CompletionResult.FromHintOptions(list, Loc.GetString("admin-announce-hint-sound")); + } + case 4: + { + var list = new List(); + + foreach (var prototype in IoCManager.Resolve() + .EnumeratePrototypes()) + { + if (!list.Contains(prototype.ID)) + list.Add(prototype.ID); + } + + return CompletionResult.FromHintOptions(list, Loc.GetString("admin-announce-hint-voice")); + } + default: + return CompletionResult.Empty; } - shell.WriteLine("Sent!"); } } } diff --git a/Content.Server/Announcements/Systems/AnnouncerSystem.Announce.cs b/Content.Server/Announcements/Systems/AnnouncerSystem.Announce.cs new file mode 100644 index 00000000000..d705b86384d --- /dev/null +++ b/Content.Server/Announcements/Systems/AnnouncerSystem.Announce.cs @@ -0,0 +1,96 @@ +using System.Linq; +using Content.Shared.Announcements.Events; +using Content.Shared.Announcements.Prototypes; +using Robust.Shared.Audio; +using Robust.Shared.Player; + +namespace Content.Server.Announcements.Systems; + +public sealed partial class AnnouncerSystem +{ + /// + /// Gets an announcement message from the announcer + /// + /// ID of the announcement from the announcer to get information from + private string? GetAnnouncementMessage(string announcementId) + { + // Get the announcement data from the announcer + // Will be the fallback if the data for the announcementId is not found + var announcementType = Announcer.Announcements.FirstOrDefault(a => a.ID == announcementId) ?? + Announcer.Announcements.First(a => a.ID == "fallback"); + + // Return the announcementType.MessageOverride if it exists, otherwise return null + return announcementType.MessageOverride != null ? Loc.GetString(announcementType.MessageOverride) : null; + } + + + /// + /// Sends an announcement audio + /// + /// ID of the announcement to get information from + /// Who hears the announcement audio + /// Uses this announcer instead of the current global one + public void SendAnnouncementAudio(string announcementId, Filter filter, AnnouncerPrototype? announcerOverride = null) + { + var ev = new AnnouncementSendEvent( + announcerOverride?.ID ?? Announcer.ID, + announcementId, + filter.Recipients.ToList().ConvertAll(p => p.UserId), // I hate this but IEnumerable isn't serializable, and then ICommonSession wasn't, so you get the User ID + GetAudioParams(announcementId, Announcer) ?? AudioParams.Default + ); + + RaiseNetworkEvent(ev); + } + + /// + /// Sends an announcement message + /// + /// ID of the announcement to get information from + /// Text to send in the announcement + /// Who to show as the announcement announcer, defaults to the current announcer's name + /// What color the announcement should be + /// Station ID to send the announcement to + /// Uses this announcer instead of the current global one + /// Locale arguments to pass to the announcement message + public void SendAnnouncementMessage(string announcementId, string locale, string? sender = null, + Color? colorOverride = null, EntityUid? station = null, AnnouncerPrototype? announcerOverride = null, + params (string, object)[] localeArgs) + { + sender ??= Loc.GetString($"announcer-{announcerOverride?.ID ?? Announcer.ID}-name"); + + // If the announcement has a message override, use that instead of the message parameter + if (GetAnnouncementMessage(announcementId, announcerOverride?.ID ?? Announcer.ID, localeArgs) is { } announcementMessage) + locale = announcementMessage; + else + locale = Loc.GetString(locale, localeArgs); + + // Don't send nothing + if (string.IsNullOrEmpty(locale)) + return; + + // If there is a station, send the announcement to the station, otherwise send it to everyone + if (station == null) + _chat.DispatchGlobalAnnouncement(locale, sender, false, colorOverride: colorOverride); + else + _chat.DispatchStationAnnouncement(station.Value, locale, sender, false, colorOverride: colorOverride); + } + + /// + /// Sends an announcement with a message and audio + /// + /// ID of the announcement to get information from + /// Who hears the announcement audio + /// Text to send in the announcement + /// Who to show as the announcement announcer, defaults to the current announcer's name + /// What color the announcement should be + /// Station ID to send the announcement to + /// Uses this announcer instead of the current global one + /// Locale arguments to pass to the announcement message + public void SendAnnouncement(string announcementId, Filter filter, string locale, string? sender = null, + Color? colorOverride = null, EntityUid? station = null, AnnouncerPrototype? announcerOverride = null, + params (string, object)[] localeArgs) + { + SendAnnouncementAudio(announcementId, filter, announcerOverride); + SendAnnouncementMessage(announcementId, locale, sender, colorOverride, station, announcerOverride, localeArgs); + } +} diff --git a/Content.Server/Announcements/Systems/AnnouncerSystem.Announcer.cs b/Content.Server/Announcements/Systems/AnnouncerSystem.Announcer.cs new file mode 100644 index 00000000000..30969361110 --- /dev/null +++ b/Content.Server/Announcements/Systems/AnnouncerSystem.Announcer.cs @@ -0,0 +1,68 @@ +using System.Linq; +using Content.Shared.GameTicking; +using Content.Shared.Announcements.Prototypes; +using Content.Shared.CCVar; +using Content.Shared.Random; +using Content.Shared.Random.Helpers; +using Robust.Shared.Utility; + +namespace Content.Server.Announcements.Systems; + +public sealed partial class AnnouncerSystem +{ + private void OnRoundRestarting(RoundRestartCleanupEvent ev) + { + NewAnnouncer(); + } + + + /// + /// Sets the announcer to a random one or the CVar + /// + private void NewAnnouncer() + { + var announcer = _config.GetCVar(CCVars.Announcer); + if (string.IsNullOrEmpty(announcer) || !_proto.TryIndex(announcer, out _)) + SetAnnouncer(PickAnnouncer()); + else + SetAnnouncer(announcer); + } + + /// + /// Picks a random announcer prototype following blacklists + /// + public AnnouncerPrototype PickAnnouncer() + { + var list = _proto.Index(_config.GetCVar(CCVars.AnnouncerList)); + var blacklist = _config.GetCVar(CCVars.AnnouncerBlacklist).Split(',').Select(a => a.Trim()).ToList(); + var modWeights = list.Weights.Where(a => !blacklist.Contains(a.Key)); + + list = new WeightedRandomPrototype(); + foreach (var (key, value) in modWeights) + list.Weights.Add(key, value); + + return _proto.Index(list.Pick()); + } + + + /// + /// Sets the announcer + /// + /// ID of the announcer to choose + public void SetAnnouncer(string announcerId) + { + if (!_proto.TryIndex(announcerId, out var announcer)) + DebugTools.Assert($"Set announcer {announcerId} does not exist, attempting to use previously set one."); + else + Announcer = announcer; + } + + /// + /// Sets the announcer + /// + /// The announcer prototype to set the current announcer to + public void SetAnnouncer(AnnouncerPrototype announcer) + { + Announcer = announcer; + } +} diff --git a/Content.Server/Announcements/Systems/AnnouncerSystem.cs b/Content.Server/Announcements/Systems/AnnouncerSystem.cs new file mode 100644 index 00000000000..1770a2ce937 --- /dev/null +++ b/Content.Server/Announcements/Systems/AnnouncerSystem.cs @@ -0,0 +1,33 @@ +using Content.Server.Chat.Systems; +using Content.Shared.GameTicking; +using Content.Shared.Announcements.Prototypes; +using Content.Shared.Announcements.Systems; +using Content.Shared.CCVar; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; + +namespace Content.Server.Announcements.Systems; + +public sealed partial class AnnouncerSystem : SharedAnnouncerSystem +{ + [Dependency] private readonly IConfigurationManager _config = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly ChatSystem _chat = default!; + + /// + /// The currently selected announcer + /// + [Access(typeof(AnnouncerSystem))] + public AnnouncerPrototype Announcer { get; set; } = default!; + + + public override void Initialize() + { + base.Initialize(); + NewAnnouncer(); + + _config.OnValueChanged(CCVars.Announcer, _ => NewAnnouncer()); + + SubscribeLocalEvent(OnRoundRestarting); + } +} diff --git a/Content.Server/Anomaly/AnomalySystem.Generator.cs b/Content.Server/Anomaly/AnomalySystem.Generator.cs index 2053a7bbbe6..e03c566593e 100644 --- a/Content.Server/Anomaly/AnomalySystem.Generator.cs +++ b/Content.Server/Anomaly/AnomalySystem.Generator.cs @@ -24,7 +24,7 @@ namespace Content.Server.Anomaly; /// public sealed partial class AnomalySystem { - [Dependency] private readonly MapSystem _mapSystem = default!; + [Dependency] private readonly SharedMapSystem _mapSystem = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; private void InitializeGenerator() diff --git a/Content.Server/Anomaly/Effects/BluespaceAnomalySystem.cs b/Content.Server/Anomaly/Effects/BluespaceAnomalySystem.cs index 87c0ba4a4ee..dd2da82c9d6 100644 --- a/Content.Server/Anomaly/Effects/BluespaceAnomalySystem.cs +++ b/Content.Server/Anomaly/Effects/BluespaceAnomalySystem.cs @@ -8,6 +8,7 @@ using Content.Shared.Teleportation.Components; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; +using Robust.Shared.Collections; using Robust.Shared.Random; namespace Content.Server.Anomaly.Effects; @@ -35,20 +36,19 @@ private void OnPulse(EntityUid uid, BluespaceAnomalyComponent component, ref Ano var range = component.MaxShuffleRadius * args.Severity; var mobs = new HashSet>(); _lookup.GetEntitiesInRange(xform.Coordinates, range, mobs); - var allEnts = new List(mobs.Select(m => m.Owner)) { uid }; - var coords = new List(); + var allEnts = new ValueList(mobs.Select(m => m.Owner)) { uid }; + var coords = new ValueList(); foreach (var ent in allEnts) { - if (xformQuery.TryGetComponent(ent, out var xf)) - coords.Add(xf.MapPosition.Position); + if (xformQuery.TryGetComponent(ent, out var allXform)) + coords.Add(_xform.GetWorldPosition(allXform)); } _random.Shuffle(coords); for (var i = 0; i < allEnts.Count; i++) { - _adminLogger.Add(LogType.Teleport, $"{ToPrettyString(allEnts[i])} has been shuffled to {coords[i]} by the {ToPrettyString(uid)} at {xform.Coordinates}"); - _xform.SetWorldPosition(allEnts[i], coords[i], xformQuery); + _xform.SetWorldPosition(allEnts[i], coords[i]); } } diff --git a/Content.Server/Anomaly/Effects/EntityAnomalySystem.cs b/Content.Server/Anomaly/Effects/EntityAnomalySystem.cs index 7c397d68887..90a655fbba7 100644 --- a/Content.Server/Anomaly/Effects/EntityAnomalySystem.cs +++ b/Content.Server/Anomaly/Effects/EntityAnomalySystem.cs @@ -2,7 +2,6 @@ using Content.Shared.Anomaly.Components; using Content.Shared.Anomaly.Effects; using Content.Shared.Anomaly.Effects.Components; -using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; using Robust.Shared.Random; @@ -12,7 +11,6 @@ namespace Content.Server.Anomaly.Effects; public sealed class EntityAnomalySystem : SharedEntityAnomalySystem { [Dependency] private readonly SharedAnomalySystem _anomaly = default!; - [Dependency] private readonly IMapManager _map = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedMapSystem _mapSystem = default!; diff --git a/Content.Server/Anomaly/Effects/GasProducerAnomalySystem.cs b/Content.Server/Anomaly/Effects/GasProducerAnomalySystem.cs index a5e42be5400..2408ad0b3dd 100644 --- a/Content.Server/Anomaly/Effects/GasProducerAnomalySystem.cs +++ b/Content.Server/Anomaly/Effects/GasProducerAnomalySystem.cs @@ -2,11 +2,10 @@ using Content.Server.Anomaly.Components; using Content.Shared.Anomaly.Components; using Content.Shared.Atmos; -using Robust.Server.GameObjects; -using Robust.Shared.Map; using Robust.Shared.Random; using System.Linq; using System.Numerics; +using Robust.Shared.Map.Components; namespace Content.Server.Anomaly.Effects; @@ -16,8 +15,6 @@ namespace Content.Server.Anomaly.Effects; public sealed class GasProducerAnomalySystem : EntitySystem { [Dependency] private readonly AtmosphereSystem _atmosphere = default!; - [Dependency] private readonly TransformSystem _xform = default!; - [Dependency] private readonly IMapManager _map = default!; [Dependency] private readonly IRobustRandom _random = default!; public override void Initialize() @@ -55,7 +52,7 @@ private void ReleaseGas(EntityUid uid, Gas gas, float mols, float radius, int co { var xform = Transform(uid); - if (!_map.TryGetGrid(xform.GridUid, out var grid)) + if (!TryComp(xform.GridUid, out var grid)) return; var localpos = xform.Coordinates.Position; diff --git a/Content.Server/Atmos/Commands/DeleteGasCommand.cs b/Content.Server/Atmos/Commands/DeleteGasCommand.cs index 9e7594c024b..f4279db926a 100644 --- a/Content.Server/Atmos/Commands/DeleteGasCommand.cs +++ b/Content.Server/Atmos/Commands/DeleteGasCommand.cs @@ -3,7 +3,7 @@ using Content.Shared.Administration; using Content.Shared.Atmos; using Robust.Shared.Console; -using Robust.Shared.Map; +using Robust.Shared.Map.Components; namespace Content.Server.Atmos.Commands { @@ -11,7 +11,6 @@ namespace Content.Server.Atmos.Commands public sealed class DeleteGasCommand : IConsoleCommand { [Dependency] private readonly IEntityManager _entManager = default!; - [Dependency] private readonly IMapManager _mapManager = default!; public string Command => "deletegas"; public string Description => "Removes all gases from a grid, or just of one type if specified."; @@ -119,7 +118,7 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) return; } - if (!_mapManager.TryGetGrid(gridId, out _)) + if (!_entManager.TryGetComponent(gridId, out _)) { shell.WriteLine($"No grid exists with id {gridId}"); return; diff --git a/Content.Server/Atmos/Components/AirtightComponent.cs b/Content.Server/Atmos/Components/AirtightComponent.cs index ca107eafbe8..69488a71307 100644 --- a/Content.Server/Atmos/Components/AirtightComponent.cs +++ b/Content.Server/Atmos/Components/AirtightComponent.cs @@ -9,27 +9,53 @@ public sealed partial class AirtightComponent : Component { public (EntityUid Grid, Vector2i Tile) LastPosition { get; set; } + /// + /// The directions in which this entity should block airflow, relative to its own reference frame. + /// [DataField("airBlockedDirection", customTypeSerializer: typeof(FlagSerializer))] public int InitialAirBlockedDirection { get; set; } = (int) AtmosDirection.All; + /// + /// The directions in which the entity is currently blocking airflow, relative to the grid that the entity is on. + /// I.e., this is a variant of that takes into account the entity's + /// current rotation. + /// [ViewVariables] public int CurrentAirBlockedDirection; - [DataField("airBlocked")] + /// + /// Whether the airtight entity is currently blocking airflow. + /// + [DataField] public bool AirBlocked { get; set; } = true; - [DataField("fixVacuum")] + /// + /// If true, entities on this tile will attempt to draw air from surrounding tiles when they become unblocked + /// and currently have no air. This is generally only required when is + /// true, or if the entity is likely to occupy the same tile as another no-air airtight entity. + /// + [DataField] public bool FixVacuum { get; set; } = true; + // I think fixvacuum exists to ensure that repeatedly closing/opening air-blocking doors doesn't end up + // depressurizing a room. However it can also effectively be used as a means of generating gasses for free + // TODO ATMOS Mass conservation. Make it actually push/pull air from adjacent tiles instead of destroying & creating, + + // TODO ATMOS Do we need these two fields? [DataField("rotateAirBlocked")] public bool RotateAirBlocked { get; set; } = true; + // TODO ATMOS remove this? What is this even for?? [DataField("fixAirBlockedDirectionInitialize")] public bool FixAirBlockedDirectionInitialize { get; set; } = true; - [DataField("noAirWhenFullyAirBlocked")] + /// + /// If true, then the tile that this entity is on will have no air at all if all directions are blocked. + /// + [DataField] public bool NoAirWhenFullyAirBlocked { get; set; } = true; + /// [Access(Other = AccessPermissions.ReadWriteExecute)] public AtmosDirection AirBlockedDirection => (AtmosDirection)CurrentAirBlockedDirection; } diff --git a/Content.Server/Atmos/EntitySystems/AirFilterSystem.cs b/Content.Server/Atmos/EntitySystems/AirFilterSystem.cs index 416045fc5ed..d947e60b6da 100644 --- a/Content.Server/Atmos/EntitySystems/AirFilterSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AirFilterSystem.cs @@ -1,8 +1,6 @@ -using Content.Server.Atmos; using Content.Server.Atmos.Components; using Content.Server.Atmos.Piping.Components; using Content.Shared.Atmos; -using Robust.Shared.GameObjects; using Robust.Shared.Map; using System.Diagnostics.CodeAnalysis; @@ -15,7 +13,6 @@ public sealed class AirFilterSystem : EntitySystem { [Dependency] private readonly AtmosphereSystem _atmosphere = default!; [Dependency] private readonly IMapManager _map = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; public override void Initialize() { diff --git a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs index 548d6a36926..152fba8fc4d 100644 --- a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs @@ -85,8 +85,6 @@ private void OnAirtightMoved(Entity airtight, ref MoveEvent e private bool AirtightMove(Entity ent, ref MoveEvent ev) { var (owner, airtight) = ent; - if (!airtight.RotateAirBlocked || airtight.InitialAirBlockedDirection == (int)AtmosDirection.Invalid) - return false; airtight.CurrentAirBlockedDirection = (int) Rotate((AtmosDirection)airtight.InitialAirBlockedDirection, ev.NewRotation); var pos = airtight.LastPosition; diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.CVars.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.CVars.cs index 3aaa5429fb0..4d50700738b 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.CVars.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.CVars.cs @@ -12,9 +12,14 @@ public sealed partial class AtmosphereSystem public float SpaceWindPressureForceDivisorPush { get; private set; } public float SpaceWindMaxVelocity { get; private set; } public float SpaceWindMaxPushForce { get; private set; } + public float SpaceWindMinimumCalculatedMass { get; private set; } + public float SpaceWindMaximumCalculatedInverseMass { get; private set; } + public bool MonstermosUseExpensiveAirflow { get; private set; } public bool MonstermosEqualization { get; private set; } public bool MonstermosDepressurization { get; private set; } public bool MonstermosRipTiles { get; private set; } + public float MonstermosRipTilesMinimumPressure { get; private set; } + public float MonstermosRipTilesPressureOffset { get; private set; } public bool GridImpulse { get; private set; } public float SpacingEscapeRatio { get; private set; } public float SpacingMinGas { get; private set; } @@ -26,6 +31,7 @@ public sealed partial class AtmosphereSystem public float AtmosTickRate { get; private set; } public float Speedup { get; private set; } public float HeatScale { get; private set; } + public float HumanoidThrowMultiplier { get; private set; } /// /// Time between each atmos sub-update. If you are writing an atmos device, use AtmosDeviceUpdateEvent.dt @@ -41,9 +47,14 @@ private void InitializeCVars() Subs.CVar(_cfg, CCVars.SpaceWindPressureForceDivisorPush, value => SpaceWindPressureForceDivisorPush = value, true); Subs.CVar(_cfg, CCVars.SpaceWindMaxVelocity, value => SpaceWindMaxVelocity = value, true); Subs.CVar(_cfg, CCVars.SpaceWindMaxPushForce, value => SpaceWindMaxPushForce = value, true); + Subs.CVar(_cfg, CCVars.SpaceWindMinimumCalculatedMass, value => SpaceWindMinimumCalculatedMass = value, true); + Subs.CVar(_cfg, CCVars.SpaceWindMaximumCalculatedInverseMass, value => SpaceWindMaximumCalculatedInverseMass = value, true); + Subs.CVar(_cfg, CCVars.MonstermosUseExpensiveAirflow, value => MonstermosUseExpensiveAirflow = value, true); Subs.CVar(_cfg, CCVars.MonstermosEqualization, value => MonstermosEqualization = value, true); Subs.CVar(_cfg, CCVars.MonstermosDepressurization, value => MonstermosDepressurization = value, true); Subs.CVar(_cfg, CCVars.MonstermosRipTiles, value => MonstermosRipTiles = value, true); + Subs.CVar(_cfg, CCVars.MonstermosRipTilesMinimumPressure, value => MonstermosRipTilesMinimumPressure = value, true); + Subs.CVar(_cfg, CCVars.MonstermosRipTilesPressureOffset, value => MonstermosRipTilesPressureOffset = value, true); Subs.CVar(_cfg, CCVars.AtmosGridImpulse, value => GridImpulse = value, true); Subs.CVar(_cfg, CCVars.AtmosSpacingEscapeRatio, value => SpacingEscapeRatio = value, true); Subs.CVar(_cfg, CCVars.AtmosSpacingMinGas, value => SpacingMinGas = value, true); @@ -55,6 +66,7 @@ private void InitializeCVars() Subs.CVar(_cfg, CCVars.AtmosHeatScale, value => { HeatScale = value; InitializeGases(); }, true); Subs.CVar(_cfg, CCVars.ExcitedGroups, value => ExcitedGroups = value, true); Subs.CVar(_cfg, CCVars.ExcitedGroupsSpaceIsAllConsuming, value => ExcitedGroupsSpaceIsAllConsuming = value, true); + Subs.CVar(_cfg, CCVars.AtmosHumanoidThrowMultiplier, value => HumanoidThrowMultiplier = value, true); } } } diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs index d43cc81b0f8..beddef4be7e 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs @@ -399,10 +399,7 @@ private void GridIsHotspotActive(EntityUid uid, GridAtmosphereComponent componen args.Handled = true; } - private void GridFixTileVacuum( - Entity ent, - TileAtmosphere tile, - float volume) + private void GridFixTileVacuum(TileAtmosphere tile) { DebugTools.AssertNotNull(tile.Air); DebugTools.Assert(tile.Air?.Immutable == false ); @@ -416,6 +413,9 @@ private void GridFixTileVacuum( count++; } + if (count == 0) + return; + var ratio = 1f / count; var totalTemperature = 0f; diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs index cb50ff114e0..461435f0624 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs @@ -1,5 +1,6 @@ using Content.Server.Atmos.Components; using Content.Shared.Atmos; +using Content.Shared.Humanoid; using Content.Shared.Mobs.Components; using Content.Shared.Physics; using Robust.Shared.Audio; @@ -49,8 +50,7 @@ private void UpdateHighPressure(float frameTime) comp.Accumulator = 0f; toRemove.Add(ent); - if (HasComp(uid) && - TryComp(uid, out var body)) + if (TryComp(uid, out var body)) { _physics.SetBodyStatus(uid, body, BodyStatus.OnGround); } @@ -70,27 +70,10 @@ private void UpdateHighPressure(float frameTime) } } - private void AddMobMovedByPressure(EntityUid uid, MovedByPressureComponent component, PhysicsComponent body) - { - if (!TryComp(uid, out var fixtures)) - return; - - _physics.SetBodyStatus(uid, body, BodyStatus.InAir); - - foreach (var (id, fixture) in fixtures.Fixtures) - { - _physics.RemoveCollisionMask(uid, id, fixture, (int) CollisionGroup.TableLayer, manager: fixtures); - } - - // TODO: Make them dynamic type? Ehh but they still want movement so uhh make it non-predicted like weightless? - // idk it's hard. - - component.Accumulator = 0f; - _activePressures.Add((uid, component)); - } - private void HighPressureMovements(Entity gridAtmosphere, TileAtmosphere tile, EntityQuery bodies, EntityQuery xforms, EntityQuery pressureQuery, EntityQuery metas) { + if (tile.PressureDifference < SpaceWindMinimumCalculatedMass * SpaceWindMinimumCalculatedMass) + return; // TODO ATMOS finish this // Don't play the space wind sound on tiles that are on fire... @@ -120,7 +103,8 @@ private void HighPressureMovements(Entity gridAtmospher var gridWorldRotation = xforms.GetComponent(gridAtmosphere).WorldRotation; // If we're using monstermos, smooth out the yeet direction to follow the flow - if (MonstermosEqualization) + //TODO This is bad, don't run this. It just makes the throws worse by somehow rounding them to orthogonal + if (!MonstermosEqualization) { // We step through tiles according to the pressure direction on the current tile. // The goal is to get a general direction of the airflow in the area. @@ -160,7 +144,7 @@ private void HighPressureMovements(Entity gridAtmospher (entity, pressureMovements), gridAtmosphere.Comp.UpdateCounter, tile.PressureDifference, - tile.PressureDirection, 0, + tile.PressureDirection, tile.PressureSpecificTarget != null ? _mapSystem.ToCenterCoordinates(tile.GridIndex, tile.PressureSpecificTarget.GridIndices) : EntityCoordinates.Invalid, gridWorldRotation, xforms.GetComponent(entity), @@ -181,12 +165,29 @@ private void ConsiderPressureDifference(GridAtmosphereComponent gridAtmosphere, tile.PressureDirection = differenceDirection; } + //INFO The EE version of this function drops pressureResistanceProbDelta, since it's not needed. If you are for whatever reason calling this function + //INFO And if it isn't working, you've probably still got the pressureResistanceProbDelta line included. + /// + /// EXPLANATION: + /// pressureDifference = Force of Air Flow on a given tile + /// physics.Mass = Mass of the object potentially being thrown + /// physics.InvMass = 1 divided by said Mass. More CPU efficient way to do division. + /// + /// Objects can only be thrown if the force of air flow is greater than the SQUARE of their mass or {SpaceWindMinimumCalculatedMass}, whichever is heavier + /// This means that the heavier an object is, the exponentially more force is required to move it + /// The force of a throw is equal to the force of air pressure, divided by an object's mass. So not only are heavier objects + /// less likely to be thrown, they are also harder to throw, + /// while lighter objects are yeeted easily, and from great distance. + /// + /// For a human sized entity with a standard weight of 80kg and a spacing between a hard vacuum and a room pressurized at 101kpa, + /// The human shall only be moved if he is either very close to the hole, or is standing in a region of high airflow + /// + public void ExperiencePressureDifference( Entity ent, int cycle, float pressureDifference, AtmosDirection direction, - float pressureResistanceProbDelta, EntityCoordinates throwTarget, Angle gridWorldRotation, TransformComponent? xform = null, @@ -199,50 +200,28 @@ public void ExperiencePressureDifference( if (!Resolve(uid, ref xform)) return; - // TODO ATMOS stuns? - - var maxForce = MathF.Sqrt(pressureDifference) * 2.25f; - var moveProb = 100f; - if (component.PressureResistance > 0) - moveProb = MathF.Abs((pressureDifference / component.PressureResistance * MovedByPressureComponent.ProbabilityBasePercent) - - MovedByPressureComponent.ProbabilityOffset); - - // Can we yeet the thing (due to probability, strength, etc.) - if (moveProb > MovedByPressureComponent.ProbabilityOffset && _robustRandom.Prob(MathF.Min(moveProb / 100f, 1f)) - && !float.IsPositiveInfinity(component.MoveResist) - && (physics.BodyType != BodyType.Static - && (maxForce >= (component.MoveResist * MovedByPressureComponent.MoveForcePushRatio))) - || (physics.BodyType == BodyType.Static && (maxForce >= (component.MoveResist * MovedByPressureComponent.MoveForceForcePushRatio)))) + if (physics.BodyType != BodyType.Static + && !float.IsPositiveInfinity(component.MoveResist)) { - if (HasComp(uid)) + var moveForce = pressureDifference * MathF.Max(physics.InvMass, SpaceWindMaximumCalculatedInverseMass); + if (HasComp(ent)) + moveForce *= HumanoidThrowMultiplier; + if (moveForce > physics.Mass) { - AddMobMovedByPressure(uid, component, physics); - } - - if (maxForce > MovedByPressureComponent.ThrowForce) - { - var moveForce = maxForce; - moveForce /= (throwTarget != EntityCoordinates.Invalid) ? SpaceWindPressureForceDivisorThrow : SpaceWindPressureForceDivisorPush; - moveForce *= MathHelper.Clamp(moveProb, 0, 100); - - // Apply a sanity clamp to prevent being thrown through objects. - var maxSafeForceForObject = SpaceWindMaxVelocity * physics.Mass; - moveForce = MathF.Min(moveForce, maxSafeForceForObject); - // Grid-rotation adjusted direction var dirVec = (direction.ToAngle() + gridWorldRotation).ToWorldVec(); + moveForce *= MathF.Max(physics.InvMass, SpaceWindMaximumCalculatedInverseMass); - // TODO: Technically these directions won't be correct but uhh I'm just here for optimisations buddy not to fix my old bugs. + //TODO Consider replacing throw target with proper trigonometry angles. if (throwTarget != EntityCoordinates.Invalid) { - var pos = ((throwTarget.ToMap(EntityManager, _transformSystem).Position - xform.WorldPosition).Normalized() + dirVec).Normalized(); - _physics.ApplyLinearImpulse(uid, pos * moveForce, body: physics); + var pos = throwTarget.ToMap(EntityManager, _transformSystem).Position - xform.WorldPosition + dirVec; + _throwing.TryThrow(uid, pos.Normalized() * MathF.Min(moveForce, SpaceWindMaxVelocity), moveForce); } else { - moveForce = MathF.Min(moveForce, SpaceWindMaxPushForce); - _physics.ApplyLinearImpulse(uid, dirVec * moveForce, body: physics); + _throwing.TryThrow(uid, dirVec.Normalized() * MathF.Min(moveForce, SpaceWindMaxVelocity), moveForce); } component.LastHighPressureMovementAirCycle = cycle; diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs index dcbc1e86ee2..1ba9a48aa0c 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs @@ -5,11 +5,13 @@ using Content.Shared.Atmos; using Content.Shared.Atmos.Components; using Content.Shared.Database; +using Content.Shared.Maps; +using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; +using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Utility; - namespace Content.Server.Atmos.EntitySystems { public sealed partial class AtmosphereSystem @@ -137,7 +139,7 @@ private void EqualizePressureInZone( var logN = MathF.Log2(tileCount); // Optimization - try to spread gases using an O(n log n) algorithm that has a chance of not working first to avoid O(n^2) - if (giverTilesLength > logN && takerTilesLength > logN) + if (!MonstermosUseExpensiveAirflow && giverTilesLength > logN && takerTilesLength > logN) { // Even if it fails, it will speed up the next part. Array.Sort(_equalizeTiles, 0, tileCount, _monstermosComparer); @@ -550,7 +552,8 @@ private void ExplosivelyDepressurize( } InvalidateVisuals(otherTile.GridIndex, otherTile.GridIndices, visuals); - HandleDecompressionFloorRip(mapGrid, otherTile, otherTile.MonstermosInfo.CurrentTransferAmount); + if (MonstermosRipTiles && otherTile.PressureDifference > MonstermosRipTilesMinimumPressure) + HandleDecompressionFloorRip(mapGrid, otherTile, otherTile.PressureDifference); } if (GridImpulse && tileCount > 0) @@ -676,14 +679,14 @@ private void AdjustEqMovement(TileAtmosphere tile, AtmosDirection direction, flo adj.MonstermosInfo[direction.GetOpposite()] -= amount; } - private void HandleDecompressionFloorRip(MapGridComponent mapGrid, TileAtmosphere tile, float sum) + private void HandleDecompressionFloorRip(MapGridComponent mapGrid, TileAtmosphere tile, float delta) { - if (!MonstermosRipTiles) + if (!mapGrid.TryGetTileRef(tile.GridIndices, out var tileRef)) return; + var tileref = tileRef.Tile; - var chance = MathHelper.Clamp(0.01f + (sum / SpacingMaxWind) * 0.3f, 0.003f, 0.3f); - - if (sum > 20 && _robustRandom.Prob(chance)) + var tileDef = (ContentTileDefinition) _tileDefinitionManager[tileref.TypeId]; + if (!tileDef.Reinforced && tileDef.TileRipResistance < delta * MonstermosRipTilesPressureOffset) PryTile(mapGrid, tile.GridIndices); } diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs index 1f3ca2145b9..eba398c1821 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs @@ -272,7 +272,7 @@ private void UpdateTileAir( tile.Air = new GasMixture(volume){Temperature = Atmospherics.T20C}; if (data.FixVacuum) - GridFixTileVacuum(ent, tile, volume); + GridFixTileVacuum(tile); } private void QueueRunTiles( diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs index 9b0d0d9670d..67c6d5998dd 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs @@ -78,12 +78,13 @@ private AirtightData GetAirtightData(EntityUid uid, MapGridComponent grid, Vecto if (!_airtightQuery.TryGetComponent(ent, out var airtight)) continue; + fixVacuum |= airtight.FixVacuum; + if(!airtight.AirBlocked) continue; blockedDirs |= airtight.AirBlockedDirection; noAirWhenBlocked |= airtight.NoAirWhenFullyAirBlocked; - fixVacuum |= airtight.FixVacuum; if (blockedDirs == AtmosDirection.All && noAirWhenBlocked && fixVacuum) break; diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs index d2f40e77169..39425157ad4 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs @@ -6,6 +6,7 @@ using Content.Shared.Atmos.EntitySystems; using Content.Shared.Doors.Components; using Content.Shared.Maps; +using Content.Shared.Throwing; using JetBrains.Annotations; using Robust.Server.GameObjects; using Robust.Shared.Audio.Systems; @@ -37,6 +38,7 @@ public sealed partial class AtmosphereSystem : SharedAtmosphereSystem [Dependency] private readonly TileSystem _tile = default!; [Dependency] private readonly MapSystem _map = default!; [Dependency] public readonly PuddleSystem Puddle = default!; + [Dependency] private readonly ThrowingSystem _throwing = default!; private const float ExposedUpdateDelay = 1f; private float _exposedTimer = 0f; diff --git a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs index dfe84473402..aed00432e1f 100644 --- a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs +++ b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs @@ -1,4 +1,3 @@ -using System.Numerics; using Content.Server.Atmos.Components; using Content.Server.Body.Components; using Content.Server.Body.Systems; @@ -17,8 +16,6 @@ using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; -using Robust.Shared.Physics.Systems; -using Robust.Shared.Player; using Robust.Shared.Random; namespace Content.Server.Atmos.EntitySystems @@ -33,7 +30,6 @@ public sealed class GasTankSystem : EntitySystem [Dependency] private readonly SharedContainerSystem _containers = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!; - [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ThrowingSystem _throwing = default!; diff --git a/Content.Server/Atmos/GasMixture.cs b/Content.Server/Atmos/GasMixture.cs index 77fd7018333..3d73a4d0b16 100644 --- a/Content.Server/Atmos/GasMixture.cs +++ b/Content.Server/Atmos/GasMixture.cs @@ -62,9 +62,9 @@ public float Temperature get => _temperature; set { - DebugTools.Assert(!float.IsNaN(_temperature)); - if (Immutable) return; - _temperature = MathF.Min(MathF.Max(value, Atmospherics.TCMB), Atmospherics.Tmax); + DebugTools.Assert(!float.IsNaN(value)); + if (!Immutable) + _temperature = MathF.Min(MathF.Max(value, Atmospherics.TCMB), Atmospherics.Tmax); } } @@ -91,6 +91,7 @@ public GasMixture(float[] moles, float temp, float volume = Atmospherics.CellVol if (volume < 0) volume = 0; + DebugTools.Assert(!float.IsNaN(temp)); _temperature = temp; Moles = moles; Volume = volume; diff --git a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs index 10b9cccc099..8e478bd2b54 100644 --- a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs +++ b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs @@ -27,7 +27,6 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems public sealed class GasVolumePumpSystem : EntitySystem { [Dependency] private readonly IAdminLogManager _adminLogger = default!; - [Dependency] private readonly TransformSystem _transformSystem = default!; [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; [Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!; [Dependency] private readonly SharedAmbientSoundSystem _ambientSoundSystem = default!; diff --git a/Content.Server/Atmos/Piping/EntitySystems/AtmosPipeAppearanceSystem.cs b/Content.Server/Atmos/Piping/EntitySystems/AtmosPipeAppearanceSystem.cs index 6fbf60f403d..10049e273bc 100644 --- a/Content.Server/Atmos/Piping/EntitySystems/AtmosPipeAppearanceSystem.cs +++ b/Content.Server/Atmos/Piping/EntitySystems/AtmosPipeAppearanceSystem.cs @@ -3,14 +3,12 @@ using Content.Server.NodeContainer.Nodes; using Content.Shared.Atmos; using Content.Shared.Atmos.Components; -using Robust.Server.GameObjects; -using Robust.Shared.Map; +using Robust.Shared.Map.Components; namespace Content.Server.Atmos.Piping.EntitySystems; public sealed class AtmosPipeAppearanceSystem : EntitySystem { - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; public override void Initialize() @@ -31,7 +29,7 @@ private void UpdateAppearance(EntityUid uid, AppearanceComponent? appearance = n if (!Resolve(uid, ref appearance, ref container, ref xform, false)) return; - if (!_mapManager.TryGetGrid(xform.GridUid, out var grid)) + if (!TryComp(xform.GridUid, out var grid)) return; // get connected entities diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs index ad647fad1b8..170586339db 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs @@ -13,7 +13,6 @@ using Content.Shared.Atmos.Piping.Binary.Components; using Content.Shared.Containers.ItemSlots; using Content.Shared.Database; -using Content.Shared.Hands.EntitySystems; using Content.Shared.Interaction; using Content.Shared.Lock; using Robust.Server.GameObjects; @@ -29,8 +28,6 @@ public sealed class GasCanisterSystem : EntitySystem [Dependency] private readonly IAdminLogManager _adminLogger = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedContainerSystem _container = default!; - [Dependency] private readonly SharedHandsSystem _hands = default!; [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!; [Dependency] private readonly NodeContainerSystem _nodeContainer = default!; diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasPortableSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasPortableSystem.cs index b1caa6c197e..4ddd19dd45e 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasPortableSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasPortableSystem.cs @@ -7,15 +7,14 @@ using Content.Shared.Atmos.Piping.Unary.Components; using Content.Shared.Construction.Components; using JetBrains.Annotations; -using Robust.Server.GameObjects; using Robust.Shared.Map; +using Robust.Shared.Map.Components; namespace Content.Server.Atmos.Piping.Unary.EntitySystems { [UsedImplicitly] public sealed class GasPortableSystem : EntitySystem { - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly NodeContainerSystem _nodeContainer = default!; @@ -58,7 +57,7 @@ public bool FindGasPortIn(EntityUid? gridId, EntityCoordinates coordinates, [Not { port = null; - if (!_mapManager.TryGetGrid(gridId, out var grid)) + if (!TryComp(gridId, out var grid)) return false; foreach (var entityUid in grid.GetLocal(coordinates)) diff --git a/Content.Server/Atmos/Serialization/TileAtmosCollectionSerializer.cs b/Content.Server/Atmos/Serialization/TileAtmosCollectionSerializer.cs index 71e4c2d0def..00be83e86d9 100644 --- a/Content.Server/Atmos/Serialization/TileAtmosCollectionSerializer.cs +++ b/Content.Server/Atmos/Serialization/TileAtmosCollectionSerializer.cs @@ -26,7 +26,7 @@ public Dictionary Read(ISerializationManager serializa { node.TryGetValue(new ValueDataNode("version"), out var versionNode); var version = ((ValueDataNode?) versionNode)?.AsInt() ?? 1; - Dictionary tiles; + Dictionary tiles = new(); // Backwards compatability if (version == 1) @@ -36,8 +36,6 @@ public Dictionary Read(ISerializationManager serializa var mixies = serializationManager.Read?>(tile2, hookCtx, context); var unique = serializationManager.Read?>(node["uniqueMixes"], hookCtx, context); - tiles = new Dictionary(); - if (unique != null && mixies != null) { foreach (var (indices, mix) in mixies) @@ -58,15 +56,14 @@ public Dictionary Read(ISerializationManager serializa else { var dataNode = (MappingDataNode) node["data"]; - var tileNode = (MappingDataNode) dataNode["tiles"]; var chunkSize = serializationManager.Read(dataNode["chunkSize"], hookCtx, context); - var unique = serializationManager.Read?>(dataNode["uniqueMixes"], hookCtx, context); - - tiles = new Dictionary(); + dataNode.TryGetValue(new ValueDataNode("uniqueMixes"), out var mixNode); + var unique = mixNode == null ? null : serializationManager.Read?>(mixNode, hookCtx, context); if (unique != null) { + var tileNode = (MappingDataNode) dataNode["tiles"]; foreach (var (chunkNode, valueNode) in tileNode) { var chunkOrigin = serializationManager.Read(chunkNode, hookCtx, context); diff --git a/Content.Server/Atmos/TileAtmosphere.cs b/Content.Server/Atmos/TileAtmosphere.cs index 0dd35a29e76..0026dbbf4f0 100644 --- a/Content.Server/Atmos/TileAtmosphere.cs +++ b/Content.Server/Atmos/TileAtmosphere.cs @@ -28,6 +28,9 @@ public sealed class TileAtmosphere : IGasMixtureHolder [ViewVariables] public TileAtmosphere? PressureSpecificTarget { get; set; } + /// + /// This is either the pressure difference, or the quantity of moles transferred if monstermos is enabled. + /// [ViewVariables] public float PressureDifference { get; set; } diff --git a/Content.Server/Bed/BedSystem.cs b/Content.Server/Bed/BedSystem.cs index 131bd4b1829..49021c142f4 100644 --- a/Content.Server/Bed/BedSystem.cs +++ b/Content.Server/Bed/BedSystem.cs @@ -93,9 +93,8 @@ private void OnBuckleChange(EntityUid uid, StasisBedComponent component, ref Buc if (!this.IsPowered(uid, EntityManager)) return; - var metabolicEvent = new ApplyMetabolicMultiplierEvent - {Uid = args.BuckledEntity, Multiplier = component.Multiplier, Apply = args.Buckling}; - RaiseLocalEvent(args.BuckledEntity, metabolicEvent); + var metabolicEvent = new ApplyMetabolicMultiplierEvent(args.BuckledEntity, component.Multiplier, args.Buckling); + RaiseLocalEvent(args.BuckledEntity, ref metabolicEvent); } private void OnPowerChanged(EntityUid uid, StasisBedComponent component, ref PowerChangedEvent args) @@ -121,9 +120,8 @@ private void UpdateMetabolisms(EntityUid uid, StasisBedComponent component, bool foreach (var buckledEntity in strap.BuckledEntities) { - var metabolicEvent = new ApplyMetabolicMultiplierEvent - {Uid = buckledEntity, Multiplier = component.Multiplier, Apply = shouldApply}; - RaiseLocalEvent(buckledEntity, metabolicEvent); + var metabolicEvent = new ApplyMetabolicMultiplierEvent(buckledEntity, component.Multiplier, shouldApply); + RaiseLocalEvent(buckledEntity, ref metabolicEvent); } } } diff --git a/Content.Server/Body/Commands/AddHandCommand.cs b/Content.Server/Body/Commands/AddHandCommand.cs index 655d0c88f9b..3e006c539c7 100644 --- a/Content.Server/Body/Commands/AddHandCommand.cs +++ b/Content.Server/Body/Commands/AddHandCommand.cs @@ -34,7 +34,6 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) switch (args.Length) { case 0: - { if (player == null) { shell.WriteLine("Only a player can run this command without arguments."); @@ -50,71 +49,68 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) entity = player.AttachedEntity.Value; hand = _entManager.SpawnEntity(DefaultHandPrototype, _entManager.GetComponent(entity).Coordinates); break; - } case 1: - { - if (NetEntity.TryParse(args[0], out var uidNet) && _entManager.TryGetEntity(uidNet, out var uid)) { - if (!_entManager.EntityExists(uid)) + if (NetEntity.TryParse(args[0], out var uidNet) && _entManager.TryGetEntity(uidNet, out var uid)) { - shell.WriteLine($"No entity found with uid {uid}"); - return; + if (!_entManager.EntityExists(uid)) + { + shell.WriteLine($"No entity found with uid {uid}"); + return; + } + + entity = uid.Value; + hand = _entManager.SpawnEntity(DefaultHandPrototype, _entManager.GetComponent(entity).Coordinates); + } + else + { + if (player == null) + { + shell.WriteLine("You must specify an entity to add a hand to when using this command from the server terminal."); + return; + } + + if (player.AttachedEntity == null) + { + shell.WriteLine("You don't have an entity to add a hand to."); + return; + } + + entity = player.AttachedEntity.Value; + hand = _entManager.SpawnEntity(args[0], _entManager.GetComponent(entity).Coordinates); } - entity = uid.Value; - hand = _entManager.SpawnEntity(DefaultHandPrototype, _entManager.GetComponent(entity).Coordinates); + break; } - else + case 2: { - if (player == null) + if (!NetEntity.TryParse(args[0], out var netEnt) || !_entManager.TryGetEntity(netEnt, out var uid)) { - shell.WriteLine("You must specify an entity to add a hand to when using this command from the server terminal."); + shell.WriteLine($"{args[0]} is not a valid entity uid."); return; } - if (player.AttachedEntity == null) + if (!_entManager.EntityExists(uid)) { - shell.WriteLine("You don't have an entity to add a hand to."); + shell.WriteLine($"No entity exists with uid {uid}."); return; } - entity = player.AttachedEntity.Value; - hand = _entManager.SpawnEntity(args[0], _entManager.GetComponent(entity).Coordinates); - } - - break; - } - case 2: - { - if (!NetEntity.TryParse(args[0], out var netEnt) || !_entManager.TryGetEntity(netEnt, out var uid)) - { - shell.WriteLine($"{args[0]} is not a valid entity uid."); - return; - } + entity = uid.Value; - if (!_entManager.EntityExists(uid)) - { - shell.WriteLine($"No entity exists with uid {uid}."); - return; - } + if (!_protoManager.HasIndex(args[1])) + { + shell.WriteLine($"No hand entity exists with id {args[1]}."); + return; + } - entity = uid.Value; + hand = _entManager.SpawnEntity(args[1], _entManager.GetComponent(entity).Coordinates); - if (!_protoManager.HasIndex(args[1])) - { - shell.WriteLine($"No hand entity exists with id {args[1]}."); - return; + break; } - - hand = _entManager.SpawnEntity(args[1], _entManager.GetComponent(entity).Coordinates); - - break; - } default: - { shell.WriteLine(Help); return; - } } if (!_entManager.TryGetComponent(entity, out BodyComponent? body) || body.RootContainer.ContainedEntity == null) @@ -139,7 +135,7 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) var slotId = part.GetHashCode().ToString(); - if (!bodySystem.TryCreatePartSlotAndAttach(attachAt.Id, slotId, hand, BodyPartType.Hand,attachAt.Component, part)) + if (!bodySystem.TryCreatePartSlotAndAttach(attachAt.Id, slotId, hand, BodyPartType.Hand, attachAt.Component, part)) { shell.WriteError($"Couldn't create a slot with id {slotId} on entity {_entManager.ToPrettyString(entity)}"); return; diff --git a/Content.Server/Body/Commands/AttachBodyPartCommand.cs b/Content.Server/Body/Commands/AttachBodyPartCommand.cs index 24604b88b7a..82f71619370 100644 --- a/Content.Server/Body/Commands/AttachBodyPartCommand.cs +++ b/Content.Server/Body/Commands/AttachBodyPartCommand.cs @@ -103,11 +103,11 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) // ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract if (body.RootContainer.ContainedEntity != null) { - bodySystem.AttachPartToRoot(bodyId,partUid.Value, body ,part); + bodySystem.AttachPartToRoot(bodyId, partUid.Value, body, part); } else { - var (rootPartId,rootPart) = bodySystem.GetRootPartOrNull(bodyId, body)!.Value; + var (rootPartId, rootPart) = bodySystem.GetRootPartOrNull(bodyId, body)!.Value; if (!bodySystem.TryCreatePartSlotAndAttach(rootPartId, slotId, partUid.Value, part.PartType, rootPart, part)) { shell.WriteError($"Could not create slot {slotId} on entity {_entManager.ToPrettyString(bodyId)}"); diff --git a/Content.Server/Body/Components/BeingGibbedEvent.cs b/Content.Server/Body/Components/BeingGibbedEvent.cs index 66b52af47bd..a010855f784 100644 --- a/Content.Server/Body/Components/BeingGibbedEvent.cs +++ b/Content.Server/Body/Components/BeingGibbedEvent.cs @@ -1,11 +1,7 @@ namespace Content.Server.Body.Components; -public sealed class BeingGibbedEvent : EntityEventArgs -{ - public readonly HashSet GibbedParts; - - public BeingGibbedEvent(HashSet gibbedParts) - { - GibbedParts = gibbedParts; - } -} +/// +/// Raised when a body gets gibbed, before it is deleted. +/// +[ByRefEvent] +public readonly record struct BeingGibbedEvent(HashSet GibbedParts); diff --git a/Content.Server/Body/Components/BloodstreamComponent.cs b/Content.Server/Body/Components/BloodstreamComponent.cs index 7041df44481..d448c4aab21 100644 --- a/Content.Server/Body/Components/BloodstreamComponent.cs +++ b/Content.Server/Body/Components/BloodstreamComponent.cs @@ -1,11 +1,13 @@ using Content.Server.Body.Systems; using Content.Server.Chemistry.EntitySystems; using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Reagent; using Content.Shared.Damage; using Content.Shared.Damage.Prototypes; using Content.Shared.FixedPoint; using Robust.Shared.Audio; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Server.Body.Components { @@ -16,7 +18,17 @@ public sealed partial class BloodstreamComponent : Component public static string DefaultBloodSolutionName = "bloodstream"; public static string DefaultBloodTemporarySolutionName = "bloodstreamTemporary"; - public float AccumulatedFrametime = 0.0f; + /// + /// The next time that blood level will be updated and bloodloss damage dealt. + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + public TimeSpan NextUpdate; + + /// + /// The interval at which this component updates. + /// + [DataField] + public TimeSpan UpdateInterval = TimeSpan.FromSeconds(3); /// /// How much is this entity currently bleeding? @@ -32,7 +44,7 @@ public sealed partial class BloodstreamComponent : Component public float BleedAmount; /// - /// How much should bleeding should be reduced every update interval? + /// How much should bleeding be reduced every update interval? /// [DataField] public float BleedReductionAmount = 0.33f; @@ -63,18 +75,12 @@ public sealed partial class BloodstreamComponent : Component [DataField(required: true)] public DamageSpecifier BloodlossHealDamage = new(); - /// - /// How frequently should this bloodstream update, in seconds? - /// - [DataField] - public float UpdateInterval = 3.0f; - // TODO shouldn't be hardcoded, should just use some organ simulation like bone marrow or smth. /// /// How much reagent of blood should be restored each update interval? /// [DataField] - public float BloodRefreshAmount = 1.0f; + public FixedPoint2 BloodRefreshAmount = 1.0f; /// /// How much blood needs to be in the temporary solution in order to create a puddle? @@ -89,8 +95,8 @@ public sealed partial class BloodstreamComponent : Component /// /// For example, piercing damage is increased while poison damage is nullified entirely. /// - [DataField(customTypeSerializer:typeof(PrototypeIdSerializer))] - public string DamageBleedModifiers = "BloodlossHuman"; + [DataField] + public ProtoId DamageBleedModifiers = "BloodlossHuman"; /// /// The sound to be played when a weapon instantly deals blood loss damage. @@ -126,7 +132,7 @@ public sealed partial class BloodstreamComponent : Component /// Slime-people might use slime as their blood or something like that. /// [DataField] - public string BloodReagent = "Blood"; + public ProtoId BloodReagent = "Blood"; /// Name/Key that is indexed by. [DataField] @@ -164,6 +170,6 @@ public sealed partial class BloodstreamComponent : Component /// Variable that stores the amount of status time added by having a low blood level. /// [ViewVariables(VVAccess.ReadWrite)] - public float StatusTime; + public TimeSpan StatusTime; } } diff --git a/Content.Server/Body/Components/InternalsComponent.cs b/Content.Server/Body/Components/InternalsComponent.cs index 4eda008b0f9..18caab8dcf0 100644 --- a/Content.Server/Body/Components/InternalsComponent.cs +++ b/Content.Server/Body/Components/InternalsComponent.cs @@ -1,4 +1,3 @@ -using System.Threading; namespace Content.Server.Body.Components { /// @@ -7,14 +6,17 @@ namespace Content.Server.Body.Components [RegisterComponent] public sealed partial class InternalsComponent : Component { - [ViewVariables] public EntityUid? GasTankEntity { get; set; } - [ViewVariables] public EntityUid? BreathToolEntity { get; set; } + [ViewVariables] + public EntityUid? GasTankEntity; + + [ViewVariables] + public EntityUid? BreathToolEntity; /// - /// Toggle Internals delay (seconds) when the target is not you. + /// Toggle Internals delay when the target is not you. /// [ViewVariables(VVAccess.ReadWrite)] - [DataField("delay")] - public float Delay = 3; + [DataField] + public TimeSpan Delay = TimeSpan.FromSeconds(3); } } diff --git a/Content.Server/Body/Components/LungComponent.cs b/Content.Server/Body/Components/LungComponent.cs index 0656ef8fad3..46600b30207 100644 --- a/Content.Server/Body/Components/LungComponent.cs +++ b/Content.Server/Body/Components/LungComponent.cs @@ -1,4 +1,4 @@ -using Content.Server.Atmos; +using Content.Server.Atmos; using Content.Server.Body.Systems; using Content.Shared.Alert; using Content.Shared.Atmos; @@ -11,7 +11,7 @@ public sealed partial class LungComponent : Component { [DataField] [Access(typeof(LungSystem), Other = AccessPermissions.ReadExecute)] // FIXME Friends - public GasMixture Air { get; set; } = new() + public GasMixture Air = new() { Volume = 6, Temperature = Atmospherics.NormalBodyTemperature diff --git a/Content.Server/Body/Components/MetabolizerComponent.cs b/Content.Server/Body/Components/MetabolizerComponent.cs index a8c82f3d369..90c99df7db2 100644 --- a/Content.Server/Body/Components/MetabolizerComponent.cs +++ b/Content.Server/Body/Components/MetabolizerComponent.cs @@ -1,8 +1,8 @@ -using Content.Server.Body.Systems; +using Content.Server.Body.Systems; using Content.Shared.Body.Prototypes; using Content.Shared.FixedPoint; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Server.Body.Components { @@ -12,20 +12,24 @@ namespace Content.Server.Body.Components [RegisterComponent, Access(typeof(MetabolizerSystem))] public sealed partial class MetabolizerComponent : Component { - public float AccumulatedFrametime = 0.0f; + /// + /// The next time that reagents will be metabolized. + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + public TimeSpan NextUpdate; /// - /// How often to metabolize reagents, in seconds. + /// How often to metabolize reagents. /// /// [DataField] - public float UpdateFrequency = 1.0f; + public TimeSpan UpdateInterval = TimeSpan.FromSeconds(1); /// /// From which solution will this metabolizer attempt to metabolize chemicals /// [DataField("solution")] - public string SolutionName { get; set; } = BloodstreamComponent.DefaultChemicalsSolutionName; + public string SolutionName = BloodstreamComponent.DefaultChemicalsSolutionName; /// /// Does this component use a solution on it's parent entity (the body) or itself @@ -39,9 +43,9 @@ public sealed partial class MetabolizerComponent : Component /// /// List of metabolizer types that this organ is. ex. Human, Slime, Felinid, w/e. /// - [DataField(customTypeSerializer:typeof(PrototypeIdHashSetSerializer))] + [DataField] [Access(typeof(MetabolizerSystem), Other = AccessPermissions.ReadExecute)] // FIXME Friends - public HashSet? MetabolizerTypes = null; + public HashSet>? MetabolizerTypes = null; /// /// Should this metabolizer remove chemicals that have no metabolisms defined? @@ -72,8 +76,8 @@ public sealed partial class MetabolizerComponent : Component [DataDefinition] public sealed partial class MetabolismGroupEntry { - [DataField(required: true, customTypeSerializer:typeof(PrototypeIdSerializer))] - public string Id = default!; + [DataField(required: true)] + public ProtoId Id = default!; [DataField("rateModifier")] public FixedPoint2 MetabolismRateModifier = 1.0; diff --git a/Content.Server/Body/Components/RespiratorComponent.cs b/Content.Server/Body/Components/RespiratorComponent.cs index 9f080a3dd9d..4045e21e26a 100644 --- a/Content.Server/Body/Components/RespiratorComponent.cs +++ b/Content.Server/Body/Components/RespiratorComponent.cs @@ -1,5 +1,6 @@ using Content.Server.Body.Systems; using Content.Shared.Damage; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Server.Body.Components { @@ -7,36 +8,49 @@ namespace Content.Server.Body.Components public sealed partial class RespiratorComponent : Component { /// - /// Saturation level. Reduced by CycleDelay each tick. + /// The next time that this body will inhale or exhale. + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + public TimeSpan NextUpdate; + + /// + /// The interval between updates. Each update is either inhale or exhale, + /// so a full cycle takes twice as long. + /// + [DataField] + public TimeSpan UpdateInterval = TimeSpan.FromSeconds(2); + + /// + /// Saturation level. Reduced by UpdateInterval each tick. /// Can be thought of as 'how many seconds you have until you start suffocating' in this configuration. /// - [DataField("saturation")] + [DataField] public float Saturation = 5.0f; /// /// At what level of saturation will you begin to suffocate? /// - [DataField("suffocationThreshold")] + [DataField] public float SuffocationThreshold; - [DataField("maxSaturation")] + [DataField] public float MaxSaturation = 5.0f; - [DataField("minSaturation")] + [DataField] public float MinSaturation = -2.0f; // TODO HYPEROXIA? - [DataField("damage", required: true)] + [DataField(required: true)] [ViewVariables(VVAccess.ReadWrite)] public DamageSpecifier Damage = default!; - [DataField("damageRecovery", required: true)] + [DataField(required: true)] [ViewVariables(VVAccess.ReadWrite)] public DamageSpecifier DamageRecovery = default!; - [DataField("gaspPopupCooldown")] - public TimeSpan GaspPopupCooldown { get; private set; } = TimeSpan.FromSeconds(8); + [DataField] + public TimeSpan GaspPopupCooldown = TimeSpan.FromSeconds(8); [ViewVariables] public TimeSpan LastGaspPopupTime; @@ -55,11 +69,6 @@ public sealed partial class RespiratorComponent : Component [ViewVariables] public RespiratorStatus Status = RespiratorStatus.Inhaling; - - [DataField("cycleDelay")] - public float CycleDelay = 2.0f; - - public float AccumulatedFrametime; } } diff --git a/Content.Server/Body/Components/StomachComponent.cs b/Content.Server/Body/Components/StomachComponent.cs index fe93468f74e..d541ca4d7c4 100644 --- a/Content.Server/Body/Components/StomachComponent.cs +++ b/Content.Server/Body/Components/StomachComponent.cs @@ -1,21 +1,26 @@ -using Content.Server.Body.Systems; +using Content.Server.Body.Systems; using Content.Server.Nutrition.EntitySystems; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reagent; using Content.Shared.Whitelist; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Server.Body.Components { [RegisterComponent, Access(typeof(StomachSystem), typeof(FoodSystem))] public sealed partial class StomachComponent : Component { - public float AccumulatedFrameTime; + /// + /// The next time that the stomach will try to digest its contents. + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + public TimeSpan NextUpdate; /// - /// How fast should this component update, in seconds? + /// The interval at which this stomach digests its contents. /// [DataField] - public float UpdateInterval = 1.0f; + public TimeSpan UpdateInterval = TimeSpan.FromSeconds(1); /// /// The solution inside of this stomach this transfers reagents to the body. @@ -30,11 +35,11 @@ public sealed partial class StomachComponent : Component public string BodySolutionName = BloodstreamComponent.DefaultChemicalsSolutionName; /// - /// Time in seconds between reagents being ingested and them being + /// Time between reagents being ingested and them being /// transferred to /// [DataField] - public float DigestionDelay = 20; + public TimeSpan DigestionDelay = TimeSpan.FromSeconds(20); /// /// A whitelist for what special-digestible-required foods this stomach is capable of eating. @@ -54,15 +59,15 @@ public sealed partial class StomachComponent : Component public sealed class ReagentDelta { public readonly ReagentQuantity ReagentQuantity; - public float Lifetime { get; private set; } + public TimeSpan Lifetime { get; private set; } public ReagentDelta(ReagentQuantity reagentQuantity) { ReagentQuantity = reagentQuantity; - Lifetime = 0.0f; + Lifetime = TimeSpan.Zero; } - public void Increment(float delta) => Lifetime += delta; + public void Increment(TimeSpan delta) => Lifetime += delta; } } } diff --git a/Content.Server/Body/Components/ThermalRegulatorComponent.cs b/Content.Server/Body/Components/ThermalRegulatorComponent.cs index 4acdccf1ba7..19b76189e09 100644 --- a/Content.Server/Body/Components/ThermalRegulatorComponent.cs +++ b/Content.Server/Body/Components/ThermalRegulatorComponent.cs @@ -1,4 +1,5 @@ using Content.Server.Body.Systems; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Server.Body.Components; @@ -6,48 +7,58 @@ namespace Content.Server.Body.Components; [Access(typeof(ThermalRegulatorSystem))] public sealed partial class ThermalRegulatorComponent : Component { + /// + /// The next time that the body will regulate its heat. + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + public TimeSpan NextUpdate; + + /// + /// The interval at which thermal regulation is processed. + /// + [DataField] + public TimeSpan UpdateInterval = TimeSpan.FromSeconds(1); + /// /// Heat generated due to metabolism. It's generated via metabolism /// - [DataField("metabolismHeat")] - public float MetabolismHeat { get; private set; } + [DataField] + public float MetabolismHeat; /// /// Heat output via radiation. /// - [DataField("radiatedHeat")] - public float RadiatedHeat { get; private set; } + [DataField] + public float RadiatedHeat; /// /// Maximum heat regulated via sweat /// - [DataField("sweatHeatRegulation")] - public float SweatHeatRegulation { get; private set; } + [DataField] + public float SweatHeatRegulation; /// /// Maximum heat regulated via shivering /// - [DataField("shiveringHeatRegulation")] - public float ShiveringHeatRegulation { get; private set; } + [DataField] + public float ShiveringHeatRegulation; /// /// Amount of heat regulation that represents thermal regulation processes not /// explicitly coded. /// - [DataField("implicitHeatRegulation")] - public float ImplicitHeatRegulation { get; private set; } + [DataField] + public float ImplicitHeatRegulation; /// /// Normal body temperature /// - [DataField("normalBodyTemperature")] - public float NormalBodyTemperature { get; private set; } + [DataField] + public float NormalBodyTemperature; /// /// Deviation from normal temperature for body to start thermal regulation /// - [DataField("thermalRegulationTemperatureThreshold")] - public float ThermalRegulationTemperatureThreshold { get; private set; } - - public float AccumulatedFrametime; + [DataField] + public float ThermalRegulationTemperatureThreshold; } diff --git a/Content.Server/Body/Systems/BloodstreamSystem.cs b/Content.Server/Body/Systems/BloodstreamSystem.cs index f6fdcfedff4..9e29fdf7568 100644 --- a/Content.Server/Body/Systems/BloodstreamSystem.cs +++ b/Content.Server/Body/Systems/BloodstreamSystem.cs @@ -13,7 +13,6 @@ using Content.Shared.Damage.Prototypes; using Content.Shared.Drunk; using Content.Shared.FixedPoint; -using Content.Shared.IdentityManagement; using Content.Shared.Mobs.Systems; using Content.Shared.Popups; using Content.Shared.Rejuvenate; @@ -21,11 +20,13 @@ using Robust.Server.Audio; using Robust.Shared.Prototypes; using Robust.Shared.Random; +using Robust.Shared.Timing; namespace Content.Server.Body.Systems; public sealed class BloodstreamSystem : EntitySystem { + [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IRobustRandom _robustRandom = default!; [Dependency] private readonly AudioSystem _audio = default!; @@ -44,6 +45,8 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnComponentInit); + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnUnpaused); SubscribeLocalEvent(OnDamageChanged); SubscribeLocalEvent(OnHealthBeingExamined); SubscribeLocalEvent(OnBeingGibbed); @@ -53,6 +56,16 @@ public override void Initialize() SubscribeLocalEvent(OnRejuvenate); } + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + ent.Comp.NextUpdate = _gameTiming.CurTime + ent.Comp.UpdateInterval; + } + + private void OnUnpaused(Entity ent, ref EntityUnpausedEvent args) + { + ent.Comp.NextUpdate += args.PausedTime; + } + private void OnReactionAttempt(Entity entity, ref ReactionAttemptEvent args) { if (args.Cancelled) @@ -83,7 +96,9 @@ private void OnReactionAttempt(Entity entity, ref Solution if (args.Name != entity.Comp.BloodSolutionName && args.Name != entity.Comp.ChemicalSolutionName && args.Name != entity.Comp.BloodTemporarySolutionName) + { return; + } OnReactionAttempt(entity, ref args.Event); } @@ -95,12 +110,10 @@ public override void Update(float frameTime) var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var bloodstream)) { - bloodstream.AccumulatedFrametime += frameTime; - - if (bloodstream.AccumulatedFrametime < bloodstream.UpdateInterval) + if (_gameTiming.CurTime < bloodstream.NextUpdate) continue; - bloodstream.AccumulatedFrametime -= bloodstream.UpdateInterval; + bloodstream.NextUpdate += bloodstream.UpdateInterval; if (!_solutionContainerSystem.ResolveSolution(uid, bloodstream.BloodSolutionName, ref bloodstream.BloodSolution, out var bloodSolution)) continue; @@ -128,13 +141,17 @@ public override void Update(float frameTime) // bloodloss damage is based on the base value, and modified by how low your blood level is. var amt = bloodstream.BloodlossDamage / (0.1f + bloodPercentage); - _damageableSystem.TryChangeDamage(uid, amt, false, false); + _damageableSystem.TryChangeDamage(uid, amt, + ignoreResistances: false, interruptsDoAfters: false); // Apply dizziness as a symptom of bloodloss. // The effect is applied in a way that it will never be cleared without being healthy. // Multiplying by 2 is arbitrary but works for this case, it just prevents the time from running out - _drunkSystem.TryApplyDrunkenness(uid, bloodstream.UpdateInterval*2, false); - _stutteringSystem.DoStutter(uid, TimeSpan.FromSeconds(bloodstream.UpdateInterval*2), false); + _drunkSystem.TryApplyDrunkenness( + uid, + (float) bloodstream.UpdateInterval.TotalSeconds * 2, + applySlur: false); + _stutteringSystem.DoStutter(uid, bloodstream.UpdateInterval * 2, refresh: false); // storing the drunk and stutter time so we can remove it independently from other effects additions bloodstream.StatusTime += bloodstream.UpdateInterval * 2; @@ -142,13 +159,16 @@ public override void Update(float frameTime) else if (!_mobStateSystem.IsDead(uid)) { // If they're healthy, we'll try and heal some bloodloss instead. - _damageableSystem.TryChangeDamage(uid, bloodstream.BloodlossHealDamage * bloodPercentage, true, false); + _damageableSystem.TryChangeDamage( + uid, + bloodstream.BloodlossHealDamage * bloodPercentage, + ignoreResistances: true, interruptsDoAfters: false); // Remove the drunk effect when healthy. Should only remove the amount of drunk and stutter added by low blood level - _drunkSystem.TryRemoveDrunkenessTime(uid, bloodstream.StatusTime); - _stutteringSystem.DoRemoveStutterTime(uid, bloodstream.StatusTime); + _drunkSystem.TryRemoveDrunkenessTime(uid, bloodstream.StatusTime.TotalSeconds); + _stutteringSystem.DoRemoveStutterTime(uid, bloodstream.StatusTime.TotalSeconds); // Reset the drunk and stutter time to zero - bloodstream.StatusTime = 0; + bloodstream.StatusTime = TimeSpan.Zero; } } } @@ -167,17 +187,15 @@ private void OnComponentInit(Entity entity, ref ComponentI bloodSolution.AddReagent(entity.Comp.BloodReagent, entity.Comp.BloodMaxVolume - bloodSolution.Volume); } - private void OnDamageChanged(EntityUid uid, BloodstreamComponent component, DamageChangedEvent args) + private void OnDamageChanged(Entity ent, ref DamageChangedEvent args) { - if (args.DamageDelta is null) - return; - - // definitely don't make them bleed if they got healed - if (!args.DamageIncreased) + if (args.DamageDelta is null || !args.DamageIncreased) + { return; + } // TODO probably cache this or something. humans get hurt a lot - if (!_prototypeManager.TryIndex(component.DamageBleedModifiers, out var modifiers)) + if (!_prototypeManager.TryIndex(ent.Comp.DamageBleedModifiers, out var modifiers)) return; var bloodloss = DamageSpecifier.ApplyModifierSet(args.DamageDelta, modifiers); @@ -186,10 +204,10 @@ private void OnDamageChanged(EntityUid uid, BloodstreamComponent component, Dama return; // Does the calculation of how much bleed rate should be added/removed, then applies it - var oldBleedAmount = component.BleedAmount; + var oldBleedAmount = ent.Comp.BleedAmount; var total = bloodloss.GetTotal(); var totalFloat = total.Float(); - TryModifyBleedAmount(uid, totalFloat, component); + TryModifyBleedAmount(ent, totalFloat, ent); /// /// Critical hit. Causes target to lose blood, using the bleed rate modifier of the weapon, currently divided by 5 @@ -199,8 +217,8 @@ private void OnDamageChanged(EntityUid uid, BloodstreamComponent component, Dama var prob = Math.Clamp(totalFloat / 25, 0, 1); if (totalFloat > 0 && _robustRandom.Prob(prob)) { - TryModifyBloodLevel(uid, (-total) / 5, component); - _audio.PlayPvs(component.InstantBloodSound, uid); + TryModifyBloodLevel(ent, (-total) / 5, ent); + _audio.PlayPvs(ent.Comp.InstantBloodSound, ent); } // Heat damage will cauterize, causing the bleed rate to be reduced. @@ -210,53 +228,52 @@ private void OnDamageChanged(EntityUid uid, BloodstreamComponent component, Dama // because it's burn damage that cauterized their wounds. // We'll play a special sound and popup for feedback. - _audio.PlayPvs(component.BloodHealedSound, uid); - _popupSystem.PopupEntity(Loc.GetString("bloodstream-component-wounds-cauterized"), uid, - uid, PopupType.Medium); + _audio.PlayPvs(ent.Comp.BloodHealedSound, ent); + _popupSystem.PopupEntity(Loc.GetString("bloodstream-component-wounds-cauterized"), ent, + ent, PopupType.Medium); } } /// /// Shows text on health examine, based on bleed rate and blood level. /// - private void OnHealthBeingExamined(EntityUid uid, BloodstreamComponent component, HealthBeingExaminedEvent args) + private void OnHealthBeingExamined(Entity ent, ref HealthBeingExaminedEvent args) { // Shows profusely bleeding at half the max bleed rate. - if (component.BleedAmount > component.MaxBleedAmount / 2) + if (ent.Comp.BleedAmount > ent.Comp.MaxBleedAmount / 2) { args.Message.PushNewline(); - args.Message.AddMarkup(Loc.GetString("bloodstream-component-profusely-bleeding", ("target", Identity.Entity(uid, EntityManager)))); + args.Message.AddMarkup(Loc.GetString("bloodstream-component-profusely-bleeding", ("target", ent.Owner))); } // Shows bleeding message when bleeding, but less than profusely. - else if (component.BleedAmount > 0) + else if (ent.Comp.BleedAmount > 0) { args.Message.PushNewline(); - args.Message.AddMarkup(Loc.GetString("bloodstream-component-bleeding", ("target", Identity.Entity(uid, EntityManager)))); + args.Message.AddMarkup(Loc.GetString("bloodstream-component-bleeding", ("target", ent.Owner))); } // If the mob's blood level is below the damage threshhold, the pale message is added. - if (GetBloodLevelPercentage(uid, component) < component.BloodlossThreshold) + if (GetBloodLevelPercentage(ent, ent) < ent.Comp.BloodlossThreshold) { args.Message.PushNewline(); - args.Message.AddMarkup(Loc.GetString("bloodstream-component-looks-pale", ("target", Identity.Entity(uid, EntityManager)))); + args.Message.AddMarkup(Loc.GetString("bloodstream-component-looks-pale", ("target", ent.Owner))); } } - private void OnBeingGibbed(EntityUid uid, BloodstreamComponent component, BeingGibbedEvent args) + private void OnBeingGibbed(Entity ent, ref BeingGibbedEvent args) { - SpillAllSolutions(uid, component); + SpillAllSolutions(ent, ent); } - private void OnApplyMetabolicMultiplier(EntityUid uid, BloodstreamComponent component, ApplyMetabolicMultiplierEvent args) + private void OnApplyMetabolicMultiplier( + Entity ent, + ref ApplyMetabolicMultiplierEvent args) { if (args.Apply) { - component.UpdateInterval *= args.Multiplier; + ent.Comp.UpdateInterval *= args.Multiplier; return; } - component.UpdateInterval /= args.Multiplier; - // Reset the accumulator properly - if (component.AccumulatedFrametime >= component.UpdateInterval) - component.AccumulatedFrametime = component.UpdateInterval; + ent.Comp.UpdateInterval /= args.Multiplier; } private void OnRejuvenate(Entity entity, ref RejuvenateEvent args) @@ -275,21 +292,15 @@ private void OnRejuvenate(Entity entity, ref RejuvenateEve /// public bool TryAddToChemicals(EntityUid uid, Solution solution, BloodstreamComponent? component = null) { - if (!Resolve(uid, ref component, false)) - return false; - - if (!_solutionContainerSystem.ResolveSolution(uid, component.ChemicalSolutionName, ref component.ChemicalSolution)) - return false; - - return _solutionContainerSystem.TryAddSolution(component.ChemicalSolution.Value, solution); + return Resolve(uid, ref component, logMissing: false) + && _solutionContainerSystem.ResolveSolution(uid, component.ChemicalSolutionName, ref component.ChemicalSolution) + && _solutionContainerSystem.TryAddSolution(component.ChemicalSolution.Value, solution); } public bool FlushChemicals(EntityUid uid, string excludedReagentID, FixedPoint2 quantity, BloodstreamComponent? component = null) { - if (!Resolve(uid, ref component, false)) - return false; - - if (!_solutionContainerSystem.ResolveSolution(uid, component.ChemicalSolutionName, ref component.ChemicalSolution, out var chemSolution)) + if (!Resolve(uid, ref component, logMissing: false) + || !_solutionContainerSystem.ResolveSolution(uid, component.ChemicalSolutionName, ref component.ChemicalSolution, out var chemSolution)) return false; for (var i = chemSolution.Contents.Count - 1; i >= 0; i--) @@ -306,11 +317,11 @@ public bool FlushChemicals(EntityUid uid, string excludedReagentID, FixedPoint2 public float GetBloodLevelPercentage(EntityUid uid, BloodstreamComponent? component = null) { - if (!Resolve(uid, ref component)) - return 0.0f; - - if (!_solutionContainerSystem.ResolveSolution(uid, component.BloodSolutionName, ref component.BloodSolution, out var bloodSolution)) + if (!Resolve(uid, ref component) + || !_solutionContainerSystem.ResolveSolution(uid, component.BloodSolutionName, ref component.BloodSolution, out var bloodSolution)) + { return 0.0f; + } return bloodSolution.FillFraction; } @@ -328,11 +339,11 @@ public void SetBloodLossThreshold(EntityUid uid, float threshold, BloodstreamCom /// public bool TryModifyBloodLevel(EntityUid uid, FixedPoint2 amount, BloodstreamComponent? component = null) { - if (!Resolve(uid, ref component, false)) - return false; - - if (!_solutionContainerSystem.ResolveSolution(uid, component.BloodSolutionName, ref component.BloodSolution)) + if (!Resolve(uid, ref component, logMissing: false) + || !_solutionContainerSystem.ResolveSolution(uid, component.BloodSolutionName, ref component.BloodSolution)) + { return false; + } if (amount >= 0) return _solutionContainerSystem.TryAddReagent(component.BloodSolution.Value, component.BloodReagent, amount, out _); @@ -356,9 +367,9 @@ public bool TryModifyBloodLevel(EntityUid uid, FixedPoint2 amount, BloodstreamCo tempSolution.AddSolution(temp, _prototypeManager); } - if (_puddleSystem.TrySpillAt(uid, tempSolution, out var puddleUid, false)) + if (_puddleSystem.TrySpillAt(uid, tempSolution, out var puddleUid, sound: false)) { - _forensicsSystem.TransferDna(puddleUid, uid, false); + _forensicsSystem.TransferDna(puddleUid, uid, canDnaBeCleaned: false); } tempSolution.RemoveAllSolution(); @@ -374,7 +385,7 @@ public bool TryModifyBloodLevel(EntityUid uid, FixedPoint2 amount, BloodstreamCo /// public bool TryModifyBleedAmount(EntityUid uid, float amount, BloodstreamComponent? component = null) { - if (!Resolve(uid, ref component, false)) + if (!Resolve(uid, ref component, logMissing: false)) return false; component.BleedAmount += amount; @@ -424,7 +435,7 @@ public void SpillAllSolutions(EntityUid uid, BloodstreamComponent? component = n if (_puddleSystem.TrySpillAt(uid, tempSol, out var puddleUid)) { - _forensicsSystem.TransferDna(puddleUid, uid, false); + _forensicsSystem.TransferDna(puddleUid, uid, canDnaBeCleaned: false); } } @@ -433,11 +444,11 @@ public void SpillAllSolutions(EntityUid uid, BloodstreamComponent? component = n /// public void ChangeBloodReagent(EntityUid uid, string reagent, BloodstreamComponent? component = null) { - if (!Resolve(uid, ref component, false)) - return; - - if (reagent == component.BloodReagent) + if (!Resolve(uid, ref component, logMissing: false) + || reagent == component.BloodReagent) + { return; + } if (!_solutionContainerSystem.ResolveSolution(uid, component.BloodSolutionName, ref component.BloodSolution, out var bloodSolution)) { diff --git a/Content.Server/Body/Systems/BodySystem.cs b/Content.Server/Body/Systems/BodySystem.cs index 18119909abc..37f78ed81a0 100644 --- a/Content.Server/Body/Systems/BodySystem.cs +++ b/Content.Server/Body/Systems/BodySystem.cs @@ -1,23 +1,19 @@ using Content.Server.Body.Components; using Content.Server.GameTicking; using Content.Server.Humanoid; -using Content.Server.Kitchen.Components; using Content.Shared.Body.Components; using Content.Shared.Body.Part; using Content.Shared.Body.Systems; using Content.Shared.Humanoid; -using Content.Shared.Kitchen.Components; using Content.Shared.Mind; using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Events; +using Content.Shared.Movement.Systems; using Robust.Shared.Audio; -using Robust.Shared.Player; +using Robust.Shared.Audio.Systems; using Robust.Shared.Random; using Robust.Shared.Timing; using System.Numerics; -using Content.Shared.Gibbing.Components; -using Content.Shared.Movement.Systems; -using Robust.Shared.Audio.Systems; namespace Content.Server.Body.Systems; @@ -28,9 +24,7 @@ public sealed class BodySystem : SharedBodySystem [Dependency] private readonly HumanoidAppearanceSystem _humanoidSystem = default!; [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedMindSystem _mindSystem = default!; - [Dependency] private readonly IRobustRandom _random = default!; public override void Initialize() { @@ -40,7 +34,7 @@ public override void Initialize() SubscribeLocalEvent(OnApplyMetabolicMultiplier); } - private void OnRelayMoveInput(EntityUid uid, BodyComponent component, ref MoveInputEvent args) + private void OnRelayMoveInput(Entity ent, ref MoveInputEvent args) { // If they haven't actually moved then ignore it. if ((args.Component.HeldMoveButtons & @@ -49,68 +43,67 @@ private void OnRelayMoveInput(EntityUid uid, BodyComponent component, ref MoveIn return; } - if (_mobState.IsDead(uid) && _mindSystem.TryGetMind(uid, out var mindId, out var mind)) + if (_mobState.IsDead(ent) && _mindSystem.TryGetMind(ent, out var mindId, out var mind)) { mind.TimeOfDeath ??= _gameTiming.RealTime; - _ticker.OnGhostAttempt(mindId, true, mind: mind); + _ticker.OnGhostAttempt(mindId, canReturnGlobal: true, mind: mind); } } - private void OnApplyMetabolicMultiplier(EntityUid uid, BodyComponent component, - ApplyMetabolicMultiplierEvent args) + private void OnApplyMetabolicMultiplier( + Entity ent, + ref ApplyMetabolicMultiplierEvent args) { - foreach (var organ in GetBodyOrgans(uid, component)) + foreach (var organ in GetBodyOrgans(ent, ent)) { - RaiseLocalEvent(organ.Id, args); + RaiseLocalEvent(organ.Id, ref args); } } protected override void AddPart( - EntityUid bodyUid, - EntityUid partUid, - string slotId, - BodyPartComponent component, - BodyComponent? bodyComp = null) + Entity bodyEnt, + Entity partEnt, + string slotId) { // TODO: Predict this probably. - base.AddPart(bodyUid, partUid, slotId, component, bodyComp); + base.AddPart(bodyEnt, partEnt, slotId); - if (TryComp(bodyUid, out var humanoid)) + if (TryComp(bodyEnt, out var humanoid)) { - var layer = component.ToHumanoidLayers(); + var layer = partEnt.Comp.ToHumanoidLayers(); if (layer != null) { var layers = HumanoidVisualLayersExtension.Sublayers(layer.Value); - _humanoidSystem.SetLayersVisibility(bodyUid, layers, true, true, humanoid); + _humanoidSystem.SetLayersVisibility( + bodyEnt, layers, visible: true, permanent: true, humanoid); } } } protected override void RemovePart( - EntityUid bodyUid, - EntityUid partUid, - string slotId, - BodyPartComponent component, - BodyComponent? bodyComp = null) + Entity bodyEnt, + Entity partEnt, + string slotId) { - base.RemovePart(bodyUid, partUid, slotId, component, bodyComp); + base.RemovePart(bodyEnt, partEnt, slotId); - if (!TryComp(bodyUid, out var humanoid)) + if (!TryComp(bodyEnt, out var humanoid)) return; - var layer = component.ToHumanoidLayers(); + var layer = partEnt.Comp.ToHumanoidLayers(); - if (layer == null) + if (layer is null) return; var layers = HumanoidVisualLayersExtension.Sublayers(layer.Value); - _humanoidSystem.SetLayersVisibility(bodyUid, layers, false, true, humanoid); + _humanoidSystem.SetLayersVisibility( + bodyEnt, layers, visible: false, permanent: true, humanoid); } public override HashSet GibBody( EntityUid bodyId, bool gibOrgans = false, - BodyComponent? body = null , + BodyComponent? body = null, bool launchGibs = true, Vector2? splatDirection = null, float splatModifier = 1, @@ -118,19 +111,23 @@ public override HashSet GibBody( SoundSpecifier? gibSoundOverride = null ) { - if (!Resolve(bodyId, ref body, false)) - return new HashSet(); - - if (TerminatingOrDeleted(bodyId) || EntityManager.IsQueuedForDeletion(bodyId)) + if (!Resolve(bodyId, ref body, logMissing: false) + || TerminatingOrDeleted(bodyId) + || EntityManager.IsQueuedForDeletion(bodyId)) + { return new HashSet(); + } var xform = Transform(bodyId); - if (xform.MapUid == null) + if (xform.MapUid is null) return new HashSet(); var gibs = base.GibBody(bodyId, gibOrgans, body, launchGibs: launchGibs, splatDirection: splatDirection, splatModifier: splatModifier, splatCone:splatCone); - RaiseLocalEvent(bodyId, new BeingGibbedEvent(gibs)); + + var ev = new BeingGibbedEvent(gibs); + RaiseLocalEvent(bodyId, ref ev); + QueueDel(bodyId); return gibs; diff --git a/Content.Server/Body/Systems/BrainSystem.cs b/Content.Server/Body/Systems/BrainSystem.cs index abb54971209..86d2cb61ffe 100644 --- a/Content.Server/Body/Systems/BrainSystem.cs +++ b/Content.Server/Body/Systems/BrainSystem.cs @@ -16,8 +16,8 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent((uid, _, args) => HandleMind(args.Body, uid)); - SubscribeLocalEvent((uid, _, args) => HandleMind(uid, args.OldBody)); + SubscribeLocalEvent((uid, _, args) => HandleMind(args.Body, uid)); + SubscribeLocalEvent((uid, _, args) => HandleMind(uid, args.OldBody)); SubscribeLocalEvent(OnPointAttempt); } @@ -39,7 +39,7 @@ private void HandleMind(EntityUid newEntity, EntityUid oldEntity) _mindSystem.TransferTo(mindId, newEntity, mind: mind); } - private void OnPointAttempt(EntityUid uid, BrainComponent component, PointAttemptEvent args) + private void OnPointAttempt(Entity ent, ref PointAttemptEvent args) { args.Cancel(); } diff --git a/Content.Server/Body/Systems/InternalsSystem.cs b/Content.Server/Body/Systems/InternalsSystem.cs index 007cbdf0848..9607a808f65 100644 --- a/Content.Server/Body/Systems/InternalsSystem.cs +++ b/Content.Server/Body/Systems/InternalsSystem.cs @@ -1,7 +1,6 @@ using Content.Server.Atmos.Components; using Content.Server.Atmos.EntitySystems; using Content.Server.Body.Components; -using Content.Server.Hands.Systems; using Content.Server.Popups; using Content.Shared.Alert; using Content.Shared.Atmos; @@ -11,19 +10,16 @@ using Content.Shared.Inventory; using Content.Shared.Verbs; using Robust.Shared.Containers; -using Robust.Shared.Prototypes; using Robust.Shared.Utility; namespace Content.Server.Body.Systems; public sealed class InternalsSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _protoManager = default!; [Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly AtmosphereSystem _atmos = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly GasTankSystem _gasTank = default!; - [Dependency] private readonly HandsSystem _hands = default!; [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; @@ -40,28 +36,36 @@ public override void Initialize() SubscribeLocalEvent(OnDoAfter); } - private void OnGetInteractionVerbs(EntityUid uid, InternalsComponent component, GetVerbsEvent args) + private void OnGetInteractionVerbs( + Entity ent, + ref GetVerbsEvent args) { - if (!args.CanAccess || !args.CanInteract || args.Hands == null) + if (!args.CanAccess || !args.CanInteract || args.Hands is null) return; + var user = args.User; + InteractionVerb verb = new() { Act = () => { - ToggleInternals(uid, args.User, false, component); + ToggleInternals(ent, user, force: false, ent); }, Message = Loc.GetString("action-description-internals-toggle"), - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/dot.svg.192dpi.png")), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/dot.svg.192dpi.png")), Text = Loc.GetString("action-name-internals-toggle"), }; args.Verbs.Add(verb); } - public void ToggleInternals(EntityUid uid, EntityUid user, bool force, InternalsComponent? internals = null) + public void ToggleInternals( + EntityUid uid, + EntityUid user, + bool force, + InternalsComponent? internals = null) { - if (!Resolve(uid, ref internals, false)) + if (!Resolve(uid, ref internals, logMissing: false)) return; // Toggle off if they're on @@ -73,12 +77,12 @@ public void ToggleInternals(EntityUid uid, EntityUid user, bool force, Internals return; } - StartToggleInternalsDoAfter(user, uid, internals); + StartToggleInternalsDoAfter(user, (uid, internals)); return; } // If they're not on then check if we have a mask to use - if (internals.BreathToolEntity == null) + if (internals.BreathToolEntity is null) { _popupSystem.PopupEntity(Loc.GetString("internals-no-breath-tool"), uid, user); return; @@ -86,7 +90,7 @@ public void ToggleInternals(EntityUid uid, EntityUid user, bool force, Internals var tank = FindBestGasTank(uid); - if (tank == null) + if (tank is null) { _popupSystem.PopupEntity(Loc.GetString("internals-no-tank"), uid, user); return; @@ -94,20 +98,20 @@ public void ToggleInternals(EntityUid uid, EntityUid user, bool force, Internals if (!force) { - StartToggleInternalsDoAfter(user, uid, internals); + StartToggleInternalsDoAfter(user, (uid, internals)); return; } _gasTank.ConnectToInternals(tank.Value); } - private void StartToggleInternalsDoAfter(EntityUid user, EntityUid target, InternalsComponent internals) + private void StartToggleInternalsDoAfter(EntityUid user, Entity targetEnt) { // Is the target not you? If yes, use a do-after to give them time to respond. - var isUser = user == target; - var delay = !isUser ? internals.Delay : 0f; + var isUser = user == targetEnt.Owner; + var delay = !isUser ? targetEnt.Comp.Delay : TimeSpan.Zero; - _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, user, delay, new InternalsDoAfterEvent(), target, target: target) + _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, user, delay, new InternalsDoAfterEvent(), targetEnt, target: targetEnt) { BreakOnUserMove = true, BreakOnDamage = true, @@ -116,66 +120,64 @@ private void StartToggleInternalsDoAfter(EntityUid user, EntityUid target, Inter }); } - private void OnDoAfter(EntityUid uid, InternalsComponent component, InternalsDoAfterEvent args) + private void OnDoAfter(Entity ent, ref InternalsDoAfterEvent args) { if (args.Cancelled || args.Handled) return; - ToggleInternals(uid, args.User, true, component); + ToggleInternals(ent, args.User, force: true, ent); args.Handled = true; } - private void OnInternalsStartup(EntityUid uid, InternalsComponent component, ComponentStartup args) + private void OnInternalsStartup(Entity ent, ref ComponentStartup args) { - _alerts.ShowAlert(uid, AlertType.Internals, GetSeverity(component)); + _alerts.ShowAlert(ent, AlertType.Internals, GetSeverity(ent)); } - private void OnInternalsShutdown(EntityUid uid, InternalsComponent component, ComponentShutdown args) + private void OnInternalsShutdown(Entity ent, ref ComponentShutdown args) { - _alerts.ClearAlert(uid, AlertType.Internals); + _alerts.ClearAlert(ent, AlertType.Internals); } - private void OnInhaleLocation(EntityUid uid, InternalsComponent component, InhaleLocationEvent args) + private void OnInhaleLocation(Entity ent, ref InhaleLocationEvent args) { - if (AreInternalsWorking(component)) + if (AreInternalsWorking(ent)) { - var gasTank = Comp(component.GasTankEntity!.Value); - args.Gas = _gasTank.RemoveAirVolume((component.GasTankEntity.Value, gasTank), Atmospherics.BreathVolume); + var gasTank = Comp(ent.Comp.GasTankEntity!.Value); + args.Gas = _gasTank.RemoveAirVolume((ent.Comp.GasTankEntity.Value, gasTank), Atmospherics.BreathVolume); // TODO: Should listen to gas tank updates instead I guess? - _alerts.ShowAlert(uid, AlertType.Internals, GetSeverity(component)); + _alerts.ShowAlert(ent, AlertType.Internals, GetSeverity(ent)); } } public void DisconnectBreathTool(Entity ent) { - var (owner, component) = ent; - var old = component.BreathToolEntity; - component.BreathToolEntity = null; + var old = ent.Comp.BreathToolEntity; + ent.Comp.BreathToolEntity = null; - if (TryComp(old, out BreathToolComponent? breathTool) ) + if (TryComp(old, out BreathToolComponent? breathTool)) { _atmos.DisconnectInternals(breathTool); DisconnectTank(ent); } - _alerts.ShowAlert(owner, AlertType.Internals, GetSeverity(component)); + _alerts.ShowAlert(ent, AlertType.Internals, GetSeverity(ent)); } public void ConnectBreathTool(Entity ent, EntityUid toolEntity) { - var (owner, component) = ent; - if (TryComp(component.BreathToolEntity, out BreathToolComponent? tool)) + if (TryComp(ent.Comp.BreathToolEntity, out BreathToolComponent? tool)) { _atmos.DisconnectInternals(tool); } - component.BreathToolEntity = toolEntity; - _alerts.ShowAlert(owner, AlertType.Internals, GetSeverity(component)); + ent.Comp.BreathToolEntity = toolEntity; + _alerts.ShowAlert(ent, AlertType.Internals, GetSeverity(ent)); } public void DisconnectTank(InternalsComponent? component) { - if (component == null) + if (component is null) return; if (TryComp(component.GasTankEntity, out GasTankComponent? tank)) @@ -187,46 +189,47 @@ public void DisconnectTank(InternalsComponent? component) public bool TryConnectTank(Entity ent, EntityUid tankEntity) { - var component = ent.Comp; - if (component.BreathToolEntity == null) + if (ent.Comp.BreathToolEntity is null) return false; - if (TryComp(component.GasTankEntity, out GasTankComponent? tank)) - _gasTank.DisconnectFromInternals((component.GasTankEntity.Value, tank)); + if (TryComp(ent.Comp.GasTankEntity, out GasTankComponent? tank)) + _gasTank.DisconnectFromInternals((ent.Comp.GasTankEntity.Value, tank)); - component.GasTankEntity = tankEntity; - _alerts.ShowAlert(ent, AlertType.Internals, GetSeverity(component)); + ent.Comp.GasTankEntity = tankEntity; + _alerts.ShowAlert(ent, AlertType.Internals, GetSeverity(ent)); return true; } public bool AreInternalsWorking(EntityUid uid, InternalsComponent? component = null) { - if (!Resolve(uid, ref component, false)) - return false; - - return AreInternalsWorking(component); + return Resolve(uid, ref component, logMissing: false) + && AreInternalsWorking(component); } public bool AreInternalsWorking(InternalsComponent component) { - return TryComp(component.BreathToolEntity, out BreathToolComponent? breathTool) && - breathTool.IsFunctional && - TryComp(component.GasTankEntity, out GasTankComponent? _); + return TryComp(component.BreathToolEntity, out BreathToolComponent? breathTool) + && breathTool.IsFunctional + && HasComp(component.GasTankEntity); } private short GetSeverity(InternalsComponent component) { - if (component.BreathToolEntity == null || !AreInternalsWorking(component)) + if (component.BreathToolEntity is null || !AreInternalsWorking(component)) return 2; // If pressure in the tank is below low pressure threshhold, flash warning on internals UI - if (TryComp(component.GasTankEntity, out var gasTank) && gasTank.IsLowPressure) + if (TryComp(component.GasTankEntity, out var gasTank) + && gasTank.IsLowPressure) + { return 0; + } return 1; } - public Entity? FindBestGasTank(Entity user) + public Entity? FindBestGasTank( + Entity user) { // Prioritise // 1. back equipped tanks @@ -234,17 +237,17 @@ private short GetSeverity(InternalsComponent component) // 3. in-hand tanks // 4. pocket/belt tanks - if (!Resolve(user.Owner, ref user.Comp1, ref user.Comp2, ref user.Comp3)) + if (!Resolve(user, ref user.Comp1, ref user.Comp2, ref user.Comp3)) return null; - if (_inventory.TryGetSlotEntity(user.Owner, "back", out var backEntity, user.Comp2, user.Comp3) && + if (_inventory.TryGetSlotEntity(user, "back", out var backEntity, user.Comp2, user.Comp3) && TryComp(backEntity, out var backGasTank) && _gasTank.CanConnectToInternals(backGasTank)) { return (backEntity.Value, backGasTank); } - if (_inventory.TryGetSlotEntity(user.Owner, "suitstorage", out var entity, user.Comp2, user.Comp3) && + if (_inventory.TryGetSlotEntity(user, "suitstorage", out var entity, user.Comp2, user.Comp3) && TryComp(entity, out var gasTank) && _gasTank.CanConnectToInternals(gasTank)) { diff --git a/Content.Server/Body/Systems/LungSystem.cs b/Content.Server/Body/Systems/LungSystem.cs index 4b60f8814b5..e83d3c32a25 100644 --- a/Content.Server/Body/Systems/LungSystem.cs +++ b/Content.Server/Body/Systems/LungSystem.cs @@ -1,4 +1,4 @@ -using Content.Server.Atmos.Components; +using Content.Server.Atmos.Components; using Content.Server.Atmos.EntitySystems; using Content.Server.Body.Components; using Content.Server.Chemistry.Containers.EntitySystems; @@ -26,21 +26,24 @@ public override void Initialize() SubscribeLocalEvent(OnMaskToggled); } - private void OnGotUnequipped(EntityUid uid, BreathToolComponent component, GotUnequippedEvent args) + private void OnGotUnequipped(Entity ent, ref GotUnequippedEvent args) { - _atmosphereSystem.DisconnectInternals(component); + _atmosphereSystem.DisconnectInternals(ent); } - private void OnGotEquipped(EntityUid uid, BreathToolComponent component, GotEquippedEvent args) + private void OnGotEquipped(Entity ent, ref GotEquippedEvent args) { + if ((args.SlotFlags & ent.Comp.AllowedSlots) == 0) + { + return; + } - if ((args.SlotFlags & component.AllowedSlots) == 0) return; - component.IsFunctional = true; + ent.Comp.IsFunctional = true; if (TryComp(args.Equipee, out InternalsComponent? internals)) { - component.ConnectedInternalsEntity = args.Equipee; - _internals.ConnectBreathTool((args.Equipee, internals), uid); + ent.Comp.ConnectedInternalsEntity = args.Equipee; + _internals.ConnectBreathTool((args.Equipee, internals), ent); } } @@ -81,7 +84,7 @@ public void GasToReagent(EntityUid uid, LungComponent lung) if (moles <= 0) continue; var reagent = _atmosphereSystem.GasReagents[i]; - if (reagent == null) continue; + if (reagent is null) continue; var amount = moles * Atmospherics.BreathMolesToReagentMultiplier; solution.AddReagent(reagent, amount); diff --git a/Content.Server/Body/Systems/MetabolizerSystem.cs b/Content.Server/Body/Systems/MetabolizerSystem.cs index e5f604f70df..066bf0a1c5b 100644 --- a/Content.Server/Body/Systems/MetabolizerSystem.cs +++ b/Content.Server/Body/Systems/MetabolizerSystem.cs @@ -12,11 +12,13 @@ using Robust.Shared.Collections; using Robust.Shared.Prototypes; using Robust.Shared.Random; +using Robust.Shared.Timing; namespace Content.Server.Body.Systems { public sealed class MetabolizerSystem : EntitySystem { + [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; @@ -34,9 +36,21 @@ public override void Initialize() _solutionQuery = GetEntityQuery(); SubscribeLocalEvent(OnMetabolizerInit); + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnUnpaused); SubscribeLocalEvent(OnApplyMetabolicMultiplier); } + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + ent.Comp.NextUpdate = _gameTiming.CurTime + ent.Comp.UpdateInterval; + } + + private void OnUnpaused(Entity ent, ref EntityUnpausedEvent args) + { + ent.Comp.NextUpdate += args.PausedTime; + } + private void OnMetabolizerInit(Entity entity, ref ComponentInit args) { if (!entity.Comp.SolutionOnBody) @@ -49,19 +63,17 @@ private void OnMetabolizerInit(Entity entity, ref Componen } } - private void OnApplyMetabolicMultiplier(EntityUid uid, MetabolizerComponent component, - ApplyMetabolicMultiplierEvent args) + private void OnApplyMetabolicMultiplier( + Entity ent, + ref ApplyMetabolicMultiplierEvent args) { if (args.Apply) { - component.UpdateFrequency *= args.Multiplier; + ent.Comp.UpdateInterval *= args.Multiplier; return; } - component.UpdateFrequency /= args.Multiplier; - // Reset the accumulator properly - if (component.AccumulatedFrametime >= component.UpdateFrequency) - component.AccumulatedFrametime = component.UpdateFrequency; + ent.Comp.UpdateInterval /= args.Multiplier; } public override void Update(float frameTime) @@ -78,50 +90,52 @@ public override void Update(float frameTime) foreach (var (uid, metab) in metabolizers) { - metab.AccumulatedFrametime += frameTime; - // Only update as frequently as it should - if (metab.AccumulatedFrametime < metab.UpdateFrequency) + if (_gameTiming.CurTime < metab.NextUpdate) continue; - metab.AccumulatedFrametime -= metab.UpdateFrequency; - TryMetabolize(uid, metab); + metab.NextUpdate += metab.UpdateInterval; + TryMetabolize((uid, metab)); } } - private void TryMetabolize(EntityUid uid, MetabolizerComponent meta, OrganComponent? organ = null) + private void TryMetabolize(Entity ent) { - _organQuery.Resolve(uid, ref organ, false); + _organQuery.Resolve(ent, ref ent.Comp2, logMissing: false); // First step is get the solution we actually care about + var solutionName = ent.Comp1.SolutionName; Solution? solution = null; Entity? soln = default!; EntityUid? solutionEntityUid = null; - SolutionContainerManagerComponent? manager = null; - - if (meta.SolutionOnBody) + if (ent.Comp1.SolutionOnBody) { - if (organ?.Body is { } body) + if (ent.Comp2?.Body is { } body) { - if (!_solutionQuery.Resolve(body, ref manager, false)) + if (!_solutionQuery.Resolve(body, ref ent.Comp3, logMissing: false)) return; - _solutionContainerSystem.TryGetSolution((body, manager), meta.SolutionName, out soln, out solution); + _solutionContainerSystem.TryGetSolution((body, ent.Comp3), solutionName, out soln, out solution); solutionEntityUid = body; } } else { - if (!_solutionQuery.Resolve(uid, ref manager, false)) + if (!_solutionQuery.Resolve(ent, ref ent.Comp3, logMissing: false)) return; - _solutionContainerSystem.TryGetSolution((uid, manager), meta.SolutionName, out soln, out solution); - solutionEntityUid = uid; + _solutionContainerSystem.TryGetSolution((ent, ent), solutionName, out soln, out solution); + solutionEntityUid = ent; } - if (solutionEntityUid == null || soln is null || solution is null || solution.Contents.Count == 0) + if (solutionEntityUid is null + || soln is null + || solution is null + || solution.Contents.Count == 0) + { return; + } // randomize the reagent list so we don't have any weird quirks // like alphabetical order or insertion order mattering for processing @@ -135,9 +149,9 @@ private void TryMetabolize(EntityUid uid, MetabolizerComponent meta, OrganCompon continue; var mostToRemove = FixedPoint2.Zero; - if (proto.Metabolisms == null) + if (proto.Metabolisms is null) { - if (meta.RemoveEmpty) + if (ent.Comp1.RemoveEmpty) { solution.RemoveReagent(reagent, FixedPoint2.New(1)); } @@ -146,15 +160,15 @@ private void TryMetabolize(EntityUid uid, MetabolizerComponent meta, OrganCompon } // we're done here entirely if this is true - if (reagents >= meta.MaxReagentsProcessable) + if (reagents >= ent.Comp1.MaxReagentsProcessable) return; // loop over all our groups and see which ones apply - if (meta.MetabolismGroups == null) + if (ent.Comp1.MetabolismGroups is null) continue; - foreach (var group in meta.MetabolismGroups) + foreach (var group in ent.Comp1.MetabolismGroups) { if (!proto.Metabolisms.TryGetValue(group.Id, out var entry)) continue; @@ -169,15 +183,18 @@ private void TryMetabolize(EntityUid uid, MetabolizerComponent meta, OrganCompon // if it's possible for them to be dead, and they are, // then we shouldn't process any effects, but should probably // still remove reagents - if (EntityManager.TryGetComponent(solutionEntityUid.Value, out var state)) + if (TryComp(solutionEntityUid.Value, out var state)) { if (!proto.WorksOnTheDead && _mobStateSystem.IsDead(solutionEntityUid.Value, state)) continue; } - var actualEntity = organ?.Body ?? solutionEntityUid.Value; - var args = new ReagentEffectArgs(actualEntity, uid, solution, proto, mostToRemove, - EntityManager, null, scale); + var actualEntity = ent.Comp2?.Body ?? solutionEntityUid.Value; + var ev = new TryMetabolizeReagent(reagent, proto, quantity); + RaiseLocalEvent(actualEntity, ref ev); + + var args = new ReagentEffectArgs(actualEntity, ent, solution, proto, mostToRemove, + EntityManager, null, scale * ev.Scale, ev.QuantityMultiplier); // do all effects, if conditions apply foreach (var effect in entry.Effects) @@ -187,8 +204,14 @@ private void TryMetabolize(EntityUid uid, MetabolizerComponent meta, OrganCompon if (effect.ShouldLog) { - _adminLogger.Add(LogType.ReagentEffect, effect.LogImpact, - $"Metabolism effect {effect.GetType().Name:effect} of reagent {proto.LocalizedName:reagent} applied on entity {actualEntity:entity} at {Transform(actualEntity).Coordinates:coordinates}"); + _adminLogger.Add( + LogType.ReagentEffect, + effect.LogImpact, + $"Metabolism effect {effect.GetType().Name:effect}" + + $" of reagent {proto.LocalizedName:reagent}" + + $" applied on entity {actualEntity:entity}" + + $" at {Transform(actualEntity).Coordinates:coordinates}" + ); } effect.Effect(args); @@ -209,15 +232,28 @@ private void TryMetabolize(EntityUid uid, MetabolizerComponent meta, OrganCompon } } - public sealed class ApplyMetabolicMultiplierEvent : EntityEventArgs + [ByRefEvent] + public readonly record struct ApplyMetabolicMultiplierEvent( + EntityUid Uid, + float Multiplier, + bool Apply) { - // The entity whose metabolism is being modified - public EntityUid Uid; - - // What the metabolism's update rate will be multiplied by - public float Multiplier; - - // Apply this multiplier or ignore / reset it? - public bool Apply; + /// + /// The entity whose metabolism is being modified. + /// + public readonly EntityUid Uid = Uid; + + /// + /// What the metabolism's update rate will be multiplied by. + /// + public readonly float Multiplier = Multiplier; + + /// + /// If true, apply the multiplier. If false, revert it. + /// + public readonly bool Apply = Apply; } } + +[ByRefEvent] +public record struct TryMetabolizeReagent(ReagentId Reagent, ReagentPrototype Prototype, FixedPoint2 Quantity, float Scale = 1f, float QuantityMultiplier = 1f); diff --git a/Content.Server/Body/Systems/RespiratorSystem.cs b/Content.Server/Body/Systems/RespiratorSystem.cs index 0fd61a9cb7b..c7266e2c463 100644 --- a/Content.Server/Body/Systems/RespiratorSystem.cs +++ b/Content.Server/Body/Systems/RespiratorSystem.cs @@ -35,9 +35,21 @@ public override void Initialize() // We want to process lung reagents before we inhale new reagents. UpdatesAfter.Add(typeof(MetabolizerSystem)); + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnUnpaused); SubscribeLocalEvent(OnApplyMetabolicMultiplier); } + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + ent.Comp.NextUpdate = _gameTiming.CurTime + ent.Comp.UpdateInterval; + } + + private void OnUnpaused(Entity ent, ref EntityUnpausedEvent args) + { + ent.Comp.NextUpdate += args.PausedTime; + } + public override void Update(float frameTime) { base.Update(frameTime); @@ -45,17 +57,15 @@ public override void Update(float frameTime) var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var respirator, out var body)) { - if (_mobState.IsDead(uid)) - { + if (_gameTiming.CurTime < respirator.NextUpdate) continue; - } - respirator.AccumulatedFrametime += frameTime; + respirator.NextUpdate += respirator.UpdateInterval; - if (respirator.AccumulatedFrametime < respirator.CycleDelay) + if (_mobState.IsDead(uid)) continue; - respirator.AccumulatedFrametime -= respirator.CycleDelay; - UpdateSaturation(uid, -respirator.CycleDelay, respirator); + + UpdateSaturation(uid, -(float) respirator.UpdateInterval.TotalSeconds, respirator); if (!_mobState.IsIncapacitated(uid)) // cannot breathe in crit. { @@ -80,30 +90,30 @@ public override void Update(float frameTime) _popupSystem.PopupEntity(Loc.GetString("lung-behavior-gasp"), uid); } - TakeSuffocationDamage(uid, respirator); + TakeSuffocationDamage((uid, respirator)); respirator.SuffocationCycles += 1; continue; } - StopSuffocation(uid, respirator); + StopSuffocation((uid, respirator)); respirator.SuffocationCycles = 0; } } public void Inhale(EntityUid uid, BodyComponent? body = null) { - if (!Resolve(uid, ref body, false)) + if (!Resolve(uid, ref body, logMissing: false)) return; var organs = _bodySystem.GetBodyOrganComponents(uid, body); // Inhale gas var ev = new InhaleLocationEvent(); - RaiseLocalEvent(uid, ev); + RaiseLocalEvent(uid, ref ev, broadcast: false); - ev.Gas ??= _atmosSys.GetContainingMixture(uid, false, true); + ev.Gas ??= _atmosSys.GetContainingMixture(uid, excite: true); - if (ev.Gas == null) + if (ev.Gas is null) { return; } @@ -122,7 +132,7 @@ public void Inhale(EntityUid uid, BodyComponent? body = null) public void Exhale(EntityUid uid, BodyComponent? body = null) { - if (!Resolve(uid, ref body, false)) + if (!Resolve(uid, ref body, logMissing: false)) return; var organs = _bodySystem.GetBodyOrganComponents(uid, body); @@ -130,11 +140,11 @@ public void Exhale(EntityUid uid, BodyComponent? body = null) // exhale gas var ev = new ExhaleLocationEvent(); - RaiseLocalEvent(uid, ev, false); + RaiseLocalEvent(uid, ref ev, broadcast: false); - if (ev.Gas == null) + if (ev.Gas is null) { - ev.Gas = _atmosSys.GetContainingMixture(uid, false, true); + ev.Gas = _atmosSys.GetContainingMixture(uid, excite: true); // Walls and grids without atmos comp return null. I guess it makes sense to not be able to exhale in walls, // but this also means you cannot exhale on some grids. @@ -154,37 +164,37 @@ public void Exhale(EntityUid uid, BodyComponent? body = null) _atmosSys.Merge(ev.Gas, outGas); } - private void TakeSuffocationDamage(EntityUid uid, RespiratorComponent respirator) + private void TakeSuffocationDamage(Entity ent) { - if (respirator.SuffocationCycles == 2) - _adminLogger.Add(LogType.Asphyxiation, $"{ToPrettyString(uid):entity} started suffocating"); + if (ent.Comp.SuffocationCycles == 2) + _adminLogger.Add(LogType.Asphyxiation, $"{ToPrettyString(ent):entity} started suffocating"); - if (respirator.SuffocationCycles >= respirator.SuffocationCycleThreshold) + if (ent.Comp.SuffocationCycles >= ent.Comp.SuffocationCycleThreshold) { // TODO: This is not going work with multiple different lungs, if that ever becomes a possibility - var organs = _bodySystem.GetBodyOrganComponents(uid); + var organs = _bodySystem.GetBodyOrganComponents(ent); foreach (var (comp, _) in organs) { - _alertsSystem.ShowAlert(uid, comp.Alert); + _alertsSystem.ShowAlert(ent, comp.Alert); } } - _damageableSys.TryChangeDamage(uid, respirator.Damage, false, false); + _damageableSys.TryChangeDamage(ent, ent.Comp.Damage, interruptsDoAfters: false); } - private void StopSuffocation(EntityUid uid, RespiratorComponent respirator) + private void StopSuffocation(Entity ent) { - if (respirator.SuffocationCycles >= 2) - _adminLogger.Add(LogType.Asphyxiation, $"{ToPrettyString(uid):entity} stopped suffocating"); + if (ent.Comp.SuffocationCycles >= 2) + _adminLogger.Add(LogType.Asphyxiation, $"{ToPrettyString(ent):entity} stopped suffocating"); // TODO: This is not going work with multiple different lungs, if that ever becomes a possibility - var organs = _bodySystem.GetBodyOrganComponents(uid); + var organs = _bodySystem.GetBodyOrganComponents(ent); foreach (var (comp, _) in organs) { - _alertsSystem.ClearAlert(uid, comp.Alert); + _alertsSystem.ClearAlert(ent, comp.Alert); } - _damageableSys.TryChangeDamage(uid, respirator.DamageRecovery); + _damageableSys.TryChangeDamage(ent, ent.Comp.DamageRecovery); } public void UpdateSaturation(EntityUid uid, float amount, @@ -198,35 +208,29 @@ public void UpdateSaturation(EntityUid uid, float amount, Math.Clamp(respirator.Saturation, respirator.MinSaturation, respirator.MaxSaturation); } - private void OnApplyMetabolicMultiplier(EntityUid uid, RespiratorComponent component, - ApplyMetabolicMultiplierEvent args) + private void OnApplyMetabolicMultiplier( + Entity ent, + ref ApplyMetabolicMultiplierEvent args) { if (args.Apply) { - component.CycleDelay *= args.Multiplier; - component.Saturation *= args.Multiplier; - component.MaxSaturation *= args.Multiplier; - component.MinSaturation *= args.Multiplier; + ent.Comp.UpdateInterval *= args.Multiplier; + ent.Comp.Saturation *= args.Multiplier; + ent.Comp.MaxSaturation *= args.Multiplier; + ent.Comp.MinSaturation *= args.Multiplier; return; } // This way we don't have to worry about it breaking if the stasis bed component is destroyed - component.CycleDelay /= args.Multiplier; - component.Saturation /= args.Multiplier; - component.MaxSaturation /= args.Multiplier; - component.MinSaturation /= args.Multiplier; - // Reset the accumulator properly - if (component.AccumulatedFrametime >= component.CycleDelay) - component.AccumulatedFrametime = component.CycleDelay; + ent.Comp.UpdateInterval /= args.Multiplier; + ent.Comp.Saturation /= args.Multiplier; + ent.Comp.MaxSaturation /= args.Multiplier; + ent.Comp.MinSaturation /= args.Multiplier; } } -public sealed class InhaleLocationEvent : EntityEventArgs -{ - public GasMixture? Gas; -} +[ByRefEvent] +public record struct InhaleLocationEvent(GasMixture? Gas); -public sealed class ExhaleLocationEvent : EntityEventArgs -{ - public GasMixture? Gas; -} +[ByRefEvent] +public record struct ExhaleLocationEvent(GasMixture? Gas); diff --git a/Content.Server/Body/Systems/StomachSystem.cs b/Content.Server/Body/Systems/StomachSystem.cs index 4c11244c379..a4c2e8292dd 100644 --- a/Content.Server/Body/Systems/StomachSystem.cs +++ b/Content.Server/Body/Systems/StomachSystem.cs @@ -3,32 +3,44 @@ using Content.Shared.Body.Organ; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Components.SolutionManager; +using Robust.Shared.Timing; using Robust.Shared.Utility; namespace Content.Server.Body.Systems { public sealed class StomachSystem : EntitySystem { + [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; public const string DefaultSolutionName = "stomach"; public override void Initialize() { + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnUnpaused); SubscribeLocalEvent(OnApplyMetabolicMultiplier); } + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + ent.Comp.NextUpdate = _gameTiming.CurTime + ent.Comp.UpdateInterval; + } + + private void OnUnpaused(Entity ent, ref EntityUnpausedEvent args) + { + ent.Comp.NextUpdate += args.PausedTime; + } + public override void Update(float frameTime) { var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var stomach, out var organ, out var sol)) { - stomach.AccumulatedFrameTime += frameTime; - - if (stomach.AccumulatedFrameTime < stomach.UpdateInterval) + if (_gameTiming.CurTime < stomach.NextUpdate) continue; - stomach.AccumulatedFrameTime -= stomach.UpdateInterval; + stomach.NextUpdate += stomach.UpdateInterval; // Get our solutions if (!_solutionContainerSystem.ResolveSolution((uid, sol), DefaultSolutionName, ref stomach.Solution, out var stomachSolution)) @@ -70,49 +82,44 @@ public override void Update(float frameTime) } } - private void OnApplyMetabolicMultiplier(EntityUid uid, StomachComponent component, - ApplyMetabolicMultiplierEvent args) + private void OnApplyMetabolicMultiplier( + Entity ent, + ref ApplyMetabolicMultiplierEvent args) { if (args.Apply) { - component.UpdateInterval *= args.Multiplier; + ent.Comp.UpdateInterval *= args.Multiplier; return; } // This way we don't have to worry about it breaking if the stasis bed component is destroyed - component.UpdateInterval /= args.Multiplier; - // Reset the accumulator properly - if (component.AccumulatedFrameTime >= component.UpdateInterval) - component.AccumulatedFrameTime = component.UpdateInterval; + ent.Comp.UpdateInterval /= args.Multiplier; } - public bool CanTransferSolution(EntityUid uid, Solution solution, + public bool CanTransferSolution( + EntityUid uid, + Solution solution, StomachComponent? stomach = null, SolutionContainerManagerComponent? solutions = null) { - if (!Resolve(uid, ref stomach, ref solutions, false)) - return false; - - if (!_solutionContainerSystem.ResolveSolution((uid, solutions), DefaultSolutionName, ref stomach.Solution, out var stomachSolution)) - return false; - - // TODO: For now no partial transfers. Potentially change by design - if (!stomachSolution.CanAddSolution(solution)) - return false; - - return true; + return Resolve(uid, ref stomach, ref solutions, logMissing: false) + && _solutionContainerSystem.ResolveSolution((uid, solutions), DefaultSolutionName, ref stomach.Solution, out var stomachSolution) + // TODO: For now no partial transfers. Potentially change by design + && stomachSolution.CanAddSolution(solution); } - public bool TryTransferSolution(EntityUid uid, Solution solution, + public bool TryTransferSolution( + EntityUid uid, + Solution solution, StomachComponent? stomach = null, SolutionContainerManagerComponent? solutions = null) { - if (!Resolve(uid, ref stomach, ref solutions, false)) - return false; - - if (!_solutionContainerSystem.ResolveSolution((uid, solutions), DefaultSolutionName, ref stomach.Solution) + if (!Resolve(uid, ref stomach, ref solutions, logMissing: false) + || !_solutionContainerSystem.ResolveSolution((uid, solutions), DefaultSolutionName, ref stomach.Solution) || !CanTransferSolution(uid, solution, stomach, solutions)) + { return false; + } _solutionContainerSystem.TryAddSolution(stomach.Solution.Value, solution); // Add each reagent to ReagentDeltas. Used to track how long each reagent has been in the stomach diff --git a/Content.Server/Body/Systems/ThermalRegulatorSystem.cs b/Content.Server/Body/Systems/ThermalRegulatorSystem.cs index a9556be7738..a8bf4184ac8 100644 --- a/Content.Server/Body/Systems/ThermalRegulatorSystem.cs +++ b/Content.Server/Body/Systems/ThermalRegulatorSystem.cs @@ -1,73 +1,95 @@ -using Content.Server.Body.Components; +using Content.Server.Body.Components; using Content.Server.Temperature.Components; using Content.Server.Temperature.Systems; using Content.Shared.ActionBlocker; +using Robust.Shared.Timing; namespace Content.Server.Body.Systems; public sealed class ThermalRegulatorSystem : EntitySystem { + [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly TemperatureSystem _tempSys = default!; [Dependency] private readonly ActionBlockerSystem _actionBlockerSys = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnUnpaused); + } + + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + ent.Comp.NextUpdate = _gameTiming.CurTime + ent.Comp.UpdateInterval; + } + + private void OnUnpaused(Entity ent, ref EntityUnpausedEvent args) + { + ent.Comp.NextUpdate += args.PausedTime; + } + public override void Update(float frameTime) { var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var regulator)) { - regulator.AccumulatedFrametime += frameTime; - if (regulator.AccumulatedFrametime < 1) + if (_gameTiming.CurTime < regulator.NextUpdate) continue; - regulator.AccumulatedFrametime -= 1; - ProcessThermalRegulation(uid, regulator); + regulator.NextUpdate += regulator.UpdateInterval; + ProcessThermalRegulation((uid, regulator)); } } /// /// Processes thermal regulation for a mob /// - private void ProcessThermalRegulation(EntityUid uid, ThermalRegulatorComponent comp) + private void ProcessThermalRegulation(Entity ent) { - if (!EntityManager.TryGetComponent(uid, out TemperatureComponent? temperatureComponent)) return; + if (!Resolve(ent, ref ent.Comp2, logMissing: false)) + return; - var totalMetabolismTempChange = comp.MetabolismHeat - comp.RadiatedHeat; + var totalMetabolismTempChange = ent.Comp1.MetabolismHeat - ent.Comp1.RadiatedHeat; // implicit heat regulation - var tempDiff = Math.Abs(temperatureComponent.CurrentTemperature - comp.NormalBodyTemperature); - var heatCapacity = _tempSys.GetHeatCapacity(uid, temperatureComponent); + var tempDiff = Math.Abs(ent.Comp2.CurrentTemperature - ent.Comp1.NormalBodyTemperature); + var heatCapacity = _tempSys.GetHeatCapacity(ent, ent); var targetHeat = tempDiff * heatCapacity; - if (temperatureComponent.CurrentTemperature > comp.NormalBodyTemperature) + if (ent.Comp2.CurrentTemperature > ent.Comp1.NormalBodyTemperature) { - totalMetabolismTempChange -= Math.Min(targetHeat, comp.ImplicitHeatRegulation); + totalMetabolismTempChange -= Math.Min(targetHeat, ent.Comp1.ImplicitHeatRegulation); } else { - totalMetabolismTempChange += Math.Min(targetHeat, comp.ImplicitHeatRegulation); + totalMetabolismTempChange += Math.Min(targetHeat, ent.Comp1.ImplicitHeatRegulation); } - _tempSys.ChangeHeat(uid, totalMetabolismTempChange, true, temperatureComponent); + _tempSys.ChangeHeat(ent, totalMetabolismTempChange, ignoreHeatResistance: true, ent); // recalc difference and target heat - tempDiff = Math.Abs(temperatureComponent.CurrentTemperature - comp.NormalBodyTemperature); + tempDiff = Math.Abs(ent.Comp2.CurrentTemperature - ent.Comp1.NormalBodyTemperature); targetHeat = tempDiff * heatCapacity; // if body temperature is not within comfortable, thermal regulation // processes starts - if (tempDiff > comp.ThermalRegulationTemperatureThreshold) + if (tempDiff > ent.Comp1.ThermalRegulationTemperatureThreshold) return; - if (temperatureComponent.CurrentTemperature > comp.NormalBodyTemperature) + if (ent.Comp2.CurrentTemperature > ent.Comp1.NormalBodyTemperature) { - if (!_actionBlockerSys.CanSweat(uid)) return; - _tempSys.ChangeHeat(uid, -Math.Min(targetHeat, comp.SweatHeatRegulation), true, - temperatureComponent); + if (!_actionBlockerSys.CanSweat(ent)) + return; + + _tempSys.ChangeHeat(ent, -Math.Min(targetHeat, ent.Comp1.SweatHeatRegulation), ignoreHeatResistance: true, ent); } else { - if (!_actionBlockerSys.CanShiver(uid)) return; - _tempSys.ChangeHeat(uid, Math.Min(targetHeat, comp.ShiveringHeatRegulation), true, - temperatureComponent); + if (!_actionBlockerSys.CanShiver(ent)) + return; + + _tempSys.ChangeHeat(ent, Math.Min(targetHeat, ent.Comp1.ShiveringHeatRegulation), ignoreHeatResistance: true, ent); } } } diff --git a/Content.Server/Cargo/Components/CargoPalletComponent.cs b/Content.Server/Cargo/Components/CargoPalletComponent.cs index ebf0be93e0c..cdfd0a3874f 100644 --- a/Content.Server/Cargo/Components/CargoPalletComponent.cs +++ b/Content.Server/Cargo/Components/CargoPalletComponent.cs @@ -1,7 +1,26 @@ namespace Content.Server.Cargo.Components; +using Content.Shared.Actions; +using Robust.Shared.Serialization.TypeSerializers.Implementations; /// /// Any entities intersecting when a shuttle is recalled will be sold. /// + +[Flags] +public enum BuySellType : byte +{ + Buy = 1 << 0, + Sell = 1 << 1, + All = Buy | Sell +} + + [RegisterComponent] -public sealed partial class CargoPalletComponent : Component {} +public sealed partial class CargoPalletComponent : Component +{ + /// + /// Whether the pad is a buy pad, a sell pad, or all. + /// + [DataField] + public BuySellType PalletType; +} diff --git a/Content.Server/Cargo/Components/StationCargoBountyDatabaseComponent.cs b/Content.Server/Cargo/Components/StationCargoBountyDatabaseComponent.cs index 48c58321b38..d26794a6323 100644 --- a/Content.Server/Cargo/Components/StationCargoBountyDatabaseComponent.cs +++ b/Content.Server/Cargo/Components/StationCargoBountyDatabaseComponent.cs @@ -12,7 +12,7 @@ public sealed partial class StationCargoBountyDatabaseComponent : Component /// Maximum amount of bounties a station can have. /// [DataField, ViewVariables(VVAccess.ReadWrite)] - public int MaxBounties = 5; + public int MaxBounties = 6; /// /// A list of all the bounties currently active for a station. diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs index ebe66ff029e..d8b55a7237f 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs @@ -205,7 +205,7 @@ private void OnApproveOrderMessage(EntityUid uid, CargoOrderConsoleComponent com // Try to fulfill from any station where possible, if the pad is not occupied. foreach (var trade in _listEnts) { - var tradePads = GetCargoPallets(trade); + var tradePads = GetCargoPallets(trade, BuySellType.Buy); _random.Shuffle(tradePads); var freePads = GetFreeCargoPallets(trade, tradePads); diff --git a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs index 3e39440da56..b8a491f4e89 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs @@ -198,13 +198,16 @@ private List GetProjectedOrders( /// private int GetCargoSpace(EntityUid gridUid) { - var space = GetCargoPallets(gridUid).Count; + var space = GetCargoPallets(gridUid, BuySellType.Buy).Count; return space; } - private List<(EntityUid Entity, CargoPalletComponent Component, TransformComponent PalletXform)> GetCargoPallets(EntityUid gridUid) + /// GetCargoPallets(gridUid, BuySellType.Sell) to return only Sell pads + /// GetCargoPallets(gridUid, BuySellType.Buy) to return only Buy pads + private List<(EntityUid Entity, CargoPalletComponent Component, TransformComponent PalletXform)> GetCargoPallets(EntityUid gridUid, BuySellType requestType = BuySellType.All) { _pads.Clear(); + var query = AllEntityQuery(); while (query.MoveNext(out var uid, out var comp, out var compXform)) @@ -215,7 +218,13 @@ private int GetCargoSpace(EntityUid gridUid) continue; } + if ((requestType & comp.PalletType) == 0) + { + continue; + } + _pads.Add((uid, comp, compXform)); + } return _pads; @@ -275,7 +284,7 @@ private void GetPalletGoods(EntityUid gridUid, out HashSet toSell, ou amount = 0; toSell = new HashSet(); - foreach (var (palletUid, _, _) in GetCargoPallets(gridUid)) + foreach (var (palletUid, _, _) in GetCargoPallets(gridUid, BuySellType.Sell)) { // Containers should already get the sell price of their children so can skip those. _setEnts.Clear(); diff --git a/Content.Server/Cargo/Systems/CargoSystem.cs b/Content.Server/Cargo/Systems/CargoSystem.cs index 2609d06b55d..3d6fc964725 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.cs @@ -39,7 +39,6 @@ public sealed partial class CargoSystem : SharedCargoSystem [Dependency] private readonly PricingSystem _pricing = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedTransformSystem _xformSystem = default!; [Dependency] private readonly ShuttleConsoleSystem _console = default!; [Dependency] private readonly StackSystem _stack = default!; [Dependency] private readonly StationSystem _station = default!; diff --git a/Content.Server/Cargo/Systems/PricingSystem.cs b/Content.Server/Cargo/Systems/PricingSystem.cs index 6fb36c96083..9e1970d63c9 100644 --- a/Content.Server/Cargo/Systems/PricingSystem.cs +++ b/Content.Server/Cargo/Systems/PricingSystem.cs @@ -12,7 +12,6 @@ using Content.Shared.Stacks; using Robust.Shared.Console; using Robust.Shared.Containers; -using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Prototypes; using Robust.Shared.Utility; @@ -27,7 +26,6 @@ public sealed class PricingSystem : EntitySystem { [Dependency] private readonly IComponentFactory _factory = default!; [Dependency] private readonly IConsoleHost _consoleHost = default!; - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly BodySystem _bodySystem = default!; [Dependency] private readonly MobStateSystem _mobStateSystem = default!; diff --git a/Content.Server/Chat/Managers/ChatManager.cs b/Content.Server/Chat/Managers/ChatManager.cs index 6d54bedf86c..d12bbfe53c9 100644 --- a/Content.Server/Chat/Managers/ChatManager.cs +++ b/Content.Server/Chat/Managers/ChatManager.cs @@ -125,9 +125,23 @@ public void DispatchServerMessage(ICommonSession player, string message, bool su _adminLogger.Add(LogType.Chat, LogImpact.Low, $"Server message to {player:Player}: {message}"); } - public void SendAdminAnnouncement(string message) + public void SendAdminAnnouncement(string message, AdminFlags? flagBlacklist, AdminFlags? flagWhitelist) { - var clients = _adminManager.ActiveAdmins.Select(p => p.Channel); + var clients = _adminManager.ActiveAdmins.Where(p => + { + var adminData = _adminManager.GetAdminData(p); + + DebugTools.AssertNotNull(adminData); + + if (adminData == null) + return false; + + if (flagBlacklist != null && adminData.HasFlag(flagBlacklist.Value)) + return false; + + return flagWhitelist == null || adminData.HasFlag(flagWhitelist.Value); + + }).Select(p => p.Channel); var wrappedMessage = Loc.GetString("chat-manager-send-admin-announcement-wrap-message", ("adminChannelName", Loc.GetString("chat-manager-admin-channel-name")), ("message", FormattedMessage.EscapeText(message))); diff --git a/Content.Server/Chat/Managers/IChatManager.cs b/Content.Server/Chat/Managers/IChatManager.cs index e5fa8d5f4dc..59945bf5ca6 100644 --- a/Content.Server/Chat/Managers/IChatManager.cs +++ b/Content.Server/Chat/Managers/IChatManager.cs @@ -1,4 +1,5 @@ using System.Diagnostics.CodeAnalysis; +using Content.Shared.Administration; using Content.Shared.Chat; using Robust.Shared.Network; using Robust.Shared.Player; @@ -21,7 +22,7 @@ public interface IChatManager void TrySendOOCMessage(ICommonSession player, string message, OOCChatType type); void SendHookOOC(string sender, string message); - void SendAdminAnnouncement(string message); + void SendAdminAnnouncement(string message, AdminFlags? flagBlacklist = null, AdminFlags? flagWhitelist = null); void SendAdminAlert(string message); void SendAdminAlert(EntityUid player, string message); diff --git a/Content.Server/Chat/Systems/AnnounceOnSpawnSystem.cs b/Content.Server/Chat/Systems/AnnounceOnSpawnSystem.cs index 0f0365e56ba..11dcf42dfd7 100644 --- a/Content.Server/Chat/Systems/AnnounceOnSpawnSystem.cs +++ b/Content.Server/Chat/Systems/AnnounceOnSpawnSystem.cs @@ -1,10 +1,13 @@ using Content.Server.Chat; +using Content.Server.Announcements.Systems; +using Robust.Shared.Player; namespace Content.Server.Chat.Systems; public sealed class AnnounceOnSpawnSystem : EntitySystem { [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly AnnouncerSystem _announcer = default!; public override void Initialize() { @@ -15,8 +18,8 @@ public override void Initialize() private void OnInit(EntityUid uid, AnnounceOnSpawnComponent comp, MapInitEvent args) { - var message = Loc.GetString(comp.Message); var sender = comp.Sender != null ? Loc.GetString(comp.Sender) : "Central Command"; - _chat.DispatchGlobalAnnouncement(message, sender, playSound: true, comp.Sound, comp.Color); + _announcer.SendAnnouncement(_announcer.GetAnnouncementId("SpawnAnnounceCaptain"), Filter.Broadcast(), + comp.Message, sender, comp.Color); } } diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index be6e8b78fef..58bc5dac65f 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -5,6 +5,8 @@ using Content.Server.Administration.Managers; using Content.Server.Chat.Managers; using Content.Server.GameTicking; +using Content.Server.Language; +using Content.Server.Speech; using Content.Server.Speech.Components; using Content.Server.Speech.EntitySystems; using Content.Server.Nyanotrasen.Chat; @@ -17,6 +19,7 @@ using Content.Shared.Chat; using Content.Shared.Database; using Content.Shared.Ghost; +using Content.Shared.Language; using Content.Shared.Humanoid; using Content.Shared.IdentityManagement; using Content.Shared.Interaction; @@ -60,6 +63,7 @@ public sealed partial class ChatSystem : SharedChatSystem [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; [Dependency] private readonly ReplacementAccentSystem _wordreplacement = default!; + [Dependency] private readonly LanguageSystem _language = default!; //Nyano - Summary: pulls in the nyano chat system for psionics. [Dependency] private readonly NyanoChatSystem _nyanoChatSystem = default!; @@ -68,6 +72,7 @@ public sealed partial class ChatSystem : SharedChatSystem public const int WhisperClearRange = 2; // how far whisper goes while still being understandable, in world units public const int WhisperMuffledRange = 5; // how far whisper goes at all, in world units public const string DefaultAnnouncementSound = "/Audio/Announcements/announce.ogg"; + public const float DefaultObfuscationFactor = 0.2f; // Percentage of symbols in a whispered message that can be seen even by "far" listeners private bool _loocEnabled = true; private bool _deadLoocEnabled; @@ -173,7 +178,8 @@ public void TrySendInGameICMessage( ICommonSession? player = null, string? nameOverride = null, bool checkRadioPrefix = true, - bool ignoreActionBlocker = false + bool ignoreActionBlocker = false, + LanguagePrototype? languageOverride = null ) { if (HasComp(source)) @@ -249,10 +255,10 @@ public void TrySendInGameICMessage( switch (desiredType) { case InGameICChatType.Speak: - SendEntitySpeak(source, message, range, nameOverride, hideLog, ignoreActionBlocker); + SendEntitySpeak(source, message, range, nameOverride, hideLog, ignoreActionBlocker, languageOverride: languageOverride); break; case InGameICChatType.Whisper: - SendEntityWhisper(source, message, range, null, nameOverride, hideLog, ignoreActionBlocker); + SendEntityWhisper(source, message, range, null, nameOverride, hideLog, ignoreActionBlocker, languageOverride: languageOverride); break; case InGameICChatType.Emote: SendEntityEmote(source, message, range, nameOverride, hideLog: hideLog, ignoreActionBlocker: ignoreActionBlocker); @@ -382,12 +388,14 @@ private void SendEntitySpeak( ChatTransmitRange range, string? nameOverride, bool hideLog = false, - bool ignoreActionBlocker = false + bool ignoreActionBlocker = false, + LanguagePrototype? languageOverride = null ) { if (!_actionBlocker.CanSpeak(source) && !ignoreActionBlocker) return; + // The original message var message = TransformSpeech(source, FormattedMessage.RemoveMarkup(originalMessage)); if (message.Length == 0) @@ -411,18 +419,19 @@ private void SendEntitySpeak( speech = proto; } - name = FormattedMessage.EscapeText(name); + var language = languageOverride ?? _language.GetLanguage(source); - var wrappedMessage = Loc.GetString(speech.Bold ? "chat-manager-entity-say-bold-wrap-message" : "chat-manager-entity-say-wrap-message", - ("entityName", name), - ("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))), - ("fontType", speech.FontId), - ("fontSize", speech.FontSize), - ("message", FormattedMessage.EscapeText(message))); + name = FormattedMessage.EscapeText(name); + // The chat message wrapped in a "x says y" string + var wrappedMessage = WrapPublicMessage(source, name, message, languageOverride: language); + // The chat message obfuscated via language obfuscation + var obfuscated = SanitizeInGameICMessage(source, _language.ObfuscateSpeech(message, language), out var emoteStr, true, _configurationManager.GetCVar(CCVars.ChatPunctuation), (!CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Parent.Name == "en") || (CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Name == "en")); + // The language-obfuscated message wrapped in a "x says y" string + var wrappedObfuscated = WrapPublicMessage(source, name, obfuscated, languageOverride: language); - SendInVoiceRange(ChatChannel.Local, message, wrappedMessage, source, range); + SendInVoiceRange(ChatChannel.Local, name, message, wrappedMessage, obfuscated, wrappedObfuscated, source, range, languageOverride: language); - var ev = new EntitySpokeEvent(source, message, null, null); + var ev = new EntitySpokeEvent(source, message, null, false, language); RaiseLocalEvent(source, ev, true); // To avoid logging any messages sent by entities that are not players, like vendors, cloning, etc. @@ -455,7 +464,8 @@ private void SendEntityWhisper( RadioChannelPrototype? channel, string? nameOverride, bool hideLog = false, - bool ignoreActionBlocker = false + bool ignoreActionBlocker = false, + LanguagePrototype? languageOverride = null ) { if (!_actionBlocker.CanSpeak(source) && !ignoreActionBlocker) @@ -465,8 +475,6 @@ private void SendEntityWhisper( if (message.Length == 0) return; - var obfuscatedMessage = ObfuscateMessageReadability(message, 0.2f); - // get the entity's name by visual identity (if no override provided). string nameIdentity = FormattedMessage.EscapeText(nameOverride ?? Identity.Name(source, EntityManager)); // get the entity's name by voice (if no override provided). @@ -483,41 +491,60 @@ private void SendEntityWhisper( } name = FormattedMessage.EscapeText(name); - var wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message", - ("entityName", name), ("message", FormattedMessage.EscapeText(message))); - - var wrappedobfuscatedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message", - ("entityName", nameIdentity), ("message", FormattedMessage.EscapeText(obfuscatedMessage))); - - var wrappedUnknownMessage = Loc.GetString("chat-manager-entity-whisper-unknown-wrap-message", - ("message", FormattedMessage.EscapeText(obfuscatedMessage))); - + var language = languageOverride ?? _language.GetLanguage(source); + var languageObfuscatedMessage = SanitizeInGameICMessage(source, _language.ObfuscateSpeech(message, language), out var emoteStr, true, _configurationManager.GetCVar(CCVars.ChatPunctuation), (!CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Parent.Name == "en") || (CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Name == "en")); foreach (var (session, data) in GetRecipients(source, WhisperMuffledRange)) { - EntityUid listener; - - if (session.AttachedEntity is not { Valid: true } playerEntity) + if (session.AttachedEntity is not { Valid: true } listener) continue; - listener = session.AttachedEntity.Value; if (MessageRangeCheck(session, data, range) != MessageRangeCheckResult.Full) continue; // Won't get logged to chat, and ghosts are too far away to see the pop-up, so we just won't send it to them. + var canUnderstandLanguage = _language.CanUnderstand(listener, language.ID); + // How the entity perceives the message depends on whether it can understand its language + var perceivedMessage = canUnderstandLanguage ? message : languageObfuscatedMessage; + + // Result is the intermediate message derived from the perceived one via obfuscation + // Wrapped message is the result wrapped in an "x says y" string + string result, wrappedMessage; if (data.Range <= WhisperClearRange) - _chatManager.ChatMessageToOne(ChatChannel.Whisper, message, wrappedMessage, source, false, session.Channel); - //If listener is too far, they only hear fragments of the message - //Collisiongroup.Opaque is not ideal for this use. Preferably, there should be a check specifically with "Can Ent1 see Ent2" in mind - else if (_interactionSystem.InRangeUnobstructed(source, listener, WhisperMuffledRange, Shared.Physics.CollisionGroup.Opaque)) //Shared.Physics.CollisionGroup.Opaque - _chatManager.ChatMessageToOne(ChatChannel.Whisper, obfuscatedMessage, wrappedobfuscatedMessage, source, false, session.Channel); - //If listener is too far and has no line of sight, they can't identify the whisperer's identity + { + // Scenario 1: the listener can clearly understand the message + result = perceivedMessage; + wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message", + ("color", language.Color ?? Color.Gray), + ("entityName", name), + ("message", FormattedMessage.EscapeText(result))); + } + else if (_interactionSystem.InRangeUnobstructed(source, listener, WhisperMuffledRange, Shared.Physics.CollisionGroup.Opaque)) + { + // Scenerio 2: if the listener is too far, they only hear fragments of the message + // Collisiongroup.Opaque is not ideal for this use. Preferably, there should be a check specifically with "Can Ent1 see Ent2" in mind + result = ObfuscateMessageReadability(perceivedMessage); + wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message", + ("entityName", nameIdentity), ("color", language.Color ?? Color.Gray), ("message", FormattedMessage.EscapeText(result))); + } else - _chatManager.ChatMessageToOne(ChatChannel.Whisper, obfuscatedMessage, wrappedUnknownMessage, source, false, session.Channel); + { + // Scenario 3: If listener is too far and has no line of sight, they can't identify the whisperer's identity + result = ObfuscateMessageReadability(perceivedMessage); + wrappedMessage = Loc.GetString("chat-manager-entity-whisper-unknown-wrap-message", + ("color", language.Color ?? Color.Gray), + ("message", FormattedMessage.EscapeText(result))); + } + + _chatManager.ChatMessageToOne(ChatChannel.Whisper, result, wrappedMessage, source, false, session.Channel); } - _replay.RecordServerMessage(new ChatMessage(ChatChannel.Whisper, message, wrappedMessage, GetNetEntity(source), null, MessageRangeHideChatForReplay(range))); + var replayWrap = Loc.GetString("chat-manager-entity-whisper-wrap-message", + ("color", language.Color ?? Color.Gray), + ("entityName", name), + ("message", FormattedMessage.EscapeText(message))); + _replay.RecordServerMessage(new ChatMessage(ChatChannel.Whisper, message, replayWrap, GetNetEntity(source), null, MessageRangeHideChatForReplay(range))); - var ev = new EntitySpokeEvent(source, message, channel, obfuscatedMessage); + var ev = new EntitySpokeEvent(source, message, channel, true, language); RaiseLocalEvent(source, ev, true); if (!hideLog) if (originalMessage == message) @@ -564,7 +591,7 @@ private void SendEntityEmote( if (checkEmote) TryEmoteChatInput(source, action); - SendInVoiceRange(ChatChannel.Emotes, action, wrappedMessage, source, range, author); + SendInVoiceRange(ChatChannel.Emotes, name, action, wrappedMessage, obfuscated: "", obfuscatedWrappedMessage: "", source, range, author); if (!hideLog) if (name != Name(source)) _adminLogger.Add(LogType.Chat, LogImpact.Low, $"Emote from {ToPrettyString(source):user} as {name}: {action}"); @@ -591,7 +618,13 @@ private void SendLOOC(EntityUid source, ICommonSession player, string message, b ("entityName", name), ("message", FormattedMessage.EscapeText(message))); - SendInVoiceRange(ChatChannel.LOOC, message, wrappedMessage, source, hideChat ? ChatTransmitRange.HideChat : ChatTransmitRange.Normal, player.UserId); + SendInVoiceRange(ChatChannel.LOOC, name, message, wrappedMessage, + obfuscated: string.Empty, + obfuscatedWrappedMessage: string.Empty, // will be skipped anyway + source, + hideChat ? ChatTransmitRange.HideChat : ChatTransmitRange.Normal, + player.UserId, + languageOverride: LanguageSystem.Universal); _adminLogger.Add(LogType.Chat, LogImpact.Low, $"LOOC from {player:Player}: {message}"); } @@ -672,15 +705,29 @@ private MessageRangeCheckResult MessageRangeCheck(ICommonSession session, ICChat /// /// Sends a chat message to the given players in range of the source entity. /// - private void SendInVoiceRange(ChatChannel channel, string message, string wrappedMessage, EntityUid source, ChatTransmitRange range, NetUserId? author = null) + private void SendInVoiceRange(ChatChannel channel, string name, string message, string wrappedMessage, string obfuscated, string obfuscatedWrappedMessage, EntityUid source, ChatTransmitRange range, NetUserId? author = null, LanguagePrototype? languageOverride = null) { + var language = languageOverride ?? _language.GetLanguage(source); foreach (var (session, data) in GetRecipients(source, VoiceRange)) { var entRange = MessageRangeCheck(session, data, range); if (entRange == MessageRangeCheckResult.Disallowed) continue; var entHideChat = entRange == MessageRangeCheckResult.HideChat; - _chatManager.ChatMessageToOne(channel, message, wrappedMessage, source, entHideChat, session.Channel, author: author); + if (session.AttachedEntity is not { Valid: true } playerEntity) + continue; + EntityUid listener = session.AttachedEntity.Value; + + + // If the channel does not support languages, or the entity can understand the message, send the original message, otherwise send the obfuscated version + if (channel == ChatChannel.LOOC || channel == ChatChannel.Emotes || _language.CanUnderstand(listener, language.ID)) + { + _chatManager.ChatMessageToOne(channel, message, wrappedMessage, source, entHideChat, session.Channel, author: author); + } + else + { + _chatManager.ChatMessageToOne(channel, obfuscated, obfuscatedWrappedMessage, source, entHideChat, session.Channel, author: author); + } } _replay.RecordServerMessage(new ChatMessage(channel, message, wrappedMessage, GetNetEntity(source), null, MessageRangeHideChatForReplay(range))); @@ -790,6 +837,22 @@ public string SanitizeMessageReplaceWords(string message) return msg; } + /// + /// Wraps a message sent by the specified entity into an "x says y" string. + /// + public string WrapPublicMessage(EntityUid source, string name, string message, LanguagePrototype? languageOverride = null) + { + var language = languageOverride ?? _language.GetLanguage(source); + var speech = GetSpeechVerb(source, message); + return Loc.GetString(speech.Bold ? "chat-manager-entity-say-bold-wrap-message" : "chat-manager-entity-say-wrap-message", + ("color", language.Color ?? Color.White), + ("entityName", name), + ("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))), + ("fontType", language.FontId ?? speech.FontId), + ("fontSize", language.FontSize ?? speech.FontSize), + ("message", message)); + } + /// /// Returns list of players and ranges for all players withing some range. Also returns observers with a range of -1. /// @@ -836,7 +899,7 @@ public readonly record struct ICChatRecipientData(float Range, bool Observer, bo { } - private string ObfuscateMessageReadability(string message, float chance) + public string ObfuscateMessageReadability(string message, float chance = DefaultObfuscationFactor) { var modifiedMessage = new StringBuilder(message); @@ -925,7 +988,8 @@ public sealed class EntitySpokeEvent : EntityEventArgs { public readonly EntityUid Source; public readonly string Message; - public readonly string? ObfuscatedMessage; // not null if this was a whisper + public readonly bool IsWhisper; + public readonly LanguagePrototype Language; /// /// If the entity was trying to speak into a radio, this was the channel they were trying to access. If a radio @@ -933,12 +997,13 @@ public sealed class EntitySpokeEvent : EntityEventArgs /// public RadioChannelPrototype? Channel; - public EntitySpokeEvent(EntityUid source, string message, RadioChannelPrototype? channel, string? obfuscatedMessage) + public EntitySpokeEvent(EntityUid source, string message, RadioChannelPrototype? channel, bool isWhisper, LanguagePrototype language) { Source = source; Message = message; Channel = channel; - ObfuscatedMessage = obfuscatedMessage; + IsWhisper = isWhisper; + Language = language; } } diff --git a/Content.Server/Chemistry/Containers/EntitySystems/SolutionContainerSystem.cs b/Content.Server/Chemistry/Containers/EntitySystems/SolutionContainerSystem.cs index 7926121c2b3..468212f5eaf 100644 --- a/Content.Server/Chemistry/Containers/EntitySystems/SolutionContainerSystem.cs +++ b/Content.Server/Chemistry/Containers/EntitySystems/SolutionContainerSystem.cs @@ -4,7 +4,6 @@ using Content.Shared.FixedPoint; using Robust.Shared.Containers; using Robust.Shared.Map; -using Robust.Shared.Network; using Robust.Shared.Utility; using System.Numerics; @@ -12,8 +11,6 @@ namespace Content.Server.Chemistry.Containers.EntitySystems; public sealed partial class SolutionContainerSystem : SharedSolutionContainerSystem { - [Dependency] private readonly INetManager _netManager = default!; - public override void Initialize() { base.Initialize(); diff --git a/Content.Server/Chemistry/EntitySystems/ReagentDispenserSystem.cs b/Content.Server/Chemistry/EntitySystems/ReagentDispenserSystem.cs index b93498fe31b..a8583e6bcb3 100644 --- a/Content.Server/Chemistry/EntitySystems/ReagentDispenserSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/ReagentDispenserSystem.cs @@ -1,4 +1,3 @@ -using Content.Server.Administration.Logs; using Content.Server.Chemistry.Components; using Content.Server.Chemistry.Containers.EntitySystems; using Content.Server.Nutrition.EntitySystems; @@ -30,7 +29,6 @@ public sealed class ReagentDispenserSystem : EntitySystem [Dependency] private readonly ItemSlotsSystem _itemSlotsSystem = default!; [Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly IAdminLogManager _adminLogger = default!; [Dependency] private readonly OpenableSystem _openable = default!; public override void Initialize() diff --git a/Content.Server/Chemistry/ReagentEffectConditions/ReagentThreshold.cs b/Content.Server/Chemistry/ReagentEffectConditions/ReagentThreshold.cs index 664569d7be4..50be89581fb 100644 --- a/Content.Server/Chemistry/ReagentEffectConditions/ReagentThreshold.cs +++ b/Content.Server/Chemistry/ReagentEffectConditions/ReagentThreshold.cs @@ -31,7 +31,7 @@ public override bool Condition(ReagentEffectArgs args) var quant = FixedPoint2.Zero; if (args.Source != null) - quant = args.Source.GetTotalPrototypeQuantity(reagent); + quant = args.Source.GetTotalPrototypeQuantity(reagent) * args.QuantityMultiplier; return quant >= Min && quant <= Max; } diff --git a/Content.Server/Chemistry/ReagentEffects/Drunk.cs b/Content.Server/Chemistry/ReagentEffects/Drunk.cs index dbce995ca2e..6088db5787c 100644 --- a/Content.Server/Chemistry/ReagentEffects/Drunk.cs +++ b/Content.Server/Chemistry/ReagentEffects/Drunk.cs @@ -25,7 +25,7 @@ public override void Effect(ReagentEffectArgs args) { var boozePower = BoozePower; - boozePower *= args.Scale; + boozePower *= Math.Max(args.Scale, 1); var drunkSys = args.EntityManager.EntitySysManager.GetEntitySystem(); drunkSys.TryApplyDrunkenness(args.SolutionEntity, boozePower, SlurSpeech); diff --git a/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs b/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs index bf7691fe375..8d5a583f6d8 100644 --- a/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs +++ b/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs @@ -1,10 +1,18 @@ +using System.Linq; using Content.Server.Ghost.Roles.Components; +using Content.Server.Language; +using Content.Server.Language.Events; using Content.Server.Speech.Components; using Content.Shared.Chemistry.Reagent; +using Content.Shared.Language; +using Content.Shared.Language.Systems; using Content.Shared.Mind.Components; using Robust.Shared.Prototypes; -using Content.Server.Psionics; //Nyano - Summary: pulls in the ability for the sentient creature to become psionic. -using Content.Shared.Humanoid; //Delta-V - Banning humanoids from becoming ghost roles. +using Content.Server.Psionics; +using Content.Shared.Body.Part; //Nyano - Summary: pulls in the ability for the sentient creature to become psionic. +using Content.Shared.Humanoid; +using Content.Shared.Language.Components; //Delta-V - Banning humanoids from becoming ghost roles. +using Content.Shared.Language.Events; namespace Content.Server.Chemistry.ReagentEffects; @@ -24,6 +32,19 @@ public override void Effect(ReagentEffectArgs args) entityManager.RemoveComponent(uid); entityManager.RemoveComponent(uid); + // Make sure the entity knows at least fallback (Galactic Common) + var speaker = entityManager.EnsureComponent(uid); + var knowledge = entityManager.EnsureComponent(uid); + var fallback = SharedLanguageSystem.FallbackLanguagePrototype; + + if (!knowledge.UnderstoodLanguages.Contains(fallback)) + knowledge.UnderstoodLanguages.Add(fallback); + + if (!knowledge.SpokenLanguages.Contains(fallback)) + knowledge.SpokenLanguages.Add(fallback); + + IoCManager.Resolve().GetEntitySystem().UpdateEntityLanguages(uid, speaker); + // Stops from adding a ghost role to things like people who already have a mind if (entityManager.TryGetComponent(uid, out var mindContainer) && mindContainer.HasMind) { @@ -47,7 +68,7 @@ public override void Effect(ReagentEffectArgs args) ghostRole = entityManager.AddComponent(uid); entityManager.EnsureComponent(uid); - entityManager.EnsureComponent(uid); //Nyano - Summary:. Makes the animated body able to get psionics. + entityManager.EnsureComponent(uid); //Nyano - Summary:. Makes the animated body able to get psionics. var entityData = entityManager.GetComponent(uid); ghostRole.RoleName = entityData.EntityName; diff --git a/Content.Server/Communications/CommsHackerSystem.cs b/Content.Server/Communications/CommsHackerSystem.cs index 1248d214003..bbe64a7987a 100644 --- a/Content.Server/Communications/CommsHackerSystem.cs +++ b/Content.Server/Communications/CommsHackerSystem.cs @@ -9,6 +9,8 @@ using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Serialization; +using Content.Server.Announcements.Systems; +using Robust.Shared.Player; namespace Content.Server.Communications; @@ -21,6 +23,7 @@ public sealed class CommsHackerSystem : SharedCommsHackerSystem // TODO: remove when generic check event is used [Dependency] private readonly NinjaGlovesSystem _gloves = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly AnnouncerSystem _announcer = default!; public override void Initialize() { @@ -79,7 +82,8 @@ private void OnDoAfter(EntityUid uid, CommsHackerComponent comp, TerrorDoAfterEv public void CallInThreat(NinjaHackingThreatPrototype ninjaHackingThreat) { _gameTicker.StartGameRule(ninjaHackingThreat.Rule, out _); - _chat.DispatchGlobalAnnouncement(Loc.GetString(ninjaHackingThreat.Announcement), playSound: true, colorOverride: Color.Red); + _announcer.SendAnnouncement(_announcer.GetAnnouncementId("NinjaHacking"), Filter.Broadcast(), + ninjaHackingThreat.Announcement, colorOverride: Color.Red); } } diff --git a/Content.Server/Communications/CommunicationsConsoleSystem.cs b/Content.Server/Communications/CommunicationsConsoleSystem.cs index 6b745c8cd95..17573c3da64 100644 --- a/Content.Server/Communications/CommunicationsConsoleSystem.cs +++ b/Content.Server/Communications/CommunicationsConsoleSystem.cs @@ -24,6 +24,9 @@ using Content.Shared.Popups; using Robust.Server.GameObjects; using Robust.Shared.Configuration; +using Content.Server.Announcements.Systems; +using Robust.Shared.Player; +using Content.Server.Station.Components; namespace Content.Server.Communications { @@ -42,6 +45,7 @@ public sealed class CommunicationsConsoleSystem : EntitySystem [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; + [Dependency] private readonly AnnouncerSystem _announcer = default!; private const float UIUpdateInterval = 5.0f; @@ -276,17 +280,19 @@ private void OnAnnounceMessage(EntityUid uid, CommunicationsConsoleComponent com Loc.TryGetString(comp.Title, out var title); title ??= comp.Title; - msg += "\n" + Loc.GetString("comms-console-announcement-sent-by") + " " + author; + msg += $"\n{Loc.GetString("comms-console-announcement-sent-by")} {author}"; if (comp.Global) { - _chatSystem.DispatchGlobalAnnouncement(msg, title, announcementSound: comp.Sound, colorOverride: comp.Color); + _announcer.SendAnnouncement("announce", Filter.Broadcast(), msg, title, comp.Color); if (message.Session.AttachedEntity != null) _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(message.Session.AttachedEntity.Value):player} has sent the following global announcement: {msg}"); return; } - _chatSystem.DispatchStationAnnouncement(uid, msg, title, colorOverride: comp.Color); + if (TryComp(_stationSystem.GetOwningStation(uid), out var stationData)) + _announcer.SendAnnouncement("announce", _stationSystem.GetInStation(stationData), msg, title, + comp.Color); if (message.Session.AttachedEntity != null) _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(message.Session.AttachedEntity.Value):player} has sent the following station announcement: {msg}"); diff --git a/Content.Server/Database/ServerDbBase.cs b/Content.Server/Database/ServerDbBase.cs index 7c9ffe29e80..a550479b30f 100644 --- a/Content.Server/Database/ServerDbBase.cs +++ b/Content.Server/Database/ServerDbBase.cs @@ -216,6 +216,8 @@ private static HumanoidCharacterProfile ConvertProfiles(Profile profile) profile.CharacterName, profile.FlavorText, profile.Species, + profile.Height, + profile.Width, profile.Age, sex, gender, @@ -257,6 +259,8 @@ private static Profile ConvertProfiles(HumanoidCharacterProfile humanoid, int sl profile.Age = humanoid.Age; profile.Sex = humanoid.Sex.ToString(); profile.Gender = humanoid.Gender.ToString(); + profile.Height = humanoid.Height; + profile.Width = humanoid.Width; profile.HairName = appearance.HairStyleId; profile.HairColor = appearance.HairColor.ToHex(); profile.FacialHairName = appearance.FacialHairStyleId; diff --git a/Content.Server/Decals/Commands/EditDecalCommand.cs b/Content.Server/Decals/Commands/EditDecalCommand.cs index baaef1f3f64..2ae814113f0 100644 --- a/Content.Server/Decals/Commands/EditDecalCommand.cs +++ b/Content.Server/Decals/Commands/EditDecalCommand.cs @@ -3,6 +3,7 @@ using Content.Shared.Administration; using Robust.Shared.Console; using Robust.Shared.Map; +using Robust.Shared.Map.Components; namespace Content.Server.Decals; @@ -10,7 +11,6 @@ namespace Content.Server.Decals; public sealed class EditDecalCommand : IConsoleCommand { [Dependency] private readonly IEntityManager _entManager = default!; - [Dependency] private readonly IMapManager _mapManager = default!; public string Command => "editdecal"; public string Description => "Edits a decal."; @@ -43,7 +43,7 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) return; } - if (!_mapManager.GridExists(gridId)) + if (!_entManager.HasComponent(gridId)) { shell.WriteError($"No grid with gridId {gridId} exists."); return; diff --git a/Content.Server/Decals/Commands/RemoveDecalCommand.cs b/Content.Server/Decals/Commands/RemoveDecalCommand.cs index 771c66fbbd5..6b6a91c9d33 100644 --- a/Content.Server/Decals/Commands/RemoveDecalCommand.cs +++ b/Content.Server/Decals/Commands/RemoveDecalCommand.cs @@ -2,6 +2,7 @@ using Content.Shared.Administration; using Robust.Shared.Console; using Robust.Shared.Map; +using Robust.Shared.Map.Components; using SQLitePCL; namespace Content.Server.Decals.Commands @@ -10,7 +11,6 @@ namespace Content.Server.Decals.Commands public sealed class RemoveDecalCommand : IConsoleCommand { [Dependency] private readonly IEntityManager _entManager = default!; - [Dependency] private readonly IMapManager _mapManager = default!; public string Command => "rmdecal"; public string Description => "removes a decal"; @@ -31,7 +31,7 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) if (!NetEntity.TryParse(args[1], out var rawGridIdNet) || !_entManager.TryGetEntity(rawGridIdNet, out var rawGridId) || - !_mapManager.GridExists(rawGridId)) + !_entManager.HasComponent(rawGridId)) { shell.WriteError("Failed parsing gridId."); return; diff --git a/Content.Server/Decals/DecalSystem.cs b/Content.Server/Decals/DecalSystem.cs index ad225afe224..da95401d206 100644 --- a/Content.Server/Decals/DecalSystem.cs +++ b/Content.Server/Decals/DecalSystem.cs @@ -105,7 +105,7 @@ private void OnGridSplit(ref PostGridSplitEvent ev) return; // Transfer decals over to the new grid. - var enumerator = MapManager.GetGrid(ev.Grid).GetAllTilesEnumerator(); + var enumerator = Comp(ev.Grid).GetAllTilesEnumerator(); var oldChunkCollection = oldComp.ChunkCollection.ChunkCollection; var chunkCollection = newComp.ChunkCollection.ChunkCollection; diff --git a/Content.Server/DeltaV/CartridgeLoader/Cartridges/SecWatchCartridgeComponent.cs b/Content.Server/DeltaV/CartridgeLoader/Cartridges/SecWatchCartridgeComponent.cs new file mode 100644 index 00000000000..7ccc90ef797 --- /dev/null +++ b/Content.Server/DeltaV/CartridgeLoader/Cartridges/SecWatchCartridgeComponent.cs @@ -0,0 +1,23 @@ +using Content.Shared.Security; + +namespace Content.Server.CartridgeLoader.Cartridges; + +[RegisterComponent, Access(typeof(SecWatchCartridgeSystem))] +public sealed partial class SecWatchCartridgeComponent : Component +{ + /// + /// Only show people with these statuses. + /// + [DataField] + public List Statuses = new() + { + SecurityStatus.Suspected, + SecurityStatus.Wanted + }; + + /// + /// Station entity thats getting its records checked. + /// + [DataField] + public EntityUid? Station; +} diff --git a/Content.Server/DeltaV/CartridgeLoader/Cartridges/SecWatchCartridgeSystem.cs b/Content.Server/DeltaV/CartridgeLoader/Cartridges/SecWatchCartridgeSystem.cs new file mode 100644 index 00000000000..16da24514cb --- /dev/null +++ b/Content.Server/DeltaV/CartridgeLoader/Cartridges/SecWatchCartridgeSystem.cs @@ -0,0 +1,73 @@ +using Content.Server.Station.Systems; +using Content.Server.StationRecords; +using Content.Server.StationRecords.Systems; +using Content.Shared.CartridgeLoader; +using Content.Shared.CartridgeLoader.Cartridges; +using Content.Shared.CriminalRecords; +using Content.Shared.StationRecords; + +namespace Content.Server.CartridgeLoader.Cartridges; + +public sealed class SecWatchCartridgeSystem : EntitySystem +{ + [Dependency] private readonly CartridgeLoaderSystem _cartridgeLoader = default!; + [Dependency] private readonly StationRecordsSystem _records = default!; + [Dependency] private readonly StationSystem _station = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnRecordModified); + + SubscribeLocalEvent(OnUiReady); + } + + private void OnRecordModified(RecordModifiedEvent args) + { + // when a record is modified update the ui of every loaded cartridge tuned to the same station + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp, out var cartridge)) + { + if (cartridge.LoaderUid is not {} loader || comp.Station != args.Station) + continue; + + UpdateUI((uid, comp), loader); + } + } + + private void OnUiReady(Entity ent, ref CartridgeUiReadyEvent args) + { + UpdateUI(ent, args.Loader); + } + + private void UpdateUI(Entity ent, EntityUid loader) + { + // if the loader is on a grid, update the station + // if it is off grid use the cached station + if (_station.GetOwningStation(loader) is {} station) + ent.Comp.Station = station; + + if (!TryComp(ent.Comp.Station, out var records)) + return; + + station = ent.Comp.Station.Value; + + var entries = new List(); + foreach (var (id, criminal) in _records.GetRecordsOfType(station, records)) + { + if (!ent.Comp.Statuses.Contains(criminal.Status)) + continue; + + var key = new StationRecordKey(id, station); + if (!_records.TryGetRecord(key, out var general, records)) + continue; + + var status = criminal.Status; + entries.Add(new SecWatchEntry(general.Name, general.JobTitle, criminal.Status, criminal.Reason)); + } + + var state = new SecWatchUiState(entries); + _cartridgeLoader.UpdateCartridgeUiState(loader, state); + } +} diff --git a/Content.Server/DeltaV/CartridgeLoader/CrimeAssistCartridgeComponent.cs b/Content.Server/DeltaV/CartridgeLoader/CrimeAssistCartridgeComponent.cs deleted file mode 100644 index 741a6134580..00000000000 --- a/Content.Server/DeltaV/CartridgeLoader/CrimeAssistCartridgeComponent.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace Content.Server.DeltaV.CartridgeLoader.Cartridges; - -[RegisterComponent] -public sealed partial class CrimeAssistCartridgeComponent : Component -{ } diff --git a/Content.Server/DeltaV/CartridgeLoader/CrimeAssistCartridgeSystem.cs b/Content.Server/DeltaV/CartridgeLoader/CrimeAssistCartridgeSystem.cs deleted file mode 100644 index 06732c2c534..00000000000 --- a/Content.Server/DeltaV/CartridgeLoader/CrimeAssistCartridgeSystem.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Content.Shared.CartridgeLoader; -using Content.Server.DeltaV.CartridgeLoader; -using Content.Server.CartridgeLoader.Cartridges; -using Content.Server.CartridgeLoader; - -namespace Content.Server.DeltaV.CartridgeLoader.Cartridges; - -public sealed class CrimeAssistCartridgeSystem : EntitySystem -{ - [Dependency] private readonly CartridgeLoaderSystem? _cartridgeLoaderSystem = default!; - - public override void Initialize() - { - base.Initialize(); - } -} diff --git a/Content.Server/DeltaV/Paper/SignAttemptEvent.cs b/Content.Server/DeltaV/Paper/SignAttemptEvent.cs new file mode 100644 index 00000000000..ff2d1b5103a --- /dev/null +++ b/Content.Server/DeltaV/Paper/SignAttemptEvent.cs @@ -0,0 +1,8 @@ +namespace Content.Server.DeltaV.Paper; + +/// +/// Raised on the pen when trying to sign a paper. +/// If it's cancelled the signature wasn't made. +/// +[ByRefEvent] +public record struct SignAttemptEvent(EntityUid Paper, EntityUid User, bool Cancelled = false); diff --git a/Content.Server/DeltaV/Paper/SignatureSystem.cs b/Content.Server/DeltaV/Paper/SignatureSystem.cs new file mode 100644 index 00000000000..07a249399bc --- /dev/null +++ b/Content.Server/DeltaV/Paper/SignatureSystem.cs @@ -0,0 +1,104 @@ +using Content.Server.Access.Systems; +using Content.Server.Paper; +using Content.Server.Popups; +using Content.Shared.Paper; +using Content.Shared.Popups; +using Content.Shared.Tag; +using Content.Shared.Verbs; +using Robust.Server.Audio; +using Robust.Shared.Player; + +namespace Content.Server.DeltaV.Paper; + +public sealed class SignatureSystem : EntitySystem +{ + [Dependency] private readonly AudioSystem _audio = default!; + [Dependency] private readonly IdCardSystem _idCard = default!; + [Dependency] private readonly PaperSystem _paper = default!; + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly TagSystem _tags = default!; + + // The sprite used to visualize "signatures" on paper entities. + private const string SignatureStampState = "paper_stamp-signature"; + + public override void Initialize() + { + SubscribeLocalEvent>(OnGetAltVerbs); + } + + private void OnGetAltVerbs(Entity ent, ref GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + + if (args.Using is not {} pen || !_tags.HasTag(pen, "Write")) + return; + + var user = args.User; + AlternativeVerb verb = new() + { + Act = () => + { + TrySignPaper(ent, user, pen); + }, + Text = Loc.GetString("paper-sign-verb"), + DoContactInteraction = true, + Priority = 10 + }; + args.Verbs.Add(verb); + } + + /// + /// Tries add add a signature to the paper with signer's name. + /// + public bool TrySignPaper(Entity paper, EntityUid signer, EntityUid pen) + { + var comp = paper.Comp; + + var ev = new SignAttemptEvent(paper, signer); + RaiseLocalEvent(pen, ref ev); + if (ev.Cancelled) + return false; + + var signatureName = DetermineEntitySignature(signer); + + var stampInfo = new StampDisplayInfo() + { + StampedName = signatureName, + StampedColor = Color.DarkSlateGray, //TODO Make this configurable depending on the pen. + }; + + if (!comp.StampedBy.Contains(stampInfo) && _paper.TryStamp(paper, stampInfo, SignatureStampState, comp)) + { + // Show popups and play a paper writing sound + var signedOtherMessage = Loc.GetString("paper-signed-other", ("user", signer), ("target", paper.Owner)); + _popup.PopupEntity(signedOtherMessage, signer, Filter.PvsExcept(signer, entityManager: EntityManager), true); + + var signedSelfMessage = Loc.GetString("paper-signed-self", ("target", paper.Owner)); + _popup.PopupEntity(signedSelfMessage, signer, signer); + + _audio.PlayPvs(comp.Sound, signer); + + _paper.UpdateUserInterface(paper, comp); + + return true; + } + else + { + // Show an error popup + _popup.PopupEntity(Loc.GetString("paper-signed-failure", ("target", paper.Owner)), signer, signer, PopupType.SmallCaution); + + return false; + } + } + + private string DetermineEntitySignature(EntityUid uid) + { + // If the entity has an ID, use the name on it. + if (_idCard.TryFindIdCard(uid, out var id) && !string.IsNullOrWhiteSpace(id.Comp.FullName)) + return id.Comp.FullName; + + // Alternatively, return the entity name + return Name(uid); + } +} diff --git a/Content.Server/DeltaV/StationEvents/Events/PirateRadioSpawnRule.cs b/Content.Server/DeltaV/StationEvents/Events/PirateRadioSpawnRule.cs index f0538c47f95..ba042d89662 100644 --- a/Content.Server/DeltaV/StationEvents/Events/PirateRadioSpawnRule.cs +++ b/Content.Server/DeltaV/StationEvents/Events/PirateRadioSpawnRule.cs @@ -39,7 +39,7 @@ protected override void Started(EntityUid uid, PirateRadioSpawnRuleComponent com var xformQuery = GetEntityQuery(); var aabbs = EntityQuery().SelectMany(x => x.Grids.Select(x => - xformQuery.GetComponent(x).WorldMatrix.TransformBox(_mapManager.GetGridComp(x).LocalAABB))) + xformQuery.GetComponent(x).WorldMatrix.TransformBox(_entities.GetComponent(x).LocalAABB))) .ToArray(); if (aabbs.Length < 1) return; var aabb = aabbs[0]; diff --git a/Content.Server/Disposal/Tube/DisposalTubeSystem.cs b/Content.Server/Disposal/Tube/DisposalTubeSystem.cs index 20aa8b6d2c5..6c0bced53e0 100644 --- a/Content.Server/Disposal/Tube/DisposalTubeSystem.cs +++ b/Content.Server/Disposal/Tube/DisposalTubeSystem.cs @@ -6,20 +6,16 @@ using Content.Server.Disposal.Unit.Components; using Content.Server.Disposal.Unit.EntitySystems; using Content.Server.Popups; -using Content.Server.UserInterface; using Content.Shared.Destructible; using Content.Shared.Disposal.Components; -using Content.Shared.Hands.Components; -using Content.Shared.Movement.Events; using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; -using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Random; -using Robust.Shared.Timing; using static Content.Shared.Disposal.Components.SharedDisposalRouterComponent; using static Content.Shared.Disposal.Components.SharedDisposalTaggerComponent; @@ -27,8 +23,6 @@ namespace Content.Server.Disposal.Tube { public sealed class DisposalTubeSystem : EntitySystem { - [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; [Dependency] private readonly PopupSystem _popups = default!; @@ -349,7 +343,7 @@ private void UpdateAnchored(EntityUid uid, DisposalTubeComponent component, bool var oppositeDirection = nextDirection.GetOpposite(); var xform = Transform(target); - if (!_mapManager.TryGetGrid(xform.GridUid, out var grid)) + if (!TryComp(xform.GridUid, out var grid)) return null; var position = xform.Coordinates; diff --git a/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs b/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs index eb3cda4db9b..38e39238039 100644 --- a/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs +++ b/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs @@ -1,4 +1,3 @@ -using System.Linq; using Content.Server.Atmos.EntitySystems; using Content.Server.Disposal.Tube; using Content.Server.Disposal.Tube.Components; @@ -12,14 +11,12 @@ using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Systems; -using Robust.Shared.Random; namespace Content.Server.Disposal.Unit.EntitySystems { public sealed class DisposableSystem : EntitySystem { [Dependency] private readonly ThrowingSystem _throwing = default!; - [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; [Dependency] private readonly DamageableSystem _damageable = default!; [Dependency] private readonly DisposalUnitSystem _disposalUnitSystem = default!; diff --git a/Content.Server/Dragon/DragonRiftSystem.cs b/Content.Server/Dragon/DragonRiftSystem.cs index f7d5cd783d4..819e7f833f3 100644 --- a/Content.Server/Dragon/DragonRiftSystem.cs +++ b/Content.Server/Dragon/DragonRiftSystem.cs @@ -13,6 +13,7 @@ using System.Numerics; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; +using Content.Server.Announcements.Systems; namespace Content.Server.Dragon; @@ -27,6 +28,7 @@ public sealed class DragonRiftSystem : EntitySystem [Dependency] private readonly NavMapSystem _navMap = default!; [Dependency] private readonly NPCSystem _npc = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly AnnouncerSystem _announcer = default!; public override void Initialize() { @@ -70,7 +72,8 @@ public override void Update(float frameTime) Dirty(comp); var location = xform.LocalPosition; - _chat.DispatchGlobalAnnouncement(Loc.GetString("carp-rift-warning", ("location", location)), playSound: false, colorOverride: Color.Red); + _announcer.SendAnnouncement(_announcer.GetAnnouncementId("CarpRift"), Filter.Broadcast(), + "carp-rift-warning", colorOverride: Color.Red, localeArgs: ("location", location)); _audio.PlayGlobal("/Audio/Misc/notice1.ogg", Filter.Broadcast(), true); _navMap.SetBeaconEnabled(uid, true); } diff --git a/Content.Server/Dragon/DragonSystem.cs b/Content.Server/Dragon/DragonSystem.cs index 6400472d036..79e5c0a2a9c 100644 --- a/Content.Server/Dragon/DragonSystem.cs +++ b/Content.Server/Dragon/DragonSystem.cs @@ -10,18 +10,16 @@ using Content.Shared.Mind.Components; using Content.Shared.Mobs; using Content.Shared.Movement.Systems; -using Robust.Shared.Audio; +using Content.Shared.Zombies; using Robust.Shared.Audio.Systems; -using Robust.Shared.GameStates; using Robust.Shared.Map; -using Robust.Shared.Player; +using Robust.Shared.Map.Components; namespace Content.Server.Dragon; public sealed partial class DragonSystem : EntitySystem { [Dependency] private readonly CarpRiftsConditionSystem _carpRifts = default!; - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly ITileDefinitionManager _tileDef = default!; [Dependency] private readonly MovementSpeedModifierSystem _movement = default!; [Dependency] private readonly PopupSystem _popup = default!; @@ -138,7 +136,7 @@ private void OnSpawnRift(EntityUid uid, DragonComponent component, DragonSpawnRi var xform = Transform(uid); // Have to be on a grid fam - if (!_mapManager.TryGetGrid(xform.GridUid, out var grid)) + if (!TryComp(xform.GridUid, out var grid)) { _popup.PopupEntity(Loc.GetString("carp-rift-anchor"), uid, uid); return; diff --git a/Content.Server/Electrocution/ElectrocutionSystem.cs b/Content.Server/Electrocution/ElectrocutionSystem.cs index f71f8b69742..d967013f652 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/SpawnAfterInteractSystem.cs b/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs index 61c4937a271..a0bbbdf350a 100644 --- a/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs +++ b/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs @@ -6,14 +6,13 @@ using Content.Shared.Maps; using Content.Shared.Stacks; using JetBrains.Annotations; -using Robust.Shared.Map; +using Robust.Shared.Map.Components; namespace Content.Server.Engineering.EntitySystems { [UsedImplicitly] public sealed class SpawnAfterInteractSystem : EntitySystem { - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; [Dependency] private readonly StackSystem _stackSystem = default!; @@ -30,7 +29,7 @@ private async void HandleAfterInteract(EntityUid uid, SpawnAfterInteractComponen return; if (string.IsNullOrEmpty(component.Prototype)) return; - if (!_mapManager.TryGetGrid(args.ClickLocation.GetGridUid(EntityManager), out var grid)) + if (!TryComp(args.ClickLocation.GetGridUid(EntityManager), out var grid)) return; if (!grid.TryGetTileRef(args.ClickLocation, out var tileRef)) return; diff --git a/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs b/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs index 169daca07ac..202d03bcda9 100644 --- a/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs +++ b/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs @@ -25,7 +25,7 @@ public void InitializeEnsnaring() { SubscribeLocalEvent(OnComponentRemove); SubscribeLocalEvent(AttemptStepTrigger); - SubscribeLocalEvent(OnStepTrigger); + SubscribeLocalEvent(OnStepTrigger); SubscribeLocalEvent(OnThrowHit); SubscribeLocalEvent(OnAttemptPacifiedThrow); } @@ -49,7 +49,7 @@ private void AttemptStepTrigger(EntityUid uid, EnsnaringComponent component, ref args.Continue = true; } - private void OnStepTrigger(EntityUid uid, EnsnaringComponent component, ref StepTriggeredEvent args) + private void OnStepTrigger(EntityUid uid, EnsnaringComponent component, ref StepTriggeredOffEvent args) { TryEnsnare(args.Tripper, uid, component); } diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Airtight.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Airtight.cs index af150c93250..55e8de26321 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Airtight.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Airtight.cs @@ -4,7 +4,6 @@ using Content.Shared.Damage; using Content.Shared.Explosion; using Content.Shared.FixedPoint; -using Robust.Shared.Map; using Robust.Shared.Map.Components; namespace Content.Server.Explosion.EntitySystems; @@ -102,7 +101,7 @@ private void OnAirtightDamaged(EntityUid uid, AirtightComponent airtight, Damage if (!EntityManager.TryGetComponent(uid, out TransformComponent? transform) || !transform.Anchored) return; - if (!_mapManager.TryGetGrid(transform.GridUid, out var grid)) + if (!TryComp(transform.GridUid, out var grid)) return; UpdateAirtightMap(transform.GridUid.Value, grid, grid.CoordinatesToTile(transform.Coordinates)); diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.GridMap.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.GridMap.cs index b04642a8db0..719a2eca797 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.GridMap.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.GridMap.cs @@ -23,7 +23,7 @@ public sealed partial class ExplosionSystem : EntitySystem /// private void OnGridStartup(GridStartupEvent ev) { - var grid = _mapManager.GetGrid(ev.EntityUid); + var grid = Comp(ev.EntityUid); Dictionary edges = new(); _gridEdges[ev.EntityUid] = edges; diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs index 4a9477e7443..ccfcee46124 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs @@ -1,4 +1,3 @@ -using System.Linq; using System.Numerics; using Content.Shared.CCVar; using Content.Shared.Damage; @@ -17,6 +16,7 @@ using Robust.Shared.Timing; using Robust.Shared.Utility; using TimedDespawnComponent = Robust.Shared.Spawners.TimedDespawnComponent; +using Content.Server.Atmos.EntitySystems; namespace Content.Server.Explosion.EntitySystems; @@ -44,13 +44,6 @@ public sealed partial class ExplosionSystem /// private Explosion? _activeExplosion; - /// - /// While processing an explosion, the "progress" is sent to clients, so that the explosion fireball effect - /// syncs up with the damage. When the tile iteration increments, an update needs to be sent to clients. - /// This integer keeps track of the last value sent to clients. - /// - private int _previousTileIteration; - /// /// This list is used when raising to avoid allocating a new list per event. /// @@ -108,8 +101,6 @@ public override void Update(float frameTime) if (_activeExplosion == null) continue; - _previousTileIteration = 0; - // just a lil nap if (SleepNodeSys) { diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.TileFill.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.TileFill.cs index afad0e27e09..a42dd110831 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.TileFill.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.TileFill.cs @@ -4,6 +4,7 @@ using Content.Shared.Explosion; using Content.Shared.Explosion.Components; using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; using Robust.Shared.Timing; @@ -56,7 +57,7 @@ public sealed partial class ExplosionSystem : EntitySystem else if (referenceGrid != null) { // reference grid defines coordinate system that the explosion in space will use - initialTile = _mapManager.GetGrid(referenceGrid.Value).WorldToTile(epicenter.Position); + initialTile = Comp(referenceGrid.Value).WorldToTile(epicenter.Position); } else { @@ -87,7 +88,7 @@ public sealed partial class ExplosionSystem : EntitySystem var spaceAngle = Angle.Zero; if (referenceGrid != null) { - var xform = Transform(_mapManager.GetGrid(referenceGrid.Value).Owner); + var xform = Transform(Comp(referenceGrid.Value).Owner); spaceMatrix = xform.WorldMatrix; spaceAngle = xform.WorldRotation; } @@ -102,7 +103,7 @@ public sealed partial class ExplosionSystem : EntitySystem airtightMap = new(); var initialGridData = new ExplosionGridTileFlood( - _mapManager.GetGrid(epicentreGrid.Value), + Comp(epicentreGrid.Value), airtightMap, maxIntensity, stepSize, @@ -191,7 +192,7 @@ public sealed partial class ExplosionSystem : EntitySystem airtightMap = new(); data = new ExplosionGridTileFlood( - _mapManager.GetGrid(grid), + Comp(grid), airtightMap, maxIntensity, stepSize, diff --git a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs index 9b9a042641f..e24de5a2f66 100644 --- a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs +++ b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs @@ -88,7 +88,7 @@ public override void Initialize() SubscribeLocalEvent(OnTriggerCollide); SubscribeLocalEvent(OnActivate); SubscribeLocalEvent(OnImplantTrigger); - SubscribeLocalEvent(OnStepTriggered); + SubscribeLocalEvent(OnStepTriggered); SubscribeLocalEvent(OnSlipTriggered); SubscribeLocalEvent(OnEmptyTriggered); @@ -228,7 +228,7 @@ private void OnImplantTrigger(EntityUid uid, TriggerImplantActionComponent compo args.Handled = Trigger(uid); } - private void OnStepTriggered(EntityUid uid, TriggerOnStepTriggerComponent component, ref StepTriggeredEvent args) + private void OnStepTriggered(EntityUid uid, TriggerOnStepTriggerComponent component, ref StepTriggeredOffEvent args) { Trigger(uid, args.Tripper); } diff --git a/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs b/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs index 24ee2b71541..2d54c03b51b 100644 --- a/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs +++ b/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs @@ -1,10 +1,8 @@ using Content.Shared.StatusEffect; using Content.Shared.Inventory; -using Content.Shared.Item; using Content.Shared.Eye.Blinding.Components; using Content.Shared.Eye.Blinding.Systems; using Content.Shared.Tools.Components; -using Content.Shared.Item.ItemToggle; using Content.Shared.Item.ItemToggle.Components; namespace Content.Server.Eye.Blinding.EyeProtection @@ -13,7 +11,6 @@ public sealed class EyeProtectionSystem : EntitySystem { [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; [Dependency] private readonly BlindableSystem _blindingSystem = default!; - [Dependency] private readonly SharedItemToggleSystem _itemToggle = default!; public override void Initialize() { diff --git a/Content.Server/Fax/FaxMachineComponent.cs b/Content.Server/Fax/FaxMachineComponent.cs index d1f269dd370..a189bdc05ac 100644 --- a/Content.Server/Fax/FaxMachineComponent.cs +++ b/Content.Server/Fax/FaxMachineComponent.cs @@ -51,6 +51,12 @@ public sealed partial class FaxMachineComponent : Component [DataField("receiveNukeCodes")] public bool ReceiveNukeCodes { get; set; } = false; + /// + /// Should this fax receive station goals + /// + [DataField] + public bool ReceiveStationGoal { get; set; } = false; + /// /// Sound to play when fax has been emagged /// diff --git a/Content.Server/Flash/FlashSystem.cs b/Content.Server/Flash/FlashSystem.cs index fe7eb81d1e1..013ee37a416 100644 --- a/Content.Server/Flash/FlashSystem.cs +++ b/Content.Server/Flash/FlashSystem.cs @@ -14,13 +14,13 @@ using Content.Shared.Inventory; using Content.Shared.Physics; using Content.Shared.Tag; -using Content.Shared.Traits.Assorted; using Content.Shared.Weapons.Melee.Events; using Robust.Server.Audio; using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.Timing; using InventoryComponent = Content.Shared.Inventory.InventoryComponent; +using Content.Shared.Traits.Assorted.Components; namespace Content.Server.Flash { diff --git a/Content.Server/GameTicking/Events/RoundEndedEvent.cs b/Content.Server/GameTicking/Events/RoundEndedEvent.cs new file mode 100644 index 00000000000..36bd1f47a1b --- /dev/null +++ b/Content.Server/GameTicking/Events/RoundEndedEvent.cs @@ -0,0 +1,13 @@ +namespace Content.Server.GameTicking; + +public sealed class RoundEndedEvent : EntityEventArgs +{ + public int RoundId { get; } + public TimeSpan RoundDuration { get; } + + public RoundEndedEvent(int roundId, TimeSpan roundDuration) + { + RoundId = roundId; + RoundDuration = roundDuration; + } +} diff --git a/Content.Server/GameTicking/Events/RoundStartedEvent.cs b/Content.Server/GameTicking/Events/RoundStartedEvent.cs new file mode 100644 index 00000000000..1e285a67496 --- /dev/null +++ b/Content.Server/GameTicking/Events/RoundStartedEvent.cs @@ -0,0 +1,11 @@ +namespace Content.Server.GameTicking; + +public sealed class RoundStartedEvent : EntityEventArgs +{ + public int RoundId { get; } + + public RoundStartedEvent(int roundId) + { + RoundId = roundId; + } +} diff --git a/Content.Server/GameTicking/GameTicker.RoundFlow.cs b/Content.Server/GameTicking/GameTicker.RoundFlow.cs index 004508ab916..a154765f34b 100644 --- a/Content.Server/GameTicking/GameTicker.RoundFlow.cs +++ b/Content.Server/GameTicking/GameTicker.RoundFlow.cs @@ -19,6 +19,7 @@ using Robust.Shared.Player; using Robust.Shared.Random; using Robust.Shared.Utility; +using Content.Server.Announcements.Systems; namespace Content.Server.GameTicking { @@ -26,6 +27,7 @@ public sealed partial class GameTicker { [Dependency] private readonly DiscordWebhook _discord = default!; [Dependency] private readonly ITaskManager _taskManager = default!; + [Dependency] private readonly AnnouncerSystem _announcer = default!; private static readonly Counter RoundNumberMetric = Metrics.CreateCounter( "ss14_round_number", @@ -255,6 +257,7 @@ public void StartRound(bool force = false) AnnounceRound(); UpdateInfoText(); SendRoundStartedDiscordMessage(); + RaiseLocalEvent(new RoundStartedEvent(RoundId)); #if EXCEPTION_TOLERANCE } @@ -402,6 +405,7 @@ public void ShowRoundEndScoreboard(string text = "") _replayRoundPlayerInfo = listOfPlayerInfoFinal; _replayRoundText = roundEndText; + RaiseLocalEvent(new RoundEndedEvent(RoundId, roundDuration)); } private async void SendRoundEndDiscordMessage() @@ -599,11 +603,8 @@ private void AnnounceRound() var proto = _robustRandom.Pick(options); - if (proto.Message != null) - _chatSystem.DispatchGlobalAnnouncement(Loc.GetString(proto.Message), playSound: true); - - if (proto.Sound != null) - _audio.PlayGlobal(proto.Sound, Filter.Broadcast(), true); + _announcer.SendAnnouncement(_announcer.GetAnnouncementId(proto.ID), Filter.Broadcast(), + proto.Message ?? "game-ticker-welcome-to-the-station"); } private async void SendRoundStartedDiscordMessage() diff --git a/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs b/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs index 98926536b9d..128f1123043 100644 --- a/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs @@ -24,6 +24,7 @@ using Robust.Shared.Configuration; using Robust.Shared.Enums; using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; @@ -180,7 +181,7 @@ private void OnPlayerSpawningEvent(RulePlayerSpawningEvent ev) var aabbs = EntityQuery().SelectMany(x => x.Grids.Select(x => - xformQuery.GetComponent(x).WorldMatrix.TransformBox(_mapManager.GetGridComp(x).LocalAABB))) + xformQuery.GetComponent(x).WorldMatrix.TransformBox(Comp(x).LocalAABB))) .ToArray(); var aabb = aabbs[0]; diff --git a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs index 0b7cb9cf8f7..edeafb45847 100644 --- a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs @@ -22,6 +22,7 @@ using Robust.Shared.Random; using Robust.Shared.Timing; using System.Globalization; +using Content.Server.Announcements.Systems; namespace Content.Server.GameTicking.Rules; @@ -41,6 +42,7 @@ public sealed class ZombieRuleSystem : GameRuleSystem [Dependency] private readonly StationSystem _station = default!; [Dependency] private readonly AntagSelectionSystem _antagSelection = default!; [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly AnnouncerSystem _announcer = default!; public override void Initialize() { @@ -123,7 +125,9 @@ private void CheckRoundEnd(ZombieRuleComponent zombieRuleComponent) { foreach (var station in _station.GetStations()) { - _chat.DispatchStationAnnouncement(station, Loc.GetString("zombie-shuttle-call"), colorOverride: Color.Crimson); + _announcer.SendAnnouncement(_announcer.GetAnnouncementId("ShuttleCalled"), + _station.GetInOwningStation(station), "zombie-shuttle-call", + colorOverride: Color.Crimson); } _roundEnd.RequestRoundEnd(null, false); } @@ -249,7 +253,7 @@ private void InfectInitialPlayers(ZombieRuleComponent component) _playerManager.Sessions, component.PatientZeroPrototypeId, includeAllJobs: false, - customExcludeCondition: player => HasComp(player) || HasComp(player) + customExcludeCondition: player => HasComp(player) || HasComp(player) ); //And get all players, excluding ZombieImmune and roles with CanBeAntag = False - to fill any leftover initial infected slots @@ -259,7 +263,7 @@ private void InfectInitialPlayers(ZombieRuleComponent component) acceptableAntags: Shared.Antag.AntagAcceptability.All, includeAllJobs: false , ignorePreferences: true, - customExcludeCondition: HasComp + customExcludeCondition: HasComp ); //If there are no players to choose, abort diff --git a/Content.Server/Gateway/Systems/GatewayGeneratorSystem.cs b/Content.Server/Gateway/Systems/GatewayGeneratorSystem.cs index 7558f7afc0b..c934fb66bfb 100644 --- a/Content.Server/Gateway/Systems/GatewayGeneratorSystem.cs +++ b/Content.Server/Gateway/Systems/GatewayGeneratorSystem.cs @@ -1,23 +1,16 @@ using System.Linq; -using System.Numerics; using Content.Server.Gateway.Components; using Content.Server.Parallax; using Content.Server.Procedural; -using Content.Server.Salvage; using Content.Shared.CCVar; using Content.Shared.Dataset; using Content.Shared.Maps; -using Content.Shared.Movement.Components; using Content.Shared.Parallax.Biomes; -using Content.Shared.Physics; using Content.Shared.Procedural; using Content.Shared.Salvage; using Robust.Shared.Configuration; using Robust.Shared.Map; using Robust.Shared.Map.Components; -using Robust.Shared.Physics.Collision.Shapes; -using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Systems; using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Timing; @@ -40,7 +33,6 @@ public sealed class GatewayGeneratorSystem : EntitySystem [Dependency] private readonly DungeonSystem _dungeon = default!; [Dependency] private readonly GatewaySystem _gateway = default!; [Dependency] private readonly MetaDataSystem _metadata = default!; - [Dependency] private readonly RestrictedRangeSystem _restricted = default!; [Dependency] private readonly SharedMapSystem _maps = default!; [Dependency] private readonly TileSystem _tile = default!; diff --git a/Content.Server/Hands/Systems/HandsSystem.cs b/Content.Server/Hands/Systems/HandsSystem.cs index a0e872dbeb1..e836b658381 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; @@ -11,8 +10,9 @@ using Content.Shared.Hands.EntitySystems; using Content.Shared.Input; using Content.Shared.Inventory.VirtualItem; -using Content.Shared.Physics.Pull; -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.GameStates; @@ -84,9 +84,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; @@ -96,17 +95,17 @@ private void OnDisarmed(EntityUid uid, HandsComponent component, DisarmedEvent a private void HandleBodyPartAdded(EntityUid uid, HandsComponent component, ref BodyPartAddedEvent args) { - if (args.Part.PartType != BodyPartType.Hand) + if (args.Part.Comp.PartType != BodyPartType.Hand) return; // If this annoys you, which it should. // Ping Smugleaf. - var location = args.Part.Symmetry switch + var location = args.Part.Comp.Symmetry switch { BodyPartSymmetry.None => HandLocation.Middle, BodyPartSymmetry.Left => HandLocation.Left, BodyPartSymmetry.Right => HandLocation.Right, - _ => throw new ArgumentOutOfRangeException(nameof(args.Part.Symmetry)) + _ => throw new ArgumentOutOfRangeException(nameof(args.Part.Comp.Symmetry)) }; AddHand(uid, args.Slot, location); @@ -114,7 +113,7 @@ private void HandleBodyPartAdded(EntityUid uid, HandsComponent component, ref Bo private void HandleBodyPartRemoved(EntityUid uid, HandsComponent component, ref BodyPartRemovedEvent args) { - if (args.Part.PartType != BodyPartType.Hand) + if (args.Part.Comp.PartType != BodyPartType.Hand) return; RemoveHand(uid, args.Slot); @@ -124,13 +123,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??"); } @@ -138,7 +137,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. @@ -147,8 +146,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/Humanoid/Systems/HumanoidAppearanceSystem.cs b/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.cs index a0e9143eda9..326c80617a9 100644 --- a/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.cs +++ b/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.cs @@ -54,6 +54,8 @@ public void CloneAppearance(EntityUid source, EntityUid target, HumanoidAppearan targetHumanoid.SkinColor = sourceHumanoid.SkinColor; targetHumanoid.EyeColor = sourceHumanoid.EyeColor; targetHumanoid.Age = sourceHumanoid.Age; + targetHumanoid.Height = sourceHumanoid.Height; + targetHumanoid.Width = sourceHumanoid.Width; SetSex(target, sourceHumanoid.Sex, false, targetHumanoid); targetHumanoid.CustomBaseLayers = new(sourceHumanoid.CustomBaseLayers); targetHumanoid.MarkingSet = new(sourceHumanoid.MarkingSet); diff --git a/Content.Server/ImmovableRod/ImmovableRodSystem.cs b/Content.Server/ImmovableRod/ImmovableRodSystem.cs index 31aa39cf03a..429361cd8cd 100644 --- a/Content.Server/ImmovableRod/ImmovableRodSystem.cs +++ b/Content.Server/ImmovableRod/ImmovableRodSystem.cs @@ -6,6 +6,7 @@ using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; using Robust.Shared.Physics.Systems; @@ -16,7 +17,6 @@ namespace Content.Server.ImmovableRod; public sealed class ImmovableRodSystem : EntitySystem { [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly IMapManager _map = default!; [Dependency] private readonly BodySystem _bodySystem = default!; [Dependency] private readonly PopupSystem _popup = default!; @@ -33,7 +33,7 @@ public override void Update(float frameTime) if (!rod.DestroyTiles) continue; - if (!_map.TryGetGrid(trans.GridUid, out var grid)) + if (!TryComp(trans.GridUid, out var grid)) continue; grid.SetTile(trans.Coordinates, Tile.Empty); diff --git a/Content.Server/Implants/ImplanterSystem.cs b/Content.Server/Implants/ImplanterSystem.cs index 0d46241f414..3cfa3a9f5f8 100644 --- a/Content.Server/Implants/ImplanterSystem.cs +++ b/Content.Server/Implants/ImplanterSystem.cs @@ -1,3 +1,4 @@ +using System.Linq; using Content.Server.Popups; using Content.Shared.DoAfter; using Content.Shared.IdentityManagement; @@ -57,6 +58,17 @@ private void OnImplanterAfterInteract(EntityUid uid, ImplanterComponent componen return; } + // Check if we are trying to implant a implant which is already implanted + if (implant.HasValue && !component.AllowMultipleImplants && CheckSameImplant(target, implant.Value)) + { + var name = Identity.Name(target, EntityManager, args.User); + var msg = Loc.GetString("implanter-component-implant-already", ("implant", implant), ("target", name)); + _popup.PopupEntity(msg, target, args.User); + args.Handled = true; + return; + } + + //Implant self instantly, otherwise try to inject the target. if (args.User == target) Implant(target, target, uid, component); @@ -67,6 +79,15 @@ private void OnImplanterAfterInteract(EntityUid uid, ImplanterComponent componen args.Handled = true; } + public bool CheckSameImplant(EntityUid target, EntityUid implant) + { + if (!TryComp(target, out var implanted)) + return false; + + var implantPrototype = Prototype(implant); + return implanted.ImplantContainer.ContainedEntities.Any(entity => Prototype(entity) == implantPrototype); + } + /// /// Attempt to implant someone else. /// diff --git a/Content.Server/Implants/SubdermalImplantSystem.cs b/Content.Server/Implants/SubdermalImplantSystem.cs index 8eb27414481..6b58f6eb092 100644 --- a/Content.Server/Implants/SubdermalImplantSystem.cs +++ b/Content.Server/Implants/SubdermalImplantSystem.cs @@ -19,6 +19,8 @@ using Robust.Shared.Physics.Components; using Robust.Shared.Random; using System.Numerics; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; namespace Content.Server.Implants; @@ -34,6 +36,7 @@ public sealed class SubdermalImplantSystem : SharedSubdermalImplantSystem [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedTransformSystem _xform = default!; [Dependency] private readonly ForensicsSystem _forensicsSystem = default!; + [Dependency] private readonly PullingSystem _pullingSystem = default!; private EntityQuery _physicsQuery; @@ -98,6 +101,11 @@ private void OnScramImplant(EntityUid uid, SubdermalImplantComponent component, if (!TryComp(uid, out var implant)) return; + // We need stop the user from being pulled so they don't just get "attached" with whoever is pulling them. + // This can for example happen when the user is cuffed and being pulled. + if (TryComp(ent, out var pull) && _pullingSystem.IsPulled(ent, pull)) + _pullingSystem.TryStopPull(ent, pull); + var xform = Transform(ent); var entityCoords = xform.Coordinates.ToMap(EntityManager, _xform); diff --git a/Content.Server/Instruments/InstrumentComponent.cs b/Content.Server/Instruments/InstrumentComponent.cs index 4302ab6791b..1b7913386d2 100644 --- a/Content.Server/Instruments/InstrumentComponent.cs +++ b/Content.Server/Instruments/InstrumentComponent.cs @@ -1,6 +1,5 @@ using Content.Server.UserInterface; using Content.Shared.Instruments; -using Robust.Server.GameObjects; using Robust.Shared.Player; namespace Content.Server.Instruments; diff --git a/Content.Server/Interaction/InteractionSystem.cs b/Content.Server/Interaction/InteractionSystem.cs index 6692886daee..203781bcdaa 100644 --- a/Content.Server/Interaction/InteractionSystem.cs +++ b/Content.Server/Interaction/InteractionSystem.cs @@ -1,4 +1,3 @@ -using Content.Shared.ActionBlocker; using Content.Shared.Interaction; using Content.Shared.Storage; using JetBrains.Annotations; @@ -14,7 +13,6 @@ namespace Content.Server.Interaction [UsedImplicitly] public sealed partial class InteractionSystem : SharedInteractionSystem { - [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; diff --git a/Content.Server/Interaction/TilePryCommand.cs b/Content.Server/Interaction/TilePryCommand.cs index 57b07e8181b..006a245ead3 100644 --- a/Content.Server/Interaction/TilePryCommand.cs +++ b/Content.Server/Interaction/TilePryCommand.cs @@ -4,6 +4,7 @@ using Content.Shared.Maps; using Robust.Shared.Console; using Robust.Shared.Map; +using Robust.Shared.Map.Components; namespace Content.Server.Interaction { @@ -46,7 +47,7 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) var xform = _entities.GetComponent(attached); var playerGrid = xform.GridUid; - if (!mapManager.TryGetGrid(playerGrid, out var mapGrid)) + if (!_entities.TryGetComponent(playerGrid, out var mapGrid)) return; var playerPosition = xform.Coordinates; diff --git a/Content.Server/LandMines/LandMineComponent.cs b/Content.Server/LandMines/LandMineComponent.cs index 63e1e4b99f0..1c4ba06691a 100644 --- a/Content.Server/LandMines/LandMineComponent.cs +++ b/Content.Server/LandMines/LandMineComponent.cs @@ -1,6 +1,13 @@ -namespace Content.Server.LandMines; +using Robust.Shared.Audio; + +namespace Content.Server.LandMines; [RegisterComponent] public sealed partial class LandMineComponent : Component { + /// + /// Trigger sound effect when stepping onto landmine + /// + [DataField, ViewVariables(VVAccess.ReadWrite)] + public SoundSpecifier? Sound; } diff --git a/Content.Server/LandMines/LandMineSystem.cs b/Content.Server/LandMines/LandMineSystem.cs index 78c48ef99ec..22dedb93375 100644 --- a/Content.Server/LandMines/LandMineSystem.cs +++ b/Content.Server/LandMines/LandMineSystem.cs @@ -1,43 +1,43 @@ -using Content.Server.Explosion.EntitySystems; +using Content.Server.Explosion.EntitySystems; using Content.Shared.Popups; -using Content.Shared.StepTrigger; using Content.Shared.StepTrigger.Systems; -using Robust.Shared.Player; +using Robust.Shared.Audio; +using Robust.Shared.Audio.Systems; namespace Content.Server.LandMines; public sealed class LandMineSystem : EntitySystem { + [Dependency] private readonly SharedAudioSystem _audioSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly TriggerSystem _trigger = default!; - public override void Initialize() { - SubscribeLocalEvent(HandleTriggered); - SubscribeLocalEvent(HandleTriggerAttempt); + SubscribeLocalEvent(HandleStepOnTriggered); + SubscribeLocalEvent(HandleStepOffTriggered); + + SubscribeLocalEvent(HandleStepTriggerAttempt); } - private static void HandleTriggerAttempt( - EntityUid uid, - LandMineComponent component, - ref StepTriggerAttemptEvent args) + private void HandleStepOnTriggered(EntityUid uid, LandMineComponent component, ref StepTriggeredOnEvent args) { - args.Continue = true; + _popupSystem.PopupCoordinates( + Loc.GetString("land-mine-triggered", ("mine", uid)), + Transform(uid).Coordinates, + args.Tripper, + PopupType.LargeCaution); + + _audioSystem.PlayPvs(component.Sound, uid); } - private void HandleTriggered(EntityUid uid, LandMineComponent component, ref StepTriggeredEvent args) + private void HandleStepOffTriggered(EntityUid uid, LandMineComponent component, ref StepTriggeredOffEvent args) { - // This doesn't use TriggerOnStepTrigger since we don't want to display the popup if nothing happens - // and I didn't feel like making an `AfterTrigger` event - if (_trigger.Trigger(uid, args.Tripper)) - { - _popupSystem.PopupCoordinates( - Loc.GetString("land-mine-triggered", ("mine", uid)), - Transform(uid).Coordinates, - args.Tripper, - PopupType.LargeCaution); - } + _trigger.Trigger(uid, args.Tripper); } -} + private static void HandleStepTriggerAttempt(EntityUid uid, LandMineComponent component, ref StepTriggerAttemptEvent args) + { + args.Continue = true; + } +} diff --git a/Content.Server/Language/Commands/ListLanguagesCommand.cs b/Content.Server/Language/Commands/ListLanguagesCommand.cs new file mode 100644 index 00000000000..e5787cba48c --- /dev/null +++ b/Content.Server/Language/Commands/ListLanguagesCommand.cs @@ -0,0 +1,58 @@ +using Content.Shared.Administration; +using Content.Shared.Language; +using Robust.Shared.Console; +using Robust.Shared.Enums; + +namespace Content.Server.Language.Commands; + +[AnyCommand] +public sealed class ListLanguagesCommand : IConsoleCommand +{ + public string Command => "languagelist"; + public string Description => Loc.GetString("command-list-langs-desc"); + public string Help => Loc.GetString("command-list-langs-help", ("command", Command)); + + public void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (shell.Player is not { } player) + { + shell.WriteError(Loc.GetString("shell-cannot-run-command-from-server")); + return; + } + + if (player.Status != SessionStatus.InGame) + return; + + if (player.AttachedEntity is not {} playerEntity) + { + shell.WriteError(Loc.GetString("shell-must-be-attached-to-entity")); + return; + } + + var languages = IoCManager.Resolve().GetEntitySystem(); + var currentLang = languages.GetLanguage(playerEntity).ID; + + shell.WriteLine(Loc.GetString("command-language-spoken")); + var spoken = languages.GetSpokenLanguages(playerEntity); + for (int i = 0; i < spoken.Count; i++) + { + var lang = spoken[i]; + shell.WriteLine(lang == currentLang + ? Loc.GetString("command-language-current-entry", ("id", i + 1), ("language", lang), ("name", LanguageName(lang))) + : Loc.GetString("command-language-entry", ("id", i + 1), ("language", lang), ("name", LanguageName(lang)))); + } + + shell.WriteLine(Loc.GetString("command-language-understood")); + var understood = languages.GetUnderstoodLanguages(playerEntity); + for (int i = 0; i < understood.Count; i++) + { + var lang = understood[i]; + shell.WriteLine(Loc.GetString("command-language-entry", ("id", i + 1), ("language", lang), ("name", LanguageName(lang)))); + } + } + + private string LanguageName(string id) + { + return Loc.GetString($"language-{id}-name"); + } +} diff --git a/Content.Server/Language/Commands/SayLanguageCommand.cs b/Content.Server/Language/Commands/SayLanguageCommand.cs new file mode 100644 index 00000000000..2304781fa04 --- /dev/null +++ b/Content.Server/Language/Commands/SayLanguageCommand.cs @@ -0,0 +1,51 @@ +using Content.Server.Chat.Systems; +using Content.Shared.Administration; +using Robust.Shared.Console; +using Robust.Shared.Enums; + +namespace Content.Server.Language.Commands; + +[AnyCommand] +public sealed class SayLanguageCommand : IConsoleCommand +{ + public string Command => "saylang"; + public string Description => Loc.GetString("command-saylang-desc"); + public string Help => Loc.GetString("command-saylang-help", ("command", Command)); + + public void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (shell.Player is not { } player) + { + shell.WriteError(Loc.GetString("shell-cannot-run-command-from-server")); + return; + } + + if (player.Status != SessionStatus.InGame) + return; + + if (player.AttachedEntity is not {} playerEntity) + { + shell.WriteError(Loc.GetString("shell-must-be-attached-to-entity")); + return; + } + + if (args.Length < 2) + return; + + var message = string.Join(" ", args, startIndex: 1, count: args.Length - 1).Trim(); + + if (string.IsNullOrEmpty(message)) + return; + + var languages = IoCManager.Resolve().GetEntitySystem(); + var chats = IoCManager.Resolve().GetEntitySystem(); + + if (!SelectLanguageCommand.TryParseLanguageArgument(languages, playerEntity, args[0], out var failReason, out var language)) + { + shell.WriteError(failReason); + return; + } + + chats.TrySendInGameICMessage(playerEntity, message, InGameICChatType.Speak, ChatTransmitRange.Normal, false, shell, player, languageOverride: language); + } +} diff --git a/Content.Server/Language/Commands/SelectLanguageCommand.cs b/Content.Server/Language/Commands/SelectLanguageCommand.cs new file mode 100644 index 00000000000..d340135925d --- /dev/null +++ b/Content.Server/Language/Commands/SelectLanguageCommand.cs @@ -0,0 +1,88 @@ +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using Content.Shared.Administration; +using Content.Shared.Language; +using Robust.Shared.Console; +using Robust.Shared.Enums; + +namespace Content.Server.Language.Commands; + +[AnyCommand] +public sealed class SelectLanguageCommand : IConsoleCommand +{ + public string Command => "languageselect"; + public string Description => Loc.GetString("command-language-select-desc"); + public string Help => Loc.GetString("command-language-select-help", ("command", Command)); + + public void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (shell.Player is not { } player) + { + shell.WriteError(Loc.GetString("shell-cannot-run-command-from-server")); + return; + } + + if (player.Status != SessionStatus.InGame) + return; + + if (player.AttachedEntity is not { } playerEntity) + { + shell.WriteError(Loc.GetString("shell-must-be-attached-to-entity")); + return; + } + + if (args.Length < 1) + return; + + var languages = IoCManager.Resolve().GetEntitySystem(); + + if (!TryParseLanguageArgument(languages, playerEntity, args[0], out var failReason, out var language)) + { + shell.WriteError(failReason); + return; + } + + languages.SetLanguage(playerEntity, language.ID); + } + + // TODO: find a better place for this method + /// + /// Tries to parse the input argument as either a language ID or the position of the language in the list of languages + /// the entity can speak. Returns true if sucessful. + /// + public static bool TryParseLanguageArgument( + LanguageSystem languageSystem, + EntityUid speaker, + string input, + [NotNullWhen(false)] out string? failureReason, + [NotNullWhen(true)] out LanguagePrototype? language) + { + failureReason = null; + language = null; + + if (int.TryParse(input, out var num)) + { + // The argument is a number + var spoken = languageSystem.GetSpokenLanguages(speaker); + if (num > 0 && num - 1 < spoken.Count) + language = languageSystem.GetLanguagePrototype(spoken[num - 1]); + + if (language != null) // the ability to speak it is implied + return true; + + failureReason = Loc.GetString("command-language-invalid-number", ("total", spoken.Count)); + return false; + } + else + { + // The argument is a language ID + language = languageSystem.GetLanguagePrototype(input); + + if (language != null && languageSystem.CanSpeak(speaker, language.ID)) + return true; + + failureReason = Loc.GetString("command-language-invalid-language", ("id", input)); + return false; + } + } +} diff --git a/Content.Server/Language/DetermineEntityLanguagesEvent.cs b/Content.Server/Language/DetermineEntityLanguagesEvent.cs new file mode 100644 index 00000000000..8d6b868d070 --- /dev/null +++ b/Content.Server/Language/DetermineEntityLanguagesEvent.cs @@ -0,0 +1,25 @@ +using Content.Shared.Language; + +namespace Content.Server.Language; + +/// +/// Raised in order to determine the list of languages the entity can speak and understand at the given moment. +/// Typically raised on an entity after a language agent (e.g. a translator) has been added to or removed from them. +/// +[ByRefEvent] +public record struct DetermineEntityLanguagesEvent +{ + /// + /// The list of all languages the entity may speak. + /// By default, contains the languages this entity speaks intrinsically. + /// + public HashSet SpokenLanguages = new(); + + /// + /// The list of all languages the entity may understand. + /// By default, contains the languages this entity understands intrinsically. + /// + public HashSet UnderstoodLanguages = new(); + + public DetermineEntityLanguagesEvent() {} +} diff --git a/Content.Server/Language/LanguageSystem.Networking.cs b/Content.Server/Language/LanguageSystem.Networking.cs new file mode 100644 index 00000000000..572e2961fde --- /dev/null +++ b/Content.Server/Language/LanguageSystem.Networking.cs @@ -0,0 +1,78 @@ +using Content.Server.Language.Events; +using Content.Server.Mind; +using Content.Shared.Language; +using Content.Shared.Language.Components; +using Content.Shared.Language.Events; +using Content.Shared.Mind; +using Content.Shared.Mind.Components; +using Robust.Shared.Player; + +namespace Content.Server.Language; + +public sealed partial class LanguageSystem +{ + [Dependency] private readonly MindSystem _mind = default!; + + + public void InitializeNet() + { + SubscribeNetworkEvent(OnClientSetLanguage); + SubscribeNetworkEvent((_, session) => SendLanguageStateToClient(session.SenderSession)); + + SubscribeLocalEvent((uid, comp, _) => SendLanguageStateToClient(uid, comp)); + + // Refresh the client's state when its mind hops to a different entity + SubscribeLocalEvent((uid, _, _) => SendLanguageStateToClient(uid)); + SubscribeLocalEvent((_, _, args) => + { + if (args.Mind.Comp.Session != null) + SendLanguageStateToClient(args.Mind.Comp.Session); + }); + } + + + private void OnClientSetLanguage(LanguagesSetMessage message, EntitySessionEventArgs args) + { + if (args.SenderSession.AttachedEntity is not { Valid: true } uid) + return; + + var language = GetLanguagePrototype(message.CurrentLanguage); + if (language == null || !CanSpeak(uid, language.ID)) + return; + + SetLanguage(uid, language.ID); + } + + private void SendLanguageStateToClient(EntityUid uid, LanguageSpeakerComponent? comp = null) + { + // Try to find a mind inside the entity and notify its session + if (!_mind.TryGetMind(uid, out _, out var mindComp) || mindComp.Session == null) + return; + + SendLanguageStateToClient(uid, mindComp.Session, comp); + } + + private void SendLanguageStateToClient(ICommonSession session, LanguageSpeakerComponent? comp = null) + { + // Try to find an entity associated with the session and resolve the languages from it + if (session.AttachedEntity is not { Valid: true } entity) + return; + + SendLanguageStateToClient(entity, session, comp); + } + + // TODO this is really stupid and can be avoided if we just make everything shared... + private void SendLanguageStateToClient(EntityUid uid, ICommonSession session, LanguageSpeakerComponent? component = null) + { + var isUniversal = HasComp(uid); + if (!isUniversal) + Resolve(uid, ref component, logMissing: false); + + // I really don't want to call 3 getter methods here, so we'll just have this slightly hardcoded solution + var message = isUniversal || component == null + ? new LanguagesUpdatedMessage(UniversalPrototype, [UniversalPrototype], [UniversalPrototype]) + : new LanguagesUpdatedMessage(component.CurrentLanguage, component.SpokenLanguages, component.UnderstoodLanguages); + + RaiseNetworkEvent(message, session); + } +} diff --git a/Content.Server/Language/LanguageSystem.cs b/Content.Server/Language/LanguageSystem.cs new file mode 100644 index 00000000000..e68489e9e28 --- /dev/null +++ b/Content.Server/Language/LanguageSystem.cs @@ -0,0 +1,212 @@ +using System.Linq; +using Content.Server.Language.Events; +using Content.Shared.Language; +using Content.Shared.Language.Components; +using Content.Shared.Language.Events; +using Content.Shared.Language.Systems; +using UniversalLanguageSpeakerComponent = Content.Shared.Language.Components.UniversalLanguageSpeakerComponent; + +namespace Content.Server.Language; + +public sealed partial class LanguageSystem : SharedLanguageSystem +{ + public override void Initialize() + { + base.Initialize(); + InitializeNet(); + + SubscribeLocalEvent(OnInitLanguageSpeaker); + } + + + #region public api + + public bool CanUnderstand(EntityUid listener, string language, LanguageSpeakerComponent? component = null) + { + if (language == UniversalPrototype || HasComp(listener)) + return true; + + if (!Resolve(listener, ref component, logMissing: false)) + return false; + + return component.UnderstoodLanguages.Contains(language); + } + + public bool CanSpeak(EntityUid speaker, string language, LanguageSpeakerComponent? component = null) + { + if (HasComp(speaker)) + return true; + + if (!Resolve(speaker, ref component, logMissing: false)) + return false; + + return component.SpokenLanguages.Contains(language); + } + + /// + /// Returns the current language of the given entity, assumes Universal if it's not a language speaker. + /// + public LanguagePrototype GetLanguage(EntityUid speaker, LanguageSpeakerComponent? component = null) + { + if (HasComp(speaker) || !Resolve(speaker, ref component, logMissing: false)) + return Universal; // Serves both as a fallback and uhhh something (TODO: fix this comment) + + if (string.IsNullOrEmpty(component.CurrentLanguage) || !_prototype.TryIndex(component.CurrentLanguage, out var proto)) + return Universal; + + return proto; + } + + /// + /// Returns the list of languages this entity can speak. + /// + /// Typically, checking is sufficient. + public List GetSpokenLanguages(EntityUid uid) + { + if (HasComp(uid)) + return [UniversalPrototype]; + + if (TryComp(uid, out var component)) + return component.SpokenLanguages; + + return []; + } + + /// + /// Returns the list of languages this entity can understand. + /// + /// Typically, checking is sufficient. + public List GetUnderstoodLanguages(EntityUid uid) + { + if (HasComp(uid)) + return [UniversalPrototype]; // This one is tricky because... well, they understand all of them, not just one. + + if (TryComp(uid, out var component)) + return component.UnderstoodLanguages; + + return []; + } + + public void SetLanguage(EntityUid speaker, string language, LanguageSpeakerComponent? component = null) + { + if (!CanSpeak(speaker, language) || (HasComp(speaker) && language != UniversalPrototype)) + return; + + if (!Resolve(speaker, ref component) || component.CurrentLanguage == language) + return; + + component.CurrentLanguage = language; + RaiseLocalEvent(speaker, new LanguagesUpdateEvent(), true); + } + + /// + /// Adds a new language to the respective lists of intrinsically known languages of the given entity. + /// + public void AddLanguage( + EntityUid uid, + string language, + bool addSpoken = true, + bool addUnderstood = true, + LanguageKnowledgeComponent? knowledge = null, + LanguageSpeakerComponent? speaker = null) + { + if (knowledge == null) + knowledge = EnsureComp(uid); + + if (addSpoken && !knowledge.SpokenLanguages.Contains(language)) + knowledge.SpokenLanguages.Add(language); + + if (addUnderstood && !knowledge.UnderstoodLanguages.Contains(language)) + knowledge.UnderstoodLanguages.Add(language); + + UpdateEntityLanguages(uid, speaker); + } + + /// + /// Removes a language from the respective lists of intrinsically known languages of the given entity. + /// + public void RemoveLanguage( + EntityUid uid, + string language, + bool removeSpoken = true, + bool removeUnderstood = true, + LanguageKnowledgeComponent? knowledge = null, + LanguageSpeakerComponent? speaker = null) + { + if (knowledge == null) + knowledge = EnsureComp(uid); + + if (removeSpoken) + knowledge.SpokenLanguages.Remove(language); + + if (removeUnderstood) + knowledge.UnderstoodLanguages.Remove(language); + + UpdateEntityLanguages(uid, speaker); + } + + /// + /// Ensures the given entity has a valid language as its current language. + /// If not, sets it to the first entry of its SpokenLanguages list, or universal if it's empty. + /// + /// True if the current language was modified, false otherwise. + public bool EnsureValidLanguage(EntityUid entity, LanguageSpeakerComponent? comp = null) + { + if (!Resolve(entity, ref comp)) + return false; + + if (!comp.SpokenLanguages.Contains(comp.CurrentLanguage)) + { + comp.CurrentLanguage = comp.SpokenLanguages.FirstOrDefault(UniversalPrototype); + RaiseLocalEvent(entity, new LanguagesUpdateEvent()); + return true; + } + + return false; + } + + /// + /// Immediately refreshes the cached lists of spoken and understood languages for the given entity. + /// + public void UpdateEntityLanguages(EntityUid entity, LanguageSpeakerComponent? languages = null) + { + if (!Resolve(entity, ref languages)) + return; + + var ev = new DetermineEntityLanguagesEvent(); + // We add the intrinsically known languages first so other systems can manipulate them easily + if (TryComp(entity, out var knowledge)) + { + foreach (var spoken in knowledge.SpokenLanguages) + ev.SpokenLanguages.Add(spoken); + + foreach (var understood in knowledge.UnderstoodLanguages) + ev.UnderstoodLanguages.Add(understood); + } + + RaiseLocalEvent(entity, ref ev); + + languages.SpokenLanguages.Clear(); + languages.UnderstoodLanguages.Clear(); + + languages.SpokenLanguages.AddRange(ev.SpokenLanguages); + languages.UnderstoodLanguages.AddRange(ev.UnderstoodLanguages); + + if (!EnsureValidLanguage(entity)) + RaiseLocalEvent(entity, new LanguagesUpdateEvent()); + } + + #endregion + + #region event handling + + private void OnInitLanguageSpeaker(EntityUid uid, LanguageSpeakerComponent component, ComponentInit args) + { + if (string.IsNullOrEmpty(component.CurrentLanguage)) + component.CurrentLanguage = component.SpokenLanguages.FirstOrDefault(UniversalPrototype); + + UpdateEntityLanguages(uid, component); + } + + #endregion +} diff --git a/Content.Server/Language/LanguagesUpdateEvent.cs b/Content.Server/Language/LanguagesUpdateEvent.cs new file mode 100644 index 00000000000..88ea09916bb --- /dev/null +++ b/Content.Server/Language/LanguagesUpdateEvent.cs @@ -0,0 +1,8 @@ +namespace Content.Server.Language.Events; + +/// +/// Raised on an entity when its list of languages changes. +/// +public sealed class LanguagesUpdateEvent : EntityEventArgs +{ +} diff --git a/Content.Server/Language/TranslatorImplantSystem.cs b/Content.Server/Language/TranslatorImplantSystem.cs new file mode 100644 index 00000000000..4d58144481d --- /dev/null +++ b/Content.Server/Language/TranslatorImplantSystem.cs @@ -0,0 +1,66 @@ +using Content.Shared.Implants.Components; +using Content.Shared.Language; +using Content.Shared.Language.Components; +using Robust.Shared.Containers; + +namespace Content.Server.Language; + +public sealed class TranslatorImplantSystem : EntitySystem +{ + [Dependency] private readonly LanguageSystem _language = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnImplant); + SubscribeLocalEvent(OnDeImplant); + SubscribeLocalEvent(OnDetermineLanguages); + } + + private void OnImplant(EntityUid uid, TranslatorImplantComponent component, EntGotInsertedIntoContainerMessage args) + { + if (args.Container.ID != ImplanterComponent.ImplantSlotId) + return; + + var implantee = Transform(uid).ParentUid; + if (implantee is not { Valid: true } || !TryComp(implantee, out var knowledge)) + return; + + component.Enabled = true; + // To operate an implant, you need to know its required language intrinsically, because like... it connects to your brain or something. + // So external translators or other implants can't help you operate it. + component.SpokenRequirementSatisfied = TranslatorSystem.CheckLanguagesMatch( + component.RequiredLanguages, knowledge.SpokenLanguages, component.RequiresAllLanguages); + + component.UnderstoodRequirementSatisfied = TranslatorSystem.CheckLanguagesMatch( + component.RequiredLanguages, knowledge.UnderstoodLanguages, component.RequiresAllLanguages); + + _language.UpdateEntityLanguages(implantee); + } + + private void OnDeImplant(EntityUid uid, TranslatorImplantComponent component, EntGotRemovedFromContainerMessage args) + { + // Even though the description of this event says it gets raised BEFORE reparenting, that's actually false... + component.Enabled = component.SpokenRequirementSatisfied = component.UnderstoodRequirementSatisfied = false; + + if (TryComp(uid, out var subdermal) && subdermal.ImplantedEntity is { Valid: true} implantee) + _language.UpdateEntityLanguages(implantee); + } + + private void OnDetermineLanguages(EntityUid uid, ImplantedComponent component, ref DetermineEntityLanguagesEvent args) + { + // TODO: might wanna find a better solution, i just can't come up with something viable + foreach (var implant in component.ImplantContainer.ContainedEntities) + { + if (!TryComp(implant, out var translator) || !translator.Enabled) + continue; + + if (translator.SpokenRequirementSatisfied) + foreach (var language in translator.SpokenLanguages) + args.SpokenLanguages.Add(language); + + if (translator.UnderstoodRequirementSatisfied) + foreach (var language in translator.UnderstoodLanguages) + args.UnderstoodLanguages.Add(language); + } + } +} diff --git a/Content.Server/Language/TranslatorSystem.cs b/Content.Server/Language/TranslatorSystem.cs new file mode 100644 index 00000000000..adbfe2d681f --- /dev/null +++ b/Content.Server/Language/TranslatorSystem.cs @@ -0,0 +1,199 @@ +using System.Linq; +using Content.Server.Popups; +using Content.Server.PowerCell; +using Content.Shared.Interaction; +using Content.Shared.Interaction.Events; +using Content.Shared.Language; +using Content.Shared.Language.Systems; +using Content.Shared.PowerCell; +using Content.Shared.Language.Components.Translators; + +namespace Content.Server.Language; + +// This does not support holding multiple translators at once. +// That shouldn't be an issue for now, but it needs to be fixed later. +public sealed class TranslatorSystem : SharedTranslatorSystem +{ + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly LanguageSystem _language = default!; + [Dependency] private readonly PowerCellSystem _powerCell = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnDetermineLanguages); + SubscribeLocalEvent(OnDetermineLanguages); + SubscribeLocalEvent(OnDetermineLanguages); + + SubscribeLocalEvent(OnTranslatorToggle); + SubscribeLocalEvent(OnPowerCellSlotEmpty); + + SubscribeLocalEvent(OnTranslatorInteract); + SubscribeLocalEvent(OnTranslatorDropped); + } + + private void OnDetermineLanguages(EntityUid uid, IntrinsicTranslatorComponent component, DetermineEntityLanguagesEvent ev) + { + if (!component.Enabled || !TryComp(uid, out var speaker)) + return; + + if (!_powerCell.HasActivatableCharge(uid)) + return; + + // The idea here is as follows: + // Required languages are languages that are required to operate the translator. + // The translator has a limited number of languages it can translate to and translate from. + // If the wielder understands the language of the translator, they will be able to understand translations provided by it + // If the wielder also speaks that language, they will be able to use it to translate their own speech by "speaking" in that language + var addSpoken = CheckLanguagesMatch(component.RequiredLanguages, speaker.SpokenLanguages, component.RequiresAllLanguages); + var addUnderstood = CheckLanguagesMatch(component.RequiredLanguages, speaker.UnderstoodLanguages, component.RequiresAllLanguages); + + if (addSpoken) + foreach (var language in component.SpokenLanguages) + ev.SpokenLanguages.Add(language); + + if (addUnderstood) + foreach (var language in component.UnderstoodLanguages) + ev.UnderstoodLanguages.Add(language); + } + + private void OnTranslatorInteract(EntityUid translator, HandheldTranslatorComponent component, InteractHandEvent args) + { + var holder = args.User; + if (!EntityManager.HasComponent(holder)) + return; + + var intrinsic = EnsureComp(holder); + UpdateBoundIntrinsicComp(component, intrinsic, component.Enabled); + + _language.UpdateEntityLanguages(holder); + } + + private void OnTranslatorDropped(EntityUid translator, HandheldTranslatorComponent component, DroppedEvent args) + { + var holder = args.User; + if (!EntityManager.TryGetComponent(holder, out var intrinsic)) + return; + + if (intrinsic.Issuer == component) + { + intrinsic.Enabled = false; + RemCompDeferred(holder, intrinsic); + } + + _language.UpdateEntityLanguages(holder); + } + + private void OnTranslatorToggle(EntityUid translator, HandheldTranslatorComponent translatorComp, ActivateInWorldEvent args) + { + if (!translatorComp.ToggleOnInteract) + return; + + // This will show a popup if false + var hasPower = _powerCell.HasDrawCharge(translator); + + if (Transform(args.Target).ParentUid is { Valid: true } holder + && TryComp(holder, out var languageComp)) + { + // This translator is held by a language speaker and thus has an intrinsic counterpart bound to it. + // Make sure it's up-to-date. + var intrinsic = EnsureComp(holder); + var isEnabled = !translatorComp.Enabled; + if (intrinsic.Issuer != translatorComp) + { + // The intrinsic comp wasn't owned by this handheld translator, so this wasn't the active translator. + // Thus, the intrinsic comp needs to be turned on regardless of its previous state. + intrinsic.Issuer = translatorComp; + isEnabled = true; + } + isEnabled &= hasPower; + + UpdateBoundIntrinsicComp(translatorComp, intrinsic, isEnabled); + translatorComp.Enabled = isEnabled; + _powerCell.SetPowerCellDrawEnabled(translator, isEnabled); + + // The first new spoken language added by this translator, or null + var firstNewLanguage = translatorComp.SpokenLanguages.FirstOrDefault(it => !languageComp.SpokenLanguages.Contains(it)); + + _language.UpdateEntityLanguages(holder, languageComp); + + // Update the current language of the entity if necessary + if (isEnabled && translatorComp.SetLanguageOnInteract && firstNewLanguage is {}) + _language.SetLanguage(holder, firstNewLanguage, languageComp); + } + else + { + // This is a standalone translator (e.g. lying on the ground), toggle its state. + translatorComp.Enabled = !translatorComp.Enabled && hasPower; + _powerCell.SetPowerCellDrawEnabled(translator, !translatorComp.Enabled && hasPower); + } + + OnAppearanceChange(translator, translatorComp); + + if (hasPower) + { + var message = Loc.GetString( + translatorComp.Enabled + ? "translator-component-turnon" + : "translator-component-shutoff", + ("translator", translatorComp.Owner)); + _popup.PopupEntity(message, translatorComp.Owner, args.User); + } + } + + private void OnPowerCellSlotEmpty(EntityUid translator, HandheldTranslatorComponent component, PowerCellSlotEmptyEvent args) + { + component.Enabled = false; + _powerCell.SetPowerCellDrawEnabled(translator, false); + OnAppearanceChange(translator, component); + + if (Transform(translator).ParentUid is { Valid: true } holder + && TryComp(holder, out var languageComp)) + { + if (!EntityManager.TryGetComponent(holder, out var intrinsic)) + return; + + if (intrinsic.Issuer == component) + { + intrinsic.Enabled = false; + RemComp(holder, intrinsic); + } + + _language.UpdateEntityLanguages(holder, languageComp); + } + } + + /// + /// Copies the state from the handheld to the intrinsic component + /// + private void UpdateBoundIntrinsicComp(HandheldTranslatorComponent comp, HoldsTranslatorComponent intrinsic, bool isEnabled) + { + if (isEnabled) + { + intrinsic.SpokenLanguages = [..comp.SpokenLanguages]; + intrinsic.UnderstoodLanguages = [..comp.UnderstoodLanguages]; + } + else + { + intrinsic.SpokenLanguages.Clear(); + intrinsic.UnderstoodLanguages.Clear(); + } + + intrinsic.Enabled = isEnabled; + intrinsic.Issuer = comp; + } + + /// + /// Checks whether any OR all required languages are provided. Used for utility purposes. + /// + public static bool CheckLanguagesMatch(ICollection required, ICollection provided, bool requireAll) + { + if (required.Count == 0) + return true; + + return requireAll + ? required.All(provided.Contains) + : required.Any(provided.Contains); + } +} diff --git a/Content.Server/Magic/MagicSystem.cs b/Content.Server/Magic/MagicSystem.cs index 92cd794ce2c..86555924712 100644 --- a/Content.Server/Magic/MagicSystem.cs +++ b/Content.Server/Magic/MagicSystem.cs @@ -21,6 +21,7 @@ using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Random; using Robust.Shared.Serialization.Manager; using Robust.Shared.Spawners; @@ -217,7 +218,7 @@ private List GetSpawnPositions(TransformComponent casterXform // This is shit but you get the idea. var directionPos = casterXform.Coordinates.Offset(casterXform.LocalRotation.ToWorldVec().Normalized()); - if (!_mapManager.TryGetGrid(casterXform.GridUid, out var mapGrid)) + if (!TryComp(casterXform.GridUid, out var mapGrid)) return new List(); if (!directionPos.TryGetTileRef(out var tileReference, EntityManager, _mapManager)) diff --git a/Content.Server/Mapping/MappingCommand.cs b/Content.Server/Mapping/MappingCommand.cs index 08ba0de8334..08f3dcccf9f 100644 --- a/Content.Server/Mapping/MappingCommand.cs +++ b/Content.Server/Mapping/MappingCommand.cs @@ -1,17 +1,14 @@ -// ReSharper disable once RedundantUsingDirective -// Used to warn the player in big red letters in debug mode - using System.Linq; using Content.Server.Administration; using Content.Server.GameTicking; using Content.Shared.Administration; using Content.Shared.CCVar; -using Robust.Server.Player; +using Robust.Server.GameObjects; +using Robust.Server.Maps; using Robust.Shared.Configuration; using Robust.Shared.Console; using Robust.Shared.ContentPack; using Robust.Shared.Map; -using Robust.Shared.Utility; namespace Content.Server.Mapping { @@ -19,6 +16,8 @@ namespace Content.Server.Mapping sealed class MappingCommand : IConsoleCommand { [Dependency] private readonly IEntityManager _entities = default!; + [Dependency] private readonly IMapManager _map = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; public string Command => "mapping"; public string Description => Loc.GetString("cmd-mapping-desc"); @@ -57,13 +56,13 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) shell.WriteError(Loc.GetString("cmd-mapping-warning")); #endif - var mapManager = IoCManager.Resolve(); MapId mapId; + string? toLoad = null; + var mapSys = _entities.System(); // Get the map ID to use if (args.Length is 1 or 2) { - if (!int.TryParse(args[0], out var intMapId)) { shell.WriteError(Loc.GetString("cmd-mapping-failure-integer", ("arg", args[0]))); @@ -79,35 +78,33 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) return; } - if (mapManager.MapExists(mapId)) + if (_map.MapExists(mapId)) { shell.WriteError(Loc.GetString("cmd-mapping-exists", ("mapId", mapId))); return; } - } - else - { - mapId = mapManager.NextMapId(); - } + // either load a map or create a new one. + if (args.Length <= 1) + { + mapSys.CreateMap(mapId, runMapInit: false); + } + else + { + var loadOptions = new MapLoadOptions {StoreMapUids = true}; + _entities.System().TryLoad(mapId, args[1], out _, loadOptions); + } - string? toLoad = null; - // either load a map or create a new one. - if (args.Length <= 1) - { - shell.ExecuteCommand($"addmap {mapId} false"); + // was the map actually created or did it fail somehow? + if (!_map.MapExists(mapId)) + { + shell.WriteError(Loc.GetString("cmd-mapping-error")); + return; + } } else { - toLoad = CommandParsing.Escape(args[1]); - shell.ExecuteCommand($"loadmap {mapId} \"{toLoad}\" 0 0 0 true"); - } - - // was the map actually created? - if (!mapManager.MapExists(mapId)) - { - shell.WriteError(Loc.GetString("cmd-mapping-error")); - return; + mapSys.CreateMap(out mapId, runMapInit: false); } // map successfully created. run misc helpful mapping commands @@ -117,17 +114,15 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) shell.ExecuteCommand("aghost"); } - var cfg = IoCManager.Resolve(); - // don't interrupt mapping with events or auto-shuttle shell.ExecuteCommand("sudo cvar events.enabled false"); shell.ExecuteCommand("sudo cvar shuttle.auto_call_time 0"); - if (cfg.GetCVar(CCVars.AutosaveEnabled)) + if (_cfg.GetCVar(CCVars.AutosaveEnabled)) shell.ExecuteCommand($"toggleautosave {mapId} {toLoad ?? "NEWMAP"}"); shell.ExecuteCommand($"tp 0 0 {mapId}"); shell.RemoteExecuteCommand("mappingclientsidesetup"); - mapManager.SetMapPaused(mapId, true); + _map.SetMapPaused(mapId, true); if (args.Length == 2) shell.WriteLine(Loc.GetString("cmd-mapping-success-load",("mapId",mapId),("path", args[1]))); diff --git a/Content.Server/Mech/Systems/MechSystem.cs b/Content.Server/Mech/Systems/MechSystem.cs index 1012b9727df..f592de9e7eb 100644 --- a/Content.Server/Mech/Systems/MechSystem.cs +++ b/Content.Server/Mech/Systems/MechSystem.cs @@ -20,7 +20,6 @@ using Robust.Server.Containers; using Robust.Server.GameObjects; using Robust.Shared.Containers; -using Robust.Shared.Map; using Robust.Shared.Player; namespace Content.Server.Mech.Systems; @@ -33,8 +32,6 @@ public sealed partial class MechSystem : SharedMechSystem [Dependency] private readonly BatterySystem _battery = default!; [Dependency] private readonly ContainerSystem _container = default!; [Dependency] private readonly DamageableSystem _damageable = default!; - [Dependency] private readonly IMapManager _map = default!; - [Dependency] private readonly MapSystem _mapSystem = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!; diff --git a/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs b/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs index f19b3d5b814..09497c7136b 100644 --- a/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs +++ b/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs @@ -9,7 +9,6 @@ using Content.Server.Station.Systems; using Content.Shared.Damage; using Content.Shared.DeviceNetwork; -using Content.Shared.Emp; using Content.Shared.Examine; using Content.Shared.Inventory.Events; using Content.Shared.Medical.SuitSensor; @@ -27,7 +26,6 @@ public sealed class SuitSensorSystem : EntitySystem { [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly CrewMonitoringServerSystem _monitoringServerSystem = default!; [Dependency] private readonly DeviceNetworkSystem _deviceNetworkSystem = default!; [Dependency] private readonly IdCardSystem _idCardSystem = default!; [Dependency] private readonly MobStateSystem _mobStateSystem = default!; diff --git a/Content.Server/Mind/Commands/MakeSentientCommand.cs b/Content.Server/Mind/Commands/MakeSentientCommand.cs index 5e19d135b6f..b58d782d9c5 100644 --- a/Content.Server/Mind/Commands/MakeSentientCommand.cs +++ b/Content.Server/Mind/Commands/MakeSentientCommand.cs @@ -1,7 +1,10 @@ using Content.Server.Administration; +using Content.Server.Language; using Content.Shared.Administration; using Content.Shared.Emoting; using Content.Shared.Examine; +using Content.Shared.Language; +using Content.Shared.Language.Systems; using Content.Shared.Mind.Components; using Content.Shared.Movement.Components; using Content.Shared.Speech; @@ -55,6 +58,14 @@ public static void MakeSentient(EntityUid uid, IEntityManager entityManager, boo { entityManager.EnsureComponent(uid); entityManager.EnsureComponent(uid); + + var language = IoCManager.Resolve().GetEntitySystem(); + var speaker = entityManager.EnsureComponent(uid); + + // If the entity already speaks some language (like monkey or robot), we do nothing else + // Otherwise, we give them the fallback language + if (speaker.SpokenLanguages.Count == 0) + language.AddLanguage(uid, SharedLanguageSystem.FallbackLanguagePrototype); } entityManager.EnsureComponent(uid); diff --git a/Content.Server/NPC/HTN/Preconditions/PulledPrecondition.cs b/Content.Server/NPC/HTN/Preconditions/PulledPrecondition.cs index 64a72b13cfa..d276be72187 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/HTN/PrimitiveTasks/Operators/MoveToOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/MoveToOperator.cs index dd35d2112c9..e64343fdd8a 100644 --- a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/MoveToOperator.cs +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/MoveToOperator.cs @@ -4,6 +4,7 @@ using Content.Server.NPC.Pathfinding; using Content.Server.NPC.Systems; using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators; @@ -14,7 +15,6 @@ namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators; public sealed partial class MoveToOperator : HTNOperator, IHtnConditionalShutdown { [Dependency] private readonly IEntityManager _entManager = default!; - [Dependency] private readonly IMapManager _mapManager = default!; private NPCSteeringSystem _steering = default!; private PathfindingSystem _pathfind = default!; private SharedTransformSystem _transform = default!; @@ -85,8 +85,8 @@ public override void Initialize(IEntitySystemManager sysManager) !_entManager.TryGetComponent(owner, out var body)) return (false, null); - if (!_mapManager.TryGetGrid(xform.GridUid, out var ownerGrid) || - !_mapManager.TryGetGrid(targetCoordinates.GetGridUid(_entManager), out var targetGrid)) + if (!_entManager.TryGetComponent(xform.GridUid, out var ownerGrid) || + !_entManager.TryGetComponent(targetCoordinates.GetGridUid(_entManager), out var targetGrid)) { return (false, null); } diff --git a/Content.Server/NPC/Systems/NPCCombatSystem.Ranged.cs b/Content.Server/NPC/Systems/NPCCombatSystem.Ranged.cs index 10ec54c8954..efb85b23ae3 100644 --- a/Content.Server/NPC/Systems/NPCCombatSystem.Ranged.cs +++ b/Content.Server/NPC/Systems/NPCCombatSystem.Ranged.cs @@ -203,6 +203,7 @@ private void UpdateRanged(float frameTime) return; } + _gun.SetTarget(gun, comp.Target); _gun.AttemptShoot(uid, gunUid, gun, targetCordinates); } } diff --git a/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs b/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs index e7af2c91073..ce10d4f5d5e 100644 --- a/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs +++ b/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs @@ -58,7 +58,7 @@ private bool IsFreeSpace( // TODO: Ideally for "FreeSpace" we check all entities on the tile and build flags dynamically (pathfinder refactor in future). var ents = _entSetPool.Get(); - _lookup.GetLocalEntitiesIntersecting(node.GraphUid, node.ChunkOrigin, ents, flags: LookupFlags.Static); + _lookup.GetLocalEntitiesIntersecting(node.GraphUid, node.Box.Enlarged(-0.04f), ents, flags: LookupFlags.Static); var result = true; if (ents.Count > 0) @@ -158,42 +158,42 @@ private bool TrySeek( } } + // Check if mapids match. + var targetMap = targetCoordinates.ToMap(EntityManager, _transform); + var ourMap = ourCoordinates.ToMap(EntityManager, _transform); + + if (targetMap.MapId != ourMap.MapId) + { + steering.Status = SteeringStatus.NoPath; + return false; + } + + var direction = targetMap.Position - ourMap.Position; + // Need to be pretty close if it's just a node to make sure LOS for door bashes or the likes. - float arrivalDistance; + bool arrived; if (targetCoordinates.Equals(steering.Coordinates)) { // What's our tolerance for arrival. // If it's a pathfinding node it might be different to the destination. - arrivalDistance = steering.Range; + arrived = direction.Length() <= steering.Range; } // If next node is a free tile then get within its bounds. // This is to avoid popping it too early else if (steering.CurrentPath.TryPeek(out var node) && IsFreeSpace(uid, steering, node)) { - arrivalDistance = MathF.Max(0.05f, MathF.Min(node.Box.Width / 2f, node.Box.Height / 2f) - 0.05f); + arrived = node.Box.Contains(ourCoordinates.Position); } // Try getting into blocked range I guess? // TODO: Consider melee range or the likes. else { - arrivalDistance = SharedInteractionSystem.InteractionRange - 0.05f; + arrived = direction.Length() <= SharedInteractionSystem.InteractionRange - 0.05f; } - // Check if mapids match. - var targetMap = targetCoordinates.ToMap(EntityManager, _transform); - var ourMap = ourCoordinates.ToMap(EntityManager, _transform); - - if (targetMap.MapId != ourMap.MapId) - { - steering.Status = SteeringStatus.NoPath; - return false; - } - - var direction = targetMap.Position - ourMap.Position; - // Are we in range - if (direction.Length() <= arrivalDistance) + if (arrived) { // Node needs some kind of special handling like access or smashing. if (steering.CurrentPath.TryPeek(out var node) && !IsFreeSpace(uid, steering, node)) diff --git a/Content.Server/NPC/Systems/NPCSteeringSystem.Obstacles.cs b/Content.Server/NPC/Systems/NPCSteeringSystem.Obstacles.cs index 70d1e89bc4f..3bc4eae9e49 100644 --- a/Content.Server/NPC/Systems/NPCSteeringSystem.Obstacles.cs +++ b/Content.Server/NPC/Systems/NPCSteeringSystem.Obstacles.cs @@ -6,6 +6,7 @@ using Content.Shared.DoAfter; using Content.Shared.Doors.Components; using Content.Shared.NPC; +using Robust.Shared.Map.Components; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Utility; @@ -201,7 +202,7 @@ private SteeringObstacleStatus TryHandleFlags(EntityUid uid, NPCSteeringComponen private void GetObstacleEntities(PathPoly poly, int mask, int layer, List ents) { // TODO: Can probably re-use this from pathfinding or something - if (!_mapManager.TryGetGrid(poly.GraphUid, out var grid)) + if (!TryComp(poly.GraphUid, out var grid)) { return; } diff --git a/Content.Server/NPC/Systems/NPCSteeringSystem.cs b/Content.Server/NPC/Systems/NPCSteeringSystem.cs index c00375d6488..447792b6ff2 100644 --- a/Content.Server/NPC/Systems/NPCSteeringSystem.cs +++ b/Content.Server/NPC/Systems/NPCSteeringSystem.cs @@ -45,7 +45,6 @@ public sealed partial class NPCSteeringSystem : SharedNPCSteeringSystem [Dependency] private readonly IAdminManager _admin = default!; [Dependency] private readonly IConfigurationManager _configManager = default!; [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ClimbSystem _climb = default!; [Dependency] private readonly DoAfterSystem _doAfter = default!; @@ -273,6 +272,8 @@ private void SetDirection(InputMoverComponent component, NPCSteeringComponent st if (clear && value.Equals(Vector2.Zero)) { steering.CurrentPath.Clear(); + Array.Clear(steering.Interest); + Array.Clear(steering.Danger); } component.CurTickSprintMovement = value; diff --git a/Content.Server/Ninja/Systems/StunProviderSystem.cs b/Content.Server/Ninja/Systems/StunProviderSystem.cs index 636037060a9..970ca78e2cc 100644 --- a/Content.Server/Ninja/Systems/StunProviderSystem.cs +++ b/Content.Server/Ninja/Systems/StunProviderSystem.cs @@ -1,14 +1,11 @@ using Content.Server.Ninja.Events; using Content.Server.Power.EntitySystems; using Content.Shared.Damage; -using Content.Shared.Damage.Prototypes; using Content.Shared.Interaction; using Content.Shared.Ninja.Components; using Content.Shared.Ninja.Systems; using Content.Shared.Popups; using Content.Shared.Stunnable; -using Content.Shared.Whitelist; -using Robust.Shared.Audio; using Robust.Shared.Prototypes; using Robust.Shared.Audio.Systems; using Robust.Shared.Timing; @@ -23,7 +20,6 @@ public sealed class StunProviderSystem : SharedStunProviderSystem [Dependency] private readonly BatterySystem _battery = default!; [Dependency] private readonly DamageableSystem _damageable = default!; [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedNinjaGlovesSystem _gloves = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; diff --git a/Content.Server/NodeContainer/EntitySystems/NodeGroupSystem.cs b/Content.Server/NodeContainer/EntitySystems/NodeGroupSystem.cs index 5e31bd68722..2296de2eb6a 100644 --- a/Content.Server/NodeContainer/EntitySystems/NodeGroupSystem.cs +++ b/Content.Server/NodeContainer/EntitySystems/NodeGroupSystem.cs @@ -8,7 +8,7 @@ using JetBrains.Annotations; using Robust.Server.Player; using Robust.Shared.Enums; -using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Player; using Robust.Shared.Utility; @@ -25,7 +25,6 @@ public sealed class NodeGroupSystem : EntitySystem [Dependency] private readonly IAdminManager _adminManager = default!; [Dependency] private readonly INodeGroupFactory _nodeGroupFactory = default!; [Dependency] private readonly ILogManager _logManager = default!; - [Dependency] private readonly IMapManager _mapManager = default!; private readonly List _visDeletes = new(); private readonly List _visSends = new(); @@ -343,7 +342,7 @@ private List FloodFillNode(Node rootNode) private IEnumerable GetCompatibleNodes(Node node, EntityQuery xformQuery, EntityQuery nodeQuery) { var xform = xformQuery.GetComponent(node.Owner); - _mapManager.TryGetGrid(xform.GridUid, out var grid); + TryComp(xform.GridUid, out var grid); if (!node.Connectable(EntityManager, xform)) yield break; diff --git a/Content.Server/Nuke/NukeCodePaperSystem.cs b/Content.Server/Nuke/NukeCodePaperSystem.cs index 8df25feebfa..36268d5648d 100644 --- a/Content.Server/Nuke/NukeCodePaperSystem.cs +++ b/Content.Server/Nuke/NukeCodePaperSystem.cs @@ -7,6 +7,8 @@ using Content.Shared.Paper; using Robust.Shared.Random; using Robust.Shared.Utility; +using Content.Server.Announcements.Systems; +using Robust.Shared.Player; namespace Content.Server.Nuke { @@ -17,6 +19,7 @@ public sealed class NukeCodePaperSystem : EntitySystem [Dependency] private readonly StationSystem _station = default!; [Dependency] private readonly PaperSystem _paper = default!; [Dependency] private readonly FaxSystem _faxSystem = default!; + [Dependency] private readonly AnnouncerSystem _announcer = default!; public override void Initialize() { @@ -57,9 +60,7 @@ public bool SendNukeCodes(EntityUid station) while (faxes.MoveNext(out var faxEnt, out var fax)) { if (!fax.ReceiveNukeCodes || !TryGetRelativeNukeCode(faxEnt, out var paperContent, station)) - { continue; - } var printout = new FaxPrintout( paperContent, @@ -77,10 +78,8 @@ public bool SendNukeCodes(EntityUid station) } if (wasSent) - { - var msg = Loc.GetString("nuke-component-announcement-send-codes"); - _chatSystem.DispatchStationAnnouncement(station, msg, colorOverride: Color.Red); - } + _announcer.SendAnnouncement(_announcer.GetAnnouncementId("NukeCodes"), Filter.Broadcast(), + "nuke-component-announcement-send-codes", colorOverride: Color.Red); return wasSent; } diff --git a/Content.Server/Nuke/NukeSystem.cs b/Content.Server/Nuke/NukeSystem.cs index d6767cd2de8..3a1331774d8 100644 --- a/Content.Server/Nuke/NukeSystem.cs +++ b/Content.Server/Nuke/NukeSystem.cs @@ -18,8 +18,10 @@ using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Player; using Robust.Shared.Random; +using Content.Server.Announcements.Systems; namespace Content.Server.Nuke; @@ -28,7 +30,6 @@ public sealed class NukeSystem : EntitySystem [Dependency] private readonly AlertLevelSystem _alertLevel = default!; [Dependency] private readonly ChatSystem _chatSystem = default!; [Dependency] private readonly ExplosionSystem _explosions = default!; - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ITileDefinitionManager _tileDefManager = default!; [Dependency] private readonly ItemSlotsSystem _itemSlots = default!; @@ -42,6 +43,7 @@ public sealed class NukeSystem : EntitySystem [Dependency] private readonly StationSystem _station = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!; [Dependency] private readonly AppearanceSystem _appearance = default!; + [Dependency] private readonly AnnouncerSystem _announcer = default!; /// /// Used to calculate when the nuke song should start playing for maximum kino with the nuke sfx @@ -175,7 +177,7 @@ private async void OnAnchorButtonPressed(EntityUid uid, NukeComponent component, } else { - if (!_mapManager.TryGetGrid(xform.GridUid, out var grid)) + if (!TryComp(xform.GridUid, out var grid)) return; var worldPos = _transform.GetWorldPosition(xform); @@ -461,11 +463,15 @@ public void ArmBomb(EntityUid uid, NukeComponent? component = null) // We are collapsing the randomness here, otherwise we would get separate random song picks for checking duration and when actually playing the song afterwards _selectedNukeSong = _audio.GetSound(component.ArmMusic); - // warn a crew - var announcement = Loc.GetString("nuke-component-announcement-armed", - ("time", (int) component.RemainingTime), ("position", posText)); - var sender = Loc.GetString("nuke-component-announcement-sender"); - _chatSystem.DispatchStationAnnouncement(stationUid ?? uid, announcement, sender, false, null, Color.Red); + _announcer.SendAnnouncementMessage( + _announcer.GetAnnouncementId("NukeArm"), + "nuke-component-announcement-armed", + Loc.GetString("nuke-component-announcement-sender"), + Color.Red, + stationUid ?? uid, + null, + ("time", (int) component.RemainingTime), ("position", posText) + ); _sound.PlayGlobalOnStation(uid, _audio.GetSound(component.ArmSound)); _nukeSongLength = (float) _audio.GetAudioLength(_selectedNukeSong).TotalSeconds; @@ -502,10 +508,12 @@ public void DisarmBomb(EntityUid uid, NukeComponent? component = null) if (stationUid != null) _alertLevel.SetLevel(stationUid.Value, component.AlertLevelOnDeactivate, true, true, true); - // warn a crew - var announcement = Loc.GetString("nuke-component-announcement-unarmed"); - var sender = Loc.GetString("nuke-component-announcement-sender"); - _chatSystem.DispatchStationAnnouncement(uid, announcement, sender, false); + _announcer.SendAnnouncementMessage( + _announcer.GetAnnouncementId("NukeDisarm"), + "nuke-component-announcement-unarmed", + Loc.GetString("nuke-component-announcement-sender"), + station: stationUid ?? uid + ); component.PlayedNukeSong = false; _sound.PlayGlobalOnStation(uid, _audio.GetSound(component.DisarmSound)); @@ -647,4 +655,3 @@ public sealed class NukeDisarmSuccessEvent : EntityEventArgs { } - diff --git a/Content.Server/NukeOps/WarDeclaratorSystem.cs b/Content.Server/NukeOps/WarDeclaratorSystem.cs index bcc0b9c0ea6..dee0c10c40e 100644 --- a/Content.Server/NukeOps/WarDeclaratorSystem.cs +++ b/Content.Server/NukeOps/WarDeclaratorSystem.cs @@ -10,6 +10,8 @@ using Robust.Server.GameObjects; using Robust.Shared.Configuration; using Robust.Shared.Timing; +using Content.Server.Announcements.Systems; +using Robust.Shared.Player; namespace Content.Server.NukeOps; @@ -25,6 +27,7 @@ public sealed class WarDeclaratorSystem : EntitySystem [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly AccessReaderSystem _accessReaderSystem = default!; + [Dependency] private readonly AnnouncerSystem _announcer = default!; public override void Initialize() { @@ -74,7 +77,7 @@ private void OnActivated(Entity ent, ref WarDeclaratorAc if (ev.Status == WarConditionStatus.WarReady) { var title = Loc.GetString(ent.Comp.SenderTitle); - _chat.DispatchGlobalAnnouncement(ent.Comp.Message, title, true, ent.Comp.Sound, ent.Comp.Color); + _announcer.SendAnnouncement("war", Filter.Broadcast(), ent.Comp.Message, title, ent.Comp.Color); _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(playerEntity):player} has declared war with this text: {ent.Comp.Message}"); } diff --git a/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs b/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs index f8d781bcfff..a28679ddbc9 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/SliceableFoodSystem.cs b/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs index e92b046f2e3..abb6f393ac5 100644 --- a/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs @@ -1,11 +1,11 @@ using Content.Server.Nutrition; // DeltaV 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; using Content.Shared.FixedPoint; -using Content.Shared.Hands.EntitySystems; using Content.Shared.Interaction; using Robust.Server.GameObjects; using Robust.Shared.Audio; @@ -19,7 +19,6 @@ public sealed class SliceableFoodSystem : EntitySystem [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedContainerSystem _containerSystem = default!; - [Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly TransformSystem _xformSystem = default!; public override void Initialize() @@ -67,6 +66,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(uid, user, usedItem); + RaiseLocalEvent(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/Nyanotrasen/Carrying/CarryingSystem.cs b/Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs index bb071334fa1..ff4c097080c 100644 --- a/Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs +++ b/Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs @@ -1,11 +1,11 @@ +using System.Numerics; using System.Threading; using Content.Server.DoAfter; using Content.Server.Body.Systems; -using Content.Server.Hands.Systems; using Content.Server.Resist; using Content.Server.Popups; using Content.Server.Inventory; -using Content.Shared.Climbing; // Shared instead of Server +using Content.Server.Nyanotrasen.Item.PseudoItem; using Content.Shared.Mobs; using Content.Shared.DoAfter; using Content.Shared.Buckle.Components; @@ -18,14 +18,17 @@ using Content.Shared.Carrying; using Content.Shared.Movement.Events; using Content.Shared.Movement.Systems; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; using Content.Shared.Standing; using Content.Shared.ActionBlocker; using Content.Shared.Inventory.VirtualItem; +using Content.Shared.Item; using Content.Shared.Throwing; -using Content.Shared.Physics.Pull; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Events; +using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Mobs.Systems; +using Content.Shared.Nyanotrasen.Item.PseudoItem; +using Content.Shared.Storage; using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; @@ -33,22 +36,23 @@ namespace Content.Server.Carrying { public sealed class CarryingSystem : EntitySystem { - [Dependency] private readonly VirtualItemSystem _virtualItemSystem = default!; + [Dependency] private readonly VirtualItemSystem _virtualItemSystem = default!; [Dependency] private readonly CarryingSlowdownSystem _slowdown = default!; [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; [Dependency] private readonly StandingStateSystem _standingState = default!; [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; - [Dependency] private readonly SharedPullingSystem _pullingSystem = default!; + [Dependency] private readonly PullingSystem _pullingSystem = default!; [Dependency] private readonly MobStateSystem _mobStateSystem = default!; [Dependency] private readonly EscapeInventorySystem _escapeInventorySystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly MovementSpeedModifierSystem _movementSpeed = default!; - [Dependency] private readonly RespiratorSystem _respirator = default!; + [Dependency] private readonly PseudoItemSystem _pseudoItem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent>(AddCarryVerb); + SubscribeLocalEvent>(AddInsertCarriedVerb); SubscribeLocalEvent(OnVirtualItemDeleted); SubscribeLocalEvent(OnThrow); SubscribeLocalEvent(OnParentChanged); @@ -64,7 +68,6 @@ public override void Initialize() SubscribeLocalEvent(OnDoAfter); } - private void AddCarryVerb(EntityUid uid, CarriableComponent component, GetVerbsEvent args) { if (!args.CanInteract || !args.CanAccess) @@ -97,6 +100,33 @@ private void AddCarryVerb(EntityUid uid, CarriableComponent component, GetVerbsE args.Verbs.Add(verb); } + private void AddInsertCarriedVerb(EntityUid uid, CarryingComponent component, GetVerbsEvent args) + { + // If the person is carrying someone, and the carried person is a pseudo-item, and the target entity is a storage, + // then add an action to insert the carried entity into the target + var toInsert = args.Using; + if (toInsert is not { Valid: true } || !args.CanAccess || !TryComp(toInsert, out var pseudoItem)) + return; + + if (!TryComp(args.Target, out var storageComp)) + return; + + if (!_pseudoItem.CheckItemFits((toInsert.Value, pseudoItem), (args.Target, storageComp))) + return; + + InnateVerb verb = new() + { + Act = () => + { + DropCarried(uid, toInsert.Value); + _pseudoItem.TryInsert(args.Target, toInsert.Value, pseudoItem, storageComp); + }, + Text = Loc.GetString("action-name-insert-other", ("target", toInsert)), + Priority = 2 + }; + args.Verbs.Add(verb); + } + /// /// Since the carried entity is stored as 2 virtual items, when deleted we want to drop them. /// @@ -125,7 +155,12 @@ private void OnThrow(EntityUid uid, CarryingComponent component, BeforeThrowEven private void OnParentChanged(EntityUid uid, CarryingComponent component, ref EntParentChangedMessage args) { - if (Transform(uid).MapID != args.OldMapId) + var xform = Transform(uid); + if (xform.MapID != args.OldMapId) + return; + + // Do not drop the carried entity if the new parent is a grid + if (xform.ParentUid == xform.GridUid) return; DropCarried(uid, component.Carried); @@ -158,9 +193,13 @@ private void OnMoveInput(EntityUid uid, BeingCarriedComponent component, ref Mov if (!TryComp(uid, out var escape)) return; + if (!args.HasDirectionalMovement) + return; + if (_actionBlockerSystem.CanInteract(uid, component.Carrier)) { - _escapeInventorySystem.AttemptEscape(uid, component.Carrier, escape, MassContest(uid, component.Carrier)); + // Note: the mass contest is inverted because weaker entities are supposed to take longer to escape + _escapeInventorySystem.AttemptEscape(uid, component.Carrier, escape, MassContest(component.Carrier, uid)); } } @@ -209,12 +248,7 @@ private void OnDoAfter(EntityUid uid, CarriableComponent component, CarryDoAfter } private void StartCarryDoAfter(EntityUid carrier, EntityUid carried, CarriableComponent component) { - TimeSpan length = TimeSpan.FromSeconds(3); - - var mod = MassContest(carrier, carried); - - if (mod != 0) - length /= mod; + TimeSpan length = GetPickupDuration(carrier, carried); if (length >= TimeSpan.FromSeconds(9)) { @@ -236,12 +270,15 @@ private void StartCarryDoAfter(EntityUid carrier, EntityUid carried, CarriableCo }; _doAfterSystem.TryStartDoAfter(args); + + // Show a popup to the person getting picked up + _popupSystem.PopupEntity(Loc.GetString("carry-started", ("carrier", carrier)), carried, carried); } private void Carry(EntityUid carrier, EntityUid carried) { - if (TryComp(carried, out var pullable)) - _pullingSystem.TryStopPull(pullable); + if (TryComp(carried, out var pullable)) + _pullingSystem.TryStopPull(carried, pullable); Transform(carrier).AttachToGridOrMap(); Transform(carried).AttachToGridOrMap(); @@ -260,6 +297,26 @@ private void Carry(EntityUid carrier, EntityUid carried) _actionBlockerSystem.UpdateCanMove(carried); } + public bool TryCarry(EntityUid carrier, EntityUid toCarry, CarriableComponent? carriedComp = null) + { + if (!Resolve(toCarry, ref carriedComp, false)) + return false; + + if (!CanCarry(carrier, toCarry, carriedComp)) + return false; + + // The second one means that carrier is a pseudo-item and is inside a bag. + if (HasComp(carrier) || HasComp(carrier)) + return false; + + if (GetPickupDuration(carrier, toCarry) > TimeSpan.FromSeconds(9)) + return false; + + Carry(carrier, toCarry); + + return true; + } + public void DropCarried(EntityUid carrier, EntityUid carried) { RemComp(carrier); // get rid of this first so we don't recusrively fire that event @@ -323,5 +380,43 @@ private float MassContest(EntityUid roller, EntityUid target, PhysicsComponent? return rollerPhysics.FixturesMass / targetPhysics.FixturesMass; } + + private TimeSpan GetPickupDuration(EntityUid carrier, EntityUid carried) + { + var length = TimeSpan.FromSeconds(3); + + var mod = MassContest(carrier, carried); + if (mod != 0) + length /= mod; + + return length; + } + + public override void Update(float frameTime) + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var carried, out var comp)) + { + var carrier = comp.Carrier; + if (carrier is not { Valid: true } || carried is not { Valid: true }) + continue; + + // SOMETIMES - when an entity is inserted into disposals, or a cryosleep chamber - it can get re-parented without a proper reparent event + // when this happens, it needs to be dropped because it leads to weird behavior + if (Transform(carried).ParentUid != carrier) + { + DropCarried(carrier, carried); + continue; + } + + // Make sure the carried entity is always centered relative to the carrier, as gravity pulls can offset it otherwise + var xform = Transform(carried); + if (!xform.LocalPosition.Equals(Vector2.Zero)) + { + xform.LocalPosition = Vector2.Zero; + } + } + query.Dispose(); + } } } diff --git a/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs b/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs index 76cfe7d904b..6df387e6ba8 100644 --- a/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs +++ b/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs @@ -1,6 +1,9 @@ -using Content.Server.DoAfter; +using Content.Server.Carrying; +using Content.Server.DoAfter; using Content.Server.Item; +using Content.Server.Popups; using Content.Server.Storage.EntitySystems; +using Content.Shared.Bed.Sleep; using Content.Shared.DoAfter; using Content.Shared.IdentityManagement; using Content.Shared.Item; @@ -17,12 +20,14 @@ public sealed class PseudoItemSystem : SharedPseudoItemSystem [Dependency] private readonly StorageSystem _storage = default!; [Dependency] private readonly ItemSystem _item = default!; [Dependency] private readonly DoAfterSystem _doAfter = default!; - + [Dependency] private readonly CarryingSystem _carrying = default!; + [Dependency] private readonly PopupSystem _popup = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent>(AddInsertAltVerb); + SubscribeLocalEvent(OnTrySleeping); } private void AddInsertAltVerb(EntityUid uid, PseudoItemComponent component, GetVerbsEvent args) @@ -53,4 +58,25 @@ private void AddInsertAltVerb(EntityUid uid, PseudoItemComponent component, GetV }; args.Verbs.Add(verb); } + + protected override void OnGettingPickedUpAttempt(EntityUid uid, PseudoItemComponent component, GettingPickedUpAttemptEvent args) + { + // Try to pick the entity up instead first + if (args.User != args.Item && _carrying.TryCarry(args.User, uid)) + { + args.Cancel(); + return; + } + + // If could not pick up, just take it out onto the ground as per default + base.OnGettingPickedUpAttempt(uid, component, args); + } + + // Show a popup when a pseudo-item falls asleep inside a bag. + private void OnTrySleeping(EntityUid uid, PseudoItemComponent component, TryingToSleepEvent args) + { + var parent = Transform(uid).ParentUid; + if (!HasComp(uid) && parent is { Valid: true } && HasComp(parent)) + _popup.PopupEntity(Loc.GetString("popup-sleep-in-bag", ("entity", uid)), uid); + } } diff --git a/Content.Server/Nyanotrasen/Item/ShockCollar/ShockCollarComponent.cs b/Content.Server/Nyanotrasen/Item/ShockCollar/ShockCollarComponent.cs index 781f2d00030..1dcbc48676a 100644 --- a/Content.Server/Nyanotrasen/Item/ShockCollar/ShockCollarComponent.cs +++ b/Content.Server/Nyanotrasen/Item/ShockCollar/ShockCollarComponent.cs @@ -2,5 +2,11 @@ namespace Content.Server.ShockCollar; [RegisterComponent] public sealed partial class ShockCollarComponent : Component -{} +{ + [DataField] + public int ShockDamage = 1; + + [DataField] + public TimeSpan ShockTime = TimeSpan.FromSeconds(2); +} diff --git a/Content.Server/Nyanotrasen/Item/ShockCollar/ShockCollarSystem.cs b/Content.Server/Nyanotrasen/Item/ShockCollar/ShockCollarSystem.cs index 4b24f45401a..eeb0f59d42a 100644 --- a/Content.Server/Nyanotrasen/Item/ShockCollar/ShockCollarSystem.cs +++ b/Content.Server/Nyanotrasen/Item/ShockCollar/ShockCollarSystem.cs @@ -33,7 +33,7 @@ private void OnTrigger(EntityUid uid, ShockCollarComponent component, TriggerEve && !_useDelay.TryResetDelay((uid, useDelay), true)) return; - _electrocutionSystem.TryDoElectrocution(containerEnt, null, 5, TimeSpan.FromSeconds(2), true); + _electrocutionSystem.TryDoElectrocution(containerEnt, null, component.ShockDamage, component.ShockTime, true, ignoreInsulation: true); } } diff --git a/Content.Server/Nyanotrasen/Kitchen/EntitySystems/DeepFryerSystem.cs b/Content.Server/Nyanotrasen/Kitchen/EntitySystems/DeepFryerSystem.cs index aa6de572cee..80c38f4630e 100644 --- a/Content.Server/Nyanotrasen/Kitchen/EntitySystems/DeepFryerSystem.cs +++ b/Content.Server/Nyanotrasen/Kitchen/EntitySystems/DeepFryerSystem.cs @@ -86,7 +86,7 @@ public sealed partial class DeepFryerSystem : SharedDeepfryerSystem private static readonly string MobFlavorMeat = "meaty"; private static readonly AudioParams - AudioParamsInsertRemove = new(0.5f, 1f, "Master", 5f, 1.5f, 1f, false, 0f, 0.2f); + AudioParamsInsertRemove = new(0.5f, 1f, 5f, 1.5f, 1f, false, 0f, 0.2f); private ISawmill _sawmill = default!; diff --git a/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs b/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs index 2bd8538af16..888a365a5dd 100644 --- a/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs +++ b/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs @@ -1,7 +1,6 @@ using Content.Server.Objectives.Components; using Content.Server.Warps; using Content.Shared.Objectives.Components; -using Content.Shared.Mind; using Content.Shared.Ninja.Components; using Robust.Shared.Random; using Content.Server.Roles; @@ -16,7 +15,6 @@ public sealed class NinjaConditionsSystem : EntitySystem { [Dependency] private readonly MetaDataSystem _metaData = default!; [Dependency] private readonly NumberObjectiveSystem _number = default!; - [Dependency] private readonly SharedMindSystem _mind = default!; [Dependency] private readonly IRobustRandom _random = default!; public override void Initialize() diff --git a/Content.Server/Objectives/Systems/StealConditionSystem.cs b/Content.Server/Objectives/Systems/StealConditionSystem.cs index 02d4ee010b5..0fe6f0947c8 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/OfferItem/OfferItemSystem.cs b/Content.Server/OfferItem/OfferItemSystem.cs new file mode 100644 index 00000000000..420df71ace7 --- /dev/null +++ b/Content.Server/OfferItem/OfferItemSystem.cs @@ -0,0 +1,83 @@ +using Content.Server.Popups; +using Content.Shared.Hands.Components; +using Content.Shared.Alert; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.OfferItem; +using Content.Shared.IdentityManagement; +using Robust.Shared.Player; + +namespace Content.Server.OfferItem; + +public sealed class OfferItemSystem : SharedOfferItemSystem +{ + [Dependency] private readonly AlertsSystem _alertsSystem = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; + [Dependency] private readonly PopupSystem _popup = default!; + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var offerItem)) + { + if (!TryComp(uid, out var hands) || hands.ActiveHand == null) + continue; + + if (offerItem.Hand != null && + hands.Hands[offerItem.Hand].HeldEntity == null) + { + if (offerItem.Target != null) + { + UnReceive(offerItem.Target.Value, offerItem: offerItem); + offerItem.IsInOfferMode = false; + Dirty(uid, offerItem); + } + else + UnOffer(uid, offerItem); + } + + if (!offerItem.IsInReceiveMode) + { + _alertsSystem.ClearAlert(uid, AlertType.Offer); + continue; + } + + _alertsSystem.ShowAlert(uid, AlertType.Offer); + } + } + + /// + /// Accepting the offer and receive item + /// + public void Receive(EntityUid uid, OfferItemComponent? component = null) + { + if (!Resolve(uid, ref component) || + !TryComp(component.Target, out var offerItem) || + offerItem.Hand == null || + component.Target == null || + !TryComp(uid, out var hands)) + return; + + if (offerItem.Item != null) + { + if (!_hands.TryPickup(uid, offerItem.Item.Value, handsComp: hands)) + { + _popup.PopupEntity(Loc.GetString("offer-item-full-hand"), uid, uid); + return; + } + + _popup.PopupEntity(Loc.GetString("offer-item-give", + ("item", Identity.Entity(offerItem.Item.Value, EntityManager)), + ("target", Identity.Entity(uid, EntityManager))), component.Target.Value, component.Target.Value); + _popup.PopupEntity(Loc.GetString("offer-item-give-other", + ("user", Identity.Entity(component.Target.Value, EntityManager)), + ("item", Identity.Entity(offerItem.Item.Value, EntityManager)), + ("target", Identity.Entity(uid, EntityManager))) + , component.Target.Value, Filter.PvsExcept(component.Target.Value, entityManager: EntityManager), true); + } + + offerItem.Item = null; + UnReceive(uid, component, offerItem); + } +} diff --git a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.cs b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.cs index ddc7e2a0830..e9b62bc4a80 100644 --- a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.cs +++ b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.cs @@ -2,7 +2,6 @@ using Content.Server.Chat.Managers; using Content.Server.Projectiles; using Robust.Shared.Physics.Systems; -using Robust.Shared.Map; using Robust.Shared.Timing; using Robust.Server.GameObjects; using Robust.Shared.Configuration; @@ -13,7 +12,6 @@ public sealed partial class ParticleAcceleratorSystem : EntitySystem { [Dependency] private readonly IAdminLogManager _adminLogger = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly IChatManager _chat = default!; [Dependency] private readonly ProjectileSystem _projectileSystem = default!; diff --git a/Content.Server/Physics/Controllers/MoverController.cs b/Content.Server/Physics/Controllers/MoverController.cs index c362507f19a..759b8ef29c6 100644 --- a/Content.Server/Physics/Controllers/MoverController.cs +++ b/Content.Server/Physics/Controllers/MoverController.cs @@ -6,17 +6,16 @@ using Content.Shared.Movement.Systems; using Content.Shared.Shuttles.Components; using Content.Shared.Shuttles.Systems; -using Robust.Shared.Map; using Robust.Shared.Physics.Components; using Robust.Shared.Player; using DroneConsoleComponent = Content.Server.Shuttles.DroneConsoleComponent; using DependencyAttribute = Robust.Shared.IoC.DependencyAttribute; +using Robust.Shared.Map.Components; namespace Content.Server.Physics.Controllers { public sealed class MoverController : SharedMoverController { - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly ThrusterSystem _thruster = default!; [Dependency] private readonly SharedTransformSystem _xformSystem = default!; @@ -276,7 +275,7 @@ private void HandleShuttleMovement(float frameTime) var gridId = xform.GridUid; // This tries to see if the grid is a shuttle and if the console should work. - if (!_mapManager.TryGetGrid(gridId, out var _) || + if (!TryComp(gridId, out var _) || !shuttleQuery.TryGetComponent(gridId, out var shuttleComponent) || !shuttleComponent.Enabled) continue; diff --git a/Content.Server/Physics/Controllers/PullController.cs b/Content.Server/Physics/Controllers/PullController.cs deleted file mode 100644 index 8f58f807aae..00000000000 --- 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/Polymorph/Systems/PolymorphSystem.cs b/Content.Server/Polymorph/Systems/PolymorphSystem.cs index 66dc9dab99d..5fe29dcd30e 100644 --- a/Content.Server/Polymorph/Systems/PolymorphSystem.cs +++ b/Content.Server/Polymorph/Systems/PolymorphSystem.cs @@ -32,7 +32,6 @@ public sealed partial class PolymorphSystem : EntitySystem [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly ActionsSystem _actions = default!; - [Dependency] private readonly ActionContainerSystem _actionContainer = default!; [Dependency] private readonly AudioSystem _audio = default!; [Dependency] private readonly SharedBuckleSystem _buckle = default!; [Dependency] private readonly ContainerSystem _container = default!; diff --git a/Content.Server/Power/EntitySystems/CableSystem.Placer.cs b/Content.Server/Power/EntitySystems/CableSystem.Placer.cs index c5ca36c3a15..263d626ef55 100644 --- a/Content.Server/Power/EntitySystems/CableSystem.Placer.cs +++ b/Content.Server/Power/EntitySystems/CableSystem.Placer.cs @@ -4,6 +4,7 @@ using Content.Shared.Interaction; using Content.Shared.Maps; using Content.Shared.Stacks; +using Robust.Shared.Map.Components; namespace Content.Server.Power.EntitySystems; @@ -25,7 +26,7 @@ private void OnCablePlacerAfterInteract(Entity placer, ref if (component.CablePrototypeId == null) return; - if(!_mapManager.TryGetGrid(args.ClickLocation.GetGridUid(EntityManager), out var grid)) + if(!TryComp(args.ClickLocation.GetGridUid(EntityManager), out var grid)) return; var snapPos = grid.TileIndicesFor(args.ClickLocation); diff --git a/Content.Server/Power/EntitySystems/CableSystem.cs b/Content.Server/Power/EntitySystems/CableSystem.cs index dd478753be3..62eb08d7cbc 100644 --- a/Content.Server/Power/EntitySystems/CableSystem.cs +++ b/Content.Server/Power/EntitySystems/CableSystem.cs @@ -5,10 +5,7 @@ using Content.Shared.Database; using Content.Shared.DoAfter; using Content.Shared.Interaction; -using Content.Shared.Tools; -using Content.Shared.Tools.Components; using Robust.Shared.Map; -using System.Xml.Schema; using CableCuttingFinishedEvent = Content.Shared.Tools.Systems.CableCuttingFinishedEvent; using SharedToolSystem = Content.Shared.Tools.Systems.SharedToolSystem; @@ -16,13 +13,11 @@ namespace Content.Server.Power.EntitySystems; public sealed partial class CableSystem : EntitySystem { - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly ITileDefinitionManager _tileManager = default!; [Dependency] private readonly SharedToolSystem _toolSystem = default!; [Dependency] private readonly StackSystem _stack = default!; [Dependency] private readonly ElectrocutionSystem _electrocutionSystem = default!; [Dependency] private readonly IAdminLogManager _adminLogs = default!; - [Dependency] private readonly PowerMonitoringConsoleSystem _powerMonitoringSystem = default!; public override void Initialize() { diff --git a/Content.Server/Power/EntitySystems/CableVisSystem.cs b/Content.Server/Power/EntitySystems/CableVisSystem.cs index fcf0ae3d58d..ec08523d447 100644 --- a/Content.Server/Power/EntitySystems/CableVisSystem.cs +++ b/Content.Server/Power/EntitySystems/CableVisSystem.cs @@ -4,15 +4,13 @@ using Content.Server.Power.Nodes; using Content.Shared.Wires; using JetBrains.Annotations; -using Robust.Server.GameObjects; -using Robust.Shared.Map; +using Robust.Shared.Map.Components; namespace Content.Server.Power.EntitySystems { [UsedImplicitly] public sealed class CableVisSystem : EntitySystem { - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly NodeContainerSystem _nodeContainer = default!; @@ -32,7 +30,7 @@ private void UpdateAppearance(EntityUid uid, CableVisComponent cableVis, ref Nod return; var transform = Transform(uid); - if (!_mapManager.TryGetGrid(transform.GridUid, out var grid)) + if (!TryComp(transform.GridUid, out var grid)) return; var mask = WireVisDirFlags.None; diff --git a/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs b/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs index acfb8ff87b3..85e553031fc 100644 --- a/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs +++ b/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs @@ -1,6 +1,5 @@ using System.Diagnostics.CodeAnalysis; using Content.Server.Power.Components; -using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; @@ -9,8 +8,6 @@ namespace Content.Server.Power.EntitySystems { public sealed class ExtensionCableSystem : EntitySystem { - [Dependency] private readonly IMapManager _mapManager = default!; - public override void Initialize() { base.Initialize(); diff --git a/Content.Server/Power/Generator/PortableGeneratorSystem.cs b/Content.Server/Power/Generator/PortableGeneratorSystem.cs index e8e9c5b45e3..e7dfa351789 100644 --- a/Content.Server/Power/Generator/PortableGeneratorSystem.cs +++ b/Content.Server/Power/Generator/PortableGeneratorSystem.cs @@ -1,5 +1,4 @@ using Content.Server.DoAfter; -using Content.Server.NodeContainer.NodeGroups; using Content.Server.Popups; using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; @@ -28,7 +27,6 @@ public sealed class PortableGeneratorSystem : SharedPortableGeneratorSystem [Dependency] private readonly GeneratorSystem _generator = default!; [Dependency] private readonly PowerSwitchableSystem _switchable = default!; [Dependency] private readonly ActiveGeneratorRevvingSystem _revving = default!; - [Dependency] private readonly PowerNetSystem _powerNet = default!; public override void Initialize() { diff --git a/Content.Server/PowerSink/PowerSinkSystem.cs b/Content.Server/PowerSink/PowerSinkSystem.cs index 298e35db469..903cb7ce12e 100644 --- a/Content.Server/PowerSink/PowerSinkSystem.cs +++ b/Content.Server/PowerSink/PowerSinkSystem.cs @@ -8,6 +8,7 @@ using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Content.Server.Power.EntitySystems; +using Content.Server.Announcements.Systems; namespace Content.Server.PowerSink { @@ -33,6 +34,7 @@ public sealed class PowerSinkSystem : EntitySystem [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly StationSystem _station = default!; [Dependency] private readonly BatterySystem _battery = default!; + [Dependency] private readonly AnnouncerSystem _announcer = default!; public override void Initialize() { @@ -126,12 +128,9 @@ private void NotifyStationOfImminentExplosion(EntityUid uid, PowerSinkComponent if (station == null) return; - _chat.DispatchStationAnnouncement( - station.Value, - Loc.GetString("powersink-immiment-explosion-announcement"), - playDefaultSound: true, - colorOverride: Color.Yellow - ); + _announcer.SendAnnouncement(_announcer.GetAnnouncementId("PowerSinkExplosion"), + _station.GetInOwningStation(station.Value), "powersink-immiment-explosion-announcement", + colorOverride: Color.Yellow, station: station.Value); } } } diff --git a/Content.Server/Pulling/PullingSystem.cs b/Content.Server/Pulling/PullingSystem.cs deleted file mode 100644 index 69bb7c93704..00000000000 --- 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/HeadsetSystem.cs b/Content.Server/Radio/EntitySystems/HeadsetSystem.cs index d18b044205c..2500138a238 100644 --- a/Content.Server/Radio/EntitySystems/HeadsetSystem.cs +++ b/Content.Server/Radio/EntitySystems/HeadsetSystem.cs @@ -1,6 +1,9 @@ using Content.Server.Chat.Systems; using Content.Server.Emp; +using Content.Server.Language; using Content.Server.Radio.Components; +using Content.Server.Speech; +using Content.Shared.Chat; using Content.Shared.Inventory.Events; using Content.Shared.Radio; using Content.Shared.Radio.Components; @@ -14,6 +17,7 @@ public sealed class HeadsetSystem : SharedHeadsetSystem { [Dependency] private readonly INetManager _netMan = default!; [Dependency] private readonly RadioSystem _radio = default!; + [Dependency] private readonly LanguageSystem _language = default!; public override void Initialize() { @@ -99,8 +103,16 @@ public void SetEnabled(EntityUid uid, bool value, HeadsetComponent? component = private void OnHeadsetReceive(EntityUid uid, HeadsetComponent component, ref RadioReceiveEvent args) { - if (TryComp(Transform(uid).ParentUid, out ActorComponent? actor)) - _netMan.ServerSendMessage(args.ChatMsg, actor.PlayerSession.Channel); + var parent = Transform(uid).ParentUid; + if (TryComp(parent, out ActorComponent? actor)) + { + var canUnderstand = _language.CanUnderstand(parent, args.Language.ID); + var msg = new MsgChatMessage + { + Message = canUnderstand ? args.OriginalChatMsg : args.LanguageObfuscatedChatMsg + }; + _netMan.ServerSendMessage(msg, actor.PlayerSession.Channel); + } } private void OnEmpPulse(EntityUid uid, HeadsetComponent component, ref EmpPulseEvent args) diff --git a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs index ace7d8ae31a..fc3f69a3ba2 100644 --- a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs @@ -1,5 +1,6 @@ using Content.Server.Chat.Systems; using Content.Server.Interaction; +using Content.Server.Language; using Content.Server.Popups; using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; @@ -29,6 +30,7 @@ public sealed class RadioDeviceSystem : EntitySystem [Dependency] private readonly InteractionSystem _interaction = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!; + [Dependency] private readonly LanguageSystem _language = default!; // Used to prevent a shitter from using a bunch of radios to spam chat. private HashSet<(string, EntityUid)> _recentlySent = new(); @@ -208,7 +210,8 @@ private void OnReceiveRadio(EntityUid uid, RadioSpeakerComponent component, ref ("originalName", nameEv.Name)); // log to chat so people can identity the speaker/source, but avoid clogging ghost chat if there are many radios - _chat.TrySendInGameICMessage(uid, args.Message, InGameICChatType.Whisper, ChatTransmitRange.GhostRangeLimit, nameOverride: name, checkRadioPrefix: false); + var message = args.OriginalChatMsg.Message; // The chat system will handle the rest and re-obfuscate if needed. + _chat.TrySendInGameICMessage(uid, message, InGameICChatType.Whisper, ChatTransmitRange.GhostRangeLimit, nameOverride: name, checkRadioPrefix: false, languageOverride: args.Language); } private void OnBeforeIntercomUiOpen(EntityUid uid, IntercomComponent component, BeforeActivatableUIOpenEvent args) diff --git a/Content.Server/Radio/EntitySystems/RadioSystem.cs b/Content.Server/Radio/EntitySystems/RadioSystem.cs index e2a61b5022b..bfdd49213ee 100644 --- a/Content.Server/Radio/EntitySystems/RadioSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioSystem.cs @@ -1,10 +1,13 @@ using Content.Server.Administration.Logs; using Content.Server.Chat.Systems; +using Content.Server.Language; using Content.Server.Power.Components; using Content.Server.Radio.Components; +using Content.Server.Speech; using Content.Server.VoiceMask; using Content.Shared.Chat; using Content.Shared.Database; +using Content.Shared.Language; using Content.Shared.Radio; using Content.Shared.Radio.Components; using Content.Shared.Speech; @@ -29,6 +32,7 @@ public sealed class RadioSystem : EntitySystem [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly LanguageSystem _language = default!; // set used to prevent radio feedback loops. private readonly HashSet _messages = new(); @@ -44,7 +48,7 @@ private void OnIntrinsicSpeak(EntityUid uid, IntrinsicRadioTransmitterComponent { if (args.Channel != null && component.Channels.Contains(args.Channel.ID)) { - SendRadioMessage(uid, args.Message, args.Channel, uid); + SendRadioMessage(uid, args.Message, args.Channel, uid, args.Language); args.Channel = null; // prevent duplicate messages from other listeners. } } @@ -52,15 +56,23 @@ private void OnIntrinsicSpeak(EntityUid uid, IntrinsicRadioTransmitterComponent private void OnIntrinsicReceive(EntityUid uid, IntrinsicRadioReceiverComponent component, ref RadioReceiveEvent args) { if (TryComp(uid, out ActorComponent? actor)) - _netMan.ServerSendMessage(args.ChatMsg, actor.PlayerSession.Channel); + { + // Einstein-Engines - languages mechanic + var listener = component.Owner; + var msg = args.OriginalChatMsg; + if (listener != null && !_language.CanUnderstand(listener, args.Language.ID)) + msg = args.LanguageObfuscatedChatMsg; + + _netMan.ServerSendMessage(new MsgChatMessage { Message = msg}, actor.PlayerSession.Channel); + } } /// /// Send radio message to all active radio listeners /// - public void SendRadioMessage(EntityUid messageSource, string message, ProtoId channel, EntityUid radioSource, bool escapeMarkup = true) + public void SendRadioMessage(EntityUid messageSource, string message, ProtoId channel, EntityUid radioSource, LanguagePrototype? language = null, bool escapeMarkup = true) { - SendRadioMessage(messageSource, message, _prototype.Index(channel), radioSource, escapeMarkup: escapeMarkup); + SendRadioMessage(messageSource, message, _prototype.Index(channel), radioSource, escapeMarkup: escapeMarkup, language: language); } /// @@ -68,8 +80,11 @@ public void SendRadioMessage(EntityUid messageSource, string message, ProtoId /// Entity that spoke the message /// Entity that picked up the message and will send it, e.g. headset - public void SendRadioMessage(EntityUid messageSource, string message, RadioChannelPrototype channel, EntityUid radioSource, bool escapeMarkup = true) + public void SendRadioMessage(EntityUid messageSource, string message, RadioChannelPrototype channel, EntityUid radioSource, LanguagePrototype? language = null, bool escapeMarkup = true) { + if (language == null) + language = _language.GetLanguage(messageSource); + // TODO if radios ever garble / modify messages, feedback-prevention needs to be handled better than this. if (!_messages.Add(message)) return; @@ -84,6 +99,7 @@ public void SendRadioMessage(EntityUid messageSource, string message, RadioChann name = FormattedMessage.EscapeText(name); + // most radios are relayed to chat, so lets parse the chat message beforehand SpeechVerbPrototype speech; if (mask != null && mask.Enabled @@ -99,24 +115,15 @@ public void SendRadioMessage(EntityUid messageSource, string message, RadioChann ? FormattedMessage.EscapeText(message) : message; - var wrappedMessage = Loc.GetString(speech.Bold ? "chat-radio-message-wrap-bold" : "chat-radio-message-wrap", - ("color", channel.Color), - ("fontType", speech.FontId), - ("fontSize", speech.FontSize), - ("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))), - ("channel", $"\\[{channel.LocalizedName}\\]"), - ("name", name), - ("message", content)); + var wrappedMessage = WrapRadioMessage(messageSource, channel, name, content, language); + var msg = new ChatMessage(ChatChannel.Radio, content, wrappedMessage, NetEntity.Invalid, null); - // most radios are relayed to chat, so lets parse the chat message beforehand - var chat = new ChatMessage( - ChatChannel.Radio, - message, - wrappedMessage, - NetEntity.Invalid, - null); - var chatMsg = new MsgChatMessage { Message = chat }; - var ev = new RadioReceiveEvent(message, messageSource, channel, chatMsg); + // ... you guess it + var obfuscated = _language.ObfuscateSpeech(content, language); + var obfuscatedWrapped = WrapRadioMessage(messageSource, channel, name, obfuscated, language); + var notUdsMsg = new ChatMessage(ChatChannel.Radio, obfuscated, obfuscatedWrapped, NetEntity.Invalid, null); + + var ev = new RadioReceiveEvent(messageSource, channel, msg, notUdsMsg, language); var sendAttemptEv = new RadioSendAttemptEvent(channel, radioSource); RaiseLocalEvent(ref sendAttemptEv); @@ -162,10 +169,24 @@ public void SendRadioMessage(EntityUid messageSource, string message, RadioChann else _adminLogger.Add(LogType.Chat, LogImpact.Low, $"Radio message from {ToPrettyString(messageSource):user} on {channel.LocalizedName}: {message}"); - _replay.RecordServerMessage(chat); + _replay.RecordServerMessage(msg); _messages.Remove(message); } + private string WrapRadioMessage(EntityUid source, RadioChannelPrototype channel, string name, string message, LanguagePrototype language) + { + var speech = _chat.GetSpeechVerb(source, message); + return Loc.GetString(speech.Bold ? "chat-radio-message-wrap-bold" : "chat-radio-message-wrap", + ("color", channel.Color), + ("languageColor", language.Color ?? channel.Color), + ("fontType", language.FontId ?? speech.FontId), + ("fontSize", language.FontSize ?? speech.FontSize), + ("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))), + ("channel", $"\\[{channel.LocalizedName}\\]"), + ("name", name), + ("message", message)); + } + /// private bool HasActiveServer(MapId mapId, string channelId) { diff --git a/Content.Server/Radio/RadioEvent.cs b/Content.Server/Radio/RadioEvent.cs index 69d764ffe67..35220d1d757 100644 --- a/Content.Server/Radio/RadioEvent.cs +++ b/Content.Server/Radio/RadioEvent.cs @@ -1,10 +1,22 @@ using Content.Shared.Chat; +using Content.Shared.Language; using Content.Shared.Radio; namespace Content.Server.Radio; +/// +/// The message to display when the speaker can understand "language" +/// The message to display when the speaker cannot understand "language" +/// [ByRefEvent] -public readonly record struct RadioReceiveEvent(string Message, EntityUid MessageSource, RadioChannelPrototype Channel, MsgChatMessage ChatMsg); +public readonly record struct RadioReceiveEvent( + // Einstein-Engines - languages mechanic + EntityUid MessageSource, + RadioChannelPrototype Channel, + ChatMessage OriginalChatMsg, + ChatMessage LanguageObfuscatedChatMsg, + LanguagePrototype Language +); /// /// Use this event to cancel sending message per receiver diff --git a/Content.Server/RatKing/RatKingSystem.cs b/Content.Server/RatKing/RatKingSystem.cs index f676e89ac3f..4b82dba3359 100644 --- a/Content.Server/RatKing/RatKingSystem.cs +++ b/Content.Server/RatKing/RatKingSystem.cs @@ -11,7 +11,6 @@ using Content.Shared.Nutrition.EntitySystems; using Content.Shared.Pointing; using Content.Shared.RatKing; -using Robust.Server.GameObjects; using Robust.Shared.Map; using Robust.Shared.Random; @@ -26,7 +25,6 @@ public sealed class RatKingSystem : SharedRatKingSystem [Dependency] private readonly HungerSystem _hunger = default!; [Dependency] private readonly NPCSystem _npc = default!; [Dependency] private readonly PopupSystem _popup = default!; - [Dependency] private readonly TransformSystem _xform = default!; public override void Initialize() { diff --git a/Content.Server/Remotes/DoorRemoteComponent.cs b/Content.Server/Remotes/DoorRemoteComponent.cs deleted file mode 100644 index 91cb7ccad10..00000000000 --- a/Content.Server/Remotes/DoorRemoteComponent.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Content.Server.Remotes -{ - [RegisterComponent] - [Access(typeof(DoorRemoteSystem))] - public sealed partial class DoorRemoteComponent : Component - { - public OperatingMode Mode = OperatingMode.OpenClose; - - public enum OperatingMode : byte - { - OpenClose, - ToggleBolts, - ToggleEmergencyAccess - } - } -} diff --git a/Content.Server/Remotes/DoorRemoteSystem.cs b/Content.Server/Remotes/DoorRemoteSystem.cs index d335911901a..e42bc700912 100644 --- a/Content.Server/Remotes/DoorRemoteSystem.cs +++ b/Content.Server/Remotes/DoorRemoteSystem.cs @@ -1,74 +1,43 @@ using Content.Server.Administration.Logs; -using Robust.Shared.Player; using Content.Shared.Interaction; -using Content.Shared.Popups; using Content.Shared.Doors.Components; -using Content.Shared.Doors.Systems; -using Content.Shared.Physics; using Content.Shared.Access.Components; using Content.Server.Doors.Systems; using Content.Server.Power.EntitySystems; using Content.Shared.Database; -using Content.Shared.Interaction.Events; using Content.Shared.Examine; -using static Content.Server.Remotes.DoorRemoteComponent; +using Content.Shared.Remotes.EntitySystems; +using Content.Shared.Remotes.Components; -namespace Content.Server.Remotes +namespace Content.Shared.Remotes { - public sealed class DoorRemoteSystem : EntitySystem + public sealed class DoorRemoteSystem : SharedDoorRemoteSystem { [Dependency] private readonly IAdminLogManager _adminLogger = default!; [Dependency] private readonly AirlockSystem _airlock = default!; - [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() { - SubscribeLocalEvent(OnInHandActivation); - SubscribeLocalEvent(OnBeforeInteract); - } - - public void OnInHandActivation(EntityUid user, DoorRemoteComponent component, UseInHandEvent args) - { - string switchMessageId; - switch (component.Mode) - { - case OperatingMode.OpenClose: - component.Mode = OperatingMode.ToggleBolts; - switchMessageId = "door-remote-switch-state-toggle-bolts"; - break; + base.Initialize(); - // Skip toggle bolts mode and move on from there (to emergency access) - case OperatingMode.ToggleBolts: - component.Mode = OperatingMode.ToggleEmergencyAccess; - switchMessageId = "door-remote-switch-state-toggle-emergency-access"; - break; - - // Skip ToggleEmergencyAccess mode and move on from there (to door toggle) - case OperatingMode.ToggleEmergencyAccess: - component.Mode = OperatingMode.OpenClose; - switchMessageId = "door-remote-switch-state-open-close"; - break; - default: - throw new InvalidOperationException( - $"{nameof(DoorRemoteComponent)} had invalid mode {component.Mode}"); - } - ShowPopupToUser(switchMessageId, args.User); + SubscribeLocalEvent(OnBeforeInteract); } - private void OnBeforeInteract(EntityUid uid, DoorRemoteComponent component, BeforeRangedInteractEvent args) + private void OnBeforeInteract(Entity entity, ref BeforeRangedInteractEvent args) { bool isAirlock = TryComp(args.Target, out var airlockComp); if (args.Handled || args.Target == null || !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. + // Only able to control doors if they are within your vision and within your max range. + // Not affected by mobs or machines anymore. || !_examine.InRangeUnOccluded(args.User, args.Target.Value, SharedInteractionSystem.MaxRaycastRange, null)) + { return; } @@ -77,7 +46,7 @@ private void OnBeforeInteract(EntityUid uid, DoorRemoteComponent component, Befo if (!this.IsPowered(args.Target.Value, EntityManager)) { - ShowPopupToUser("door-remote-no-power", args.User); + Popup.PopupEntity(Loc.GetString("door-remote-no-power"), args.User, args.User); return; } @@ -85,11 +54,11 @@ private void OnBeforeInteract(EntityUid uid, DoorRemoteComponent component, Befo && !_doorSystem.HasAccess(args.Target.Value, args.Used, doorComp, accessComponent)) { _doorSystem.Deny(args.Target.Value, doorComp, args.User); - ShowPopupToUser("door-remote-denied", args.User); + Popup.PopupEntity(Loc.GetString("door-remote-denied"), args.User, args.User); return; } - switch (component.Mode) + switch (entity.Comp.Mode) { case OperatingMode.OpenClose: if (_doorSystem.TryToggleDoor(args.Target.Value, doorComp, args.Used)) @@ -115,11 +84,8 @@ private void OnBeforeInteract(EntityUid uid, DoorRemoteComponent component, Befo break; default: throw new InvalidOperationException( - $"{nameof(DoorRemoteComponent)} had invalid mode {component.Mode}"); + $"{nameof(DoorRemoteComponent)} had invalid mode {entity.Comp.Mode}"); } } - - private void ShowPopupToUser(string messageId, EntityUid user) => - _popupSystem.PopupEntity(Loc.GetString(messageId), user, user); } } diff --git a/Content.Server/Research/Systems/ResearchStealerSystem.cs b/Content.Server/Research/Systems/ResearchStealerSystem.cs index 5bab6048de5..d40134f1e9f 100644 --- a/Content.Server/Research/Systems/ResearchStealerSystem.cs +++ b/Content.Server/Research/Systems/ResearchStealerSystem.cs @@ -1,11 +1,13 @@ using Content.Shared.Research.Components; using Content.Shared.Research.Systems; +using Robust.Shared.Random; namespace Content.Server.Research.Systems; public sealed class ResearchStealerSystem : SharedResearchStealerSystem { [Dependency] private readonly SharedResearchSystem _research = default!; + [Dependency] private readonly IRobustRandom _random = default!; public override void Initialize() { @@ -24,16 +26,26 @@ private void OnDoAfter(EntityUid uid, ResearchStealerComponent comp, ResearchSte if (!TryComp(target, out var database)) return; - var ev = new ResearchStolenEvent(uid, target, database.UnlockedTechnologies); + var ev = new ResearchStolenEvent(uid, target, new()); + var count = _random.Next(comp.MinToSteal, comp.MaxToSteal + 1); + for (var i = 0; i < count; i++) + { + if (database.UnlockedTechnologies.Count == 0) + break; + + var toRemove = _random.Pick(database.UnlockedTechnologies); + if (_research.TryRemoveTechnology((target, database), toRemove)) + ev.Techs.Add(toRemove); + } RaiseLocalEvent(uid, ref ev); - // oops, no more advanced lasers! - _research.ClearTechs(target, database); + + args.Handled = true; } } /// -/// Event raised on the user when research is stolen from a R&D server. +/// Event raised on the user when research is stolen from a RND server. /// Techs contains every technology id researched. /// [ByRefEvent] -public record struct ResearchStolenEvent(EntityUid Used, EntityUid Target, List Techs); +public record struct ResearchStolenEvent(EntityUid Used, EntityUid Target, List Techs); diff --git a/Content.Server/Resist/CanEscapeInventoryComponent.cs b/Content.Server/Resist/CanEscapeInventoryComponent.cs index 19b4abf7d0c..978e03d95f9 100644 --- a/Content.Server/Resist/CanEscapeInventoryComponent.cs +++ b/Content.Server/Resist/CanEscapeInventoryComponent.cs @@ -15,4 +15,10 @@ public sealed partial class CanEscapeInventoryComponent : Component [DataField("doAfter")] public DoAfterId? DoAfter; + + /// + /// Action to cancel inventory escape. + /// + [DataField] + public EntityUid? EscapeCancelAction; } diff --git a/Content.Server/Resist/EscapeInventorySystem.cs b/Content.Server/Resist/EscapeInventorySystem.cs index 127db7d2b34..95a470e9093 100644 --- a/Content.Server/Resist/EscapeInventorySystem.cs +++ b/Content.Server/Resist/EscapeInventorySystem.cs @@ -5,6 +5,7 @@ using Content.Shared.Hands.EntitySystems; using Content.Server.Storage.Components; using Content.Shared.ActionBlocker; +using Content.Shared.Actions; using Content.Shared.DoAfter; using Content.Shared.Hands.EntitySystems; using Content.Shared.Interaction.Events; @@ -13,6 +14,7 @@ using Content.Shared.Resist; using Content.Shared.Storage; using Robust.Shared.Containers; +using Robust.Shared.Prototypes; namespace Content.Server.Resist; @@ -24,11 +26,17 @@ public sealed class EscapeInventorySystem : EntitySystem [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly CarryingSystem _carryingSystem = default!; // Carrying system from Nyanotrasen. + [Dependency] private readonly SharedActionsSystem _actions = default!; /// /// You can't escape the hands of an entity this many times more massive than you. /// public const float MaximumMassDisadvantage = 6f; + /// + /// Action to cancel inventory escape + /// + [ValidatePrototypeId] + private readonly string _escapeCancelAction = "ActionCancelEscape"; public override void Initialize() { @@ -37,6 +45,7 @@ public override void Initialize() SubscribeLocalEvent(OnRelayMovement); SubscribeLocalEvent(OnEscape); SubscribeLocalEvent(OnDropped); + SubscribeLocalEvent(OnCancelEscape); } private void OnRelayMovement(EntityUid uid, CanEscapeInventoryComponent component, ref MoveInputEvent args) @@ -84,12 +93,20 @@ private void OnRelayMovement(EntityUid uid, CanEscapeInventoryComponent componen _popupSystem.PopupEntity(Loc.GetString("escape-inventory-component-start-resisting"), user, user); _popupSystem.PopupEntity(Loc.GetString("escape-inventory-component-start-resisting-target"), container, container); + + // Add an escape cancel action + if (component.EscapeCancelAction is not { Valid: true }) + _actions.AddAction(user, ref component.EscapeCancelAction, _escapeCancelAction); } private void OnEscape(EntityUid uid, CanEscapeInventoryComponent component, EscapeInventoryEvent args) { component.DoAfter = null; + // Remove the cancel action regardless of do-after result + _actions.RemoveAction(uid, component.EscapeCancelAction); + component.EscapeCancelAction = null; + if (args.Handled || args.Cancelled) return; @@ -109,4 +126,13 @@ private void OnDropped(EntityUid uid, CanEscapeInventoryComponent component, Dro if (component.DoAfter != null) _doAfterSystem.Cancel(component.DoAfter); } + + private void OnCancelEscape(EntityUid uid, CanEscapeInventoryComponent component, EscapeInventoryCancelActionEvent args) + { + if (component.DoAfter != null) + _doAfterSystem.Cancel(component.DoAfter); + + _actions.RemoveAction(uid, component.EscapeCancelAction); + component.EscapeCancelAction = null; + } } diff --git a/Content.Server/Respawn/SpecialRespawnSystem.cs b/Content.Server/Respawn/SpecialRespawnSystem.cs index 2822c94093f..2463bcd7402 100644 --- a/Content.Server/Respawn/SpecialRespawnSystem.cs +++ b/Content.Server/Respawn/SpecialRespawnSystem.cs @@ -9,13 +9,13 @@ using Content.Shared.Physics; using Content.Shared.Respawn; using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Random; namespace Content.Server.Respawn; public sealed class SpecialRespawnSystem : SharedSpecialRespawnSystem { - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IAdminLogManager _adminLog = default!; [Dependency] private readonly ITileDefinitionManager _tileDefinitionManager = default!; [Dependency] private readonly AtmosphereSystem _atmosphere = default!; @@ -84,7 +84,7 @@ private void OnTermination(EntityUid uid, SpecialRespawnComponent component, ref if (!component.Respawn || !HasComp(entityGridUid) || entityMapUid == null) return; - if (!_mapManager.TryGetGrid(entityGridUid, out var grid) || MetaData(entityGridUid.Value).EntityLifeStage >= EntityLifeStage.Terminating) + if (!TryComp(entityGridUid, out var grid) || MetaData(entityGridUid.Value).EntityLifeStage >= EntityLifeStage.Terminating) return; if (TryFindRandomTile(entityGridUid.Value, entityMapUid.Value, 10, out var coords)) @@ -146,7 +146,7 @@ public bool TryFindRandomTile(EntityUid targetGrid, EntityUid targetMap, int max { targetCoords = EntityCoordinates.Invalid; - if (!_mapManager.TryGetGrid(targetGrid, out var grid)) + if (!TryComp(targetGrid, out var grid)) return false; var xform = Transform(targetGrid); diff --git a/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs b/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs index eb6eb5a426f..cd64f043a08 100644 --- a/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs +++ b/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs @@ -2,7 +2,6 @@ using Content.Shared.Damage; using Content.Shared.Revenant; using Robust.Shared.Random; -using Robust.Shared.Map; using Content.Shared.Tag; using Content.Server.Storage.Components; using Content.Server.Light.Components; @@ -15,7 +14,6 @@ using Content.Shared.Bed.Sleep; using System.Linq; using System.Numerics; -using Content.Server.Maps; using Content.Server.Revenant.Components; using Content.Shared.DoAfter; using Content.Shared.Emag.Systems; @@ -28,12 +26,12 @@ using Content.Shared.Revenant.Components; using Robust.Shared.Physics.Components; using Robust.Shared.Utility; +using Robust.Shared.Map.Components; namespace Content.Server.Revenant.EntitySystems; public sealed partial class RevenantSystem { - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly ThrowingSystem _throwing = default!; [Dependency] private readonly EntityStorageSystem _entityStorage = default!; [Dependency] private readonly EmagSystem _emag = default!; @@ -213,7 +211,7 @@ private void OnDefileAction(EntityUid uid, RevenantComponent component, Revenant //var coords = Transform(uid).Coordinates; //var gridId = coords.GetGridUid(EntityManager); var xform = Transform(uid); - if (!_mapManager.TryGetGrid(xform.GridUid, out var map)) + if (!TryComp(xform.GridUid, out var map)) return; var tiles = map.GetTilesIntersecting(Box2.CenteredAround(xform.WorldPosition, new Vector2(component.DefileRadius * 2, component.DefileRadius))).ToArray(); diff --git a/Content.Server/Roles/RemoveRoleCommand.cs b/Content.Server/Roles/RemoveRoleCommand.cs index edb29da624f..feba63a253f 100644 --- a/Content.Server/Roles/RemoveRoleCommand.cs +++ b/Content.Server/Roles/RemoveRoleCommand.cs @@ -5,14 +5,12 @@ using Content.Shared.Roles.Jobs; using Robust.Server.Player; using Robust.Shared.Console; -using Robust.Shared.Prototypes; namespace Content.Server.Roles { [AdminCommand(AdminFlags.Admin)] public sealed class RemoveRoleCommand : IConsoleCommand { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IEntityManager _entityManager = default!; public string Command => "rmrole"; diff --git a/Content.Server/RoundEnd/RoundEndSystem.cs b/Content.Server/RoundEnd/RoundEndSystem.cs index 3a8331f3f7a..d79fe2d2cca 100644 --- a/Content.Server/RoundEnd/RoundEndSystem.cs +++ b/Content.Server/RoundEnd/RoundEndSystem.cs @@ -22,6 +22,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Timing; using Timer = Robust.Shared.Timing.Timer; +using Content.Server.Announcements.Systems; namespace Content.Server.RoundEnd { @@ -42,6 +43,7 @@ public sealed class RoundEndSystem : EntitySystem [Dependency] private readonly EmergencyShuttleSystem _shuttle = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly StationSystem _stationSystem = default!; + [Dependency] private readonly AnnouncerSystem _announcer = default!; public TimeSpan DefaultCooldownDuration { get; set; } = TimeSpan.FromSeconds(30); @@ -176,15 +178,16 @@ public void RequestRoundEnd(TimeSpan countdownTime, EntityUid? requester = null, units = "eta-units-minutes"; } - _chatSystem.DispatchGlobalAnnouncement(Loc.GetString(text, - ("time", time), - ("units", Loc.GetString(units))), + _announcer.SendAnnouncement(_announcer.GetAnnouncementId("ShuttleCalled"), + Filter.Broadcast(), + text, name, - false, + Color.Gold, null, - Color.Gold); - - _audio.PlayGlobal("/Audio/Announcements/shuttlecalled.ogg", Filter.Broadcast(), true); + null, + ("time", time), + ("units", Loc.GetString(units)) + ); LastCountdownStart = _gameTiming.CurTime; ExpectedCountdownEnd = _gameTiming.CurTime + countdownTime; @@ -227,10 +230,13 @@ public void CancelRoundEndCountdown(EntityUid? requester = null, bool checkCoold _adminLogger.Add(LogType.ShuttleRecalled, LogImpact.High, $"Shuttle recalled"); } - _chatSystem.DispatchGlobalAnnouncement(Loc.GetString("round-end-system-shuttle-recalled-announcement"), - Loc.GetString("Station"), false, colorOverride: Color.Gold); - - _audio.PlayGlobal("/Audio/Announcements/shuttlerecalled.ogg", Filter.Broadcast(), true); + _announcer.SendAnnouncement( + _announcer.GetAnnouncementId("ShuttleRecalled"), + Filter.Broadcast(), + "round-end-system-shuttle-recalled-announcement", + Loc.GetString("Station"), + Color.Gold + ); LastCountdownStart = null; ExpectedCountdownEnd = null; @@ -309,9 +315,13 @@ public void DoRoundEndBehavior(RoundEndBehavior behavior, // Check is shuttle called or not. We should only dispatch announcement if it's already called if (IsRoundEndRequested()) { - _chatSystem.DispatchGlobalAnnouncement(Loc.GetString(textAnnounce), + _announcer.SendAnnouncement( + _announcer.GetAnnouncementId("ShuttleCalled"), + Filter.Broadcast(), + textAnnounce, Loc.GetString(sender), - colorOverride: Color.Gold); + Color.Gold + ); } else { diff --git a/Content.Server/Salvage/SalvageSystem.Expeditions.cs b/Content.Server/Salvage/SalvageSystem.Expeditions.cs index 7e4a9c9310e..36e3a574ea0 100644 --- a/Content.Server/Salvage/SalvageSystem.Expeditions.cs +++ b/Content.Server/Salvage/SalvageSystem.Expeditions.cs @@ -162,6 +162,8 @@ private void SpawnMission(SalvageMissionParams missionParams, EntityUid station) _biome, _dungeon, _metaData, + _transform, + _mapSystem, station, missionParams, cancelToken.Token); diff --git a/Content.Server/Salvage/SalvageSystem.cs b/Content.Server/Salvage/SalvageSystem.cs index a1a3b686b2f..5a68005dd3a 100644 --- a/Content.Server/Salvage/SalvageSystem.cs +++ b/Content.Server/Salvage/SalvageSystem.cs @@ -53,6 +53,7 @@ public sealed partial class SalvageSystem : SharedSalvageSystem [Dependency] private readonly RadioSystem _radioSystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly SharedMapSystem _mapSystem = default!; [Dependency] private readonly ShuttleSystem _shuttle = default!; [Dependency] private readonly ShuttleConsoleSystem _shuttleConsoles = default!; [Dependency] private readonly StationSystem _station = default!; diff --git a/Content.Server/Salvage/SpawnSalvageMissionJob.cs b/Content.Server/Salvage/SpawnSalvageMissionJob.cs index e2b17b58724..5f7e356830c 100644 --- a/Content.Server/Salvage/SpawnSalvageMissionJob.cs +++ b/Content.Server/Salvage/SpawnSalvageMissionJob.cs @@ -46,6 +46,8 @@ public sealed class SpawnSalvageMissionJob : Job private readonly BiomeSystem _biome; private readonly DungeonSystem _dungeon; private readonly MetaDataSystem _metaData; + private readonly SharedTransformSystem _xforms; + private readonly SharedMapSystem _map; public readonly EntityUid Station; private readonly SalvageMissionParams _missionParams; @@ -63,6 +65,8 @@ public SpawnSalvageMissionJob( BiomeSystem biome, DungeonSystem dungeon, MetaDataSystem metaData, + SharedTransformSystem xform, + SharedMapSystem map, EntityUid station, SalvageMissionParams missionParams, CancellationToken cancellation = default) : base(maxTime, cancellation) @@ -75,6 +79,8 @@ public SpawnSalvageMissionJob( _biome = biome; _dungeon = dungeon; _metaData = metaData; + _xforms = xform; + _map = map; Station = station; _missionParams = missionParams; _sawmill = logManager.GetSawmill("salvage_job"); @@ -86,9 +92,7 @@ public SpawnSalvageMissionJob( protected override async Task Process() { _sawmill.Debug("salvage", $"Spawning salvage mission with seed {_missionParams.Seed}"); - var mapId = _mapManager.CreateMap(); - var mapUid = _mapManager.GetMapEntityId(mapId); - _mapManager.AddUninitializedMap(mapId); + var mapUid = _map.CreateMap(out var mapId, runMapInit: false); MetaDataComponent? metadata = null; var grid = _entManager.EnsureComponent(mapUid); var random = new Random(_missionParams.Seed); diff --git a/Content.Server/Sandbox/Commands/ColorNetworkCommand.cs b/Content.Server/Sandbox/Commands/ColorNetworkCommand.cs index 2ab29d1b2f0..6ce8edd1d84 100644 --- a/Content.Server/Sandbox/Commands/ColorNetworkCommand.cs +++ b/Content.Server/Sandbox/Commands/ColorNetworkCommand.cs @@ -11,7 +11,6 @@ namespace Content.Server.Sandbox.Commands [AnyCommand] public sealed class ColorNetworkCommand : IConsoleCommand { - [Dependency] private readonly IAdminManager _adminManager = default!; [Dependency] private readonly IEntityManager _entManager = default!; public string Command => "colornetwork"; diff --git a/Content.Server/Shuttles/Systems/ArrivalsSystem.cs b/Content.Server/Shuttles/Systems/ArrivalsSystem.cs index f4dd502b375..ae742cf1f9e 100644 --- a/Content.Server/Shuttles/Systems/ArrivalsSystem.cs +++ b/Content.Server/Shuttles/Systems/ArrivalsSystem.cs @@ -1,13 +1,10 @@ using System.Linq; -using System.Numerics; using Content.Server.Administration; using Content.Server.GameTicking; using Content.Server.GameTicking.Events; using Content.Server.Parallax; -using Content.Server.DeviceNetwork; using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; -using Content.Server.Salvage; using Content.Server.Screens.Components; using Content.Server.Shuttles.Components; using Content.Server.Shuttles.Events; @@ -22,7 +19,6 @@ using Content.Shared.Parallax.Biomes; using Content.Shared.Salvage; using Content.Shared.Shuttles.Components; -using Robust.Shared.Spawners; using Content.Shared.Tiles; using Robust.Server.GameObjects; using Robust.Shared.Collections; @@ -51,7 +47,6 @@ public sealed class ArrivalsSystem : EntitySystem [Dependency] private readonly GameTicker _ticker = default!; [Dependency] private readonly MapLoaderSystem _loader = default!; [Dependency] private readonly DeviceNetworkSystem _deviceNetworkSystem = default!; - [Dependency] private readonly RestrictedRangeSystem _restricted = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly ShuttleSystem _shuttles = default!; [Dependency] private readonly StationSpawningSystem _stationSpawning = default!; diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs index aeb2ebdbba1..3f6eafb454c 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs @@ -209,7 +209,13 @@ private void UpdateEmergencyConsole(float frameTime) if (!ShuttlesLeft && _consoleAccumulator <= 0f) { ShuttlesLeft = true; - _chatSystem.DispatchGlobalAnnouncement(Loc.GetString("emergency-shuttle-left", ("transitTime", $"{TransitTime:0}"))); + _announcer.SendAnnouncement( + _announcer.GetAnnouncementId("ShuttleLeft"), + Filter.Broadcast(), + "emergency-shuttle-left", + null, null, null, null, + ("transitTime", $"{TransitTime:0}") + ); Timer.Spawn((int) (TransitTime * 1000) + _bufferTime.Milliseconds, () => _roundEnd.EndRound(), _roundEndCancelToken?.Token ?? default); } @@ -248,7 +254,13 @@ private void OnEmergencyRepealAll(EntityUid uid, EmergencyShuttleConsoleComponen return; _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch REPEAL ALL by {args.Session:user}"); - _chatSystem.DispatchGlobalAnnouncement(Loc.GetString("emergency-shuttle-console-auth-revoked", ("remaining", component.AuthorizationsRequired))); + _announcer.SendAnnouncement( + _announcer.GetAnnouncementId("ShuttleAuthRevoked"), + Filter.Broadcast(), + "emergency-shuttle-console-auth-revoked", + null, null, null, null, + ("remaining", component.AuthorizationsRequired) + ); component.AuthorizedEntities.Clear(); UpdateAllEmergencyConsoles(); } @@ -271,7 +283,13 @@ private void OnEmergencyRepeal(EntityUid uid, EmergencyShuttleConsoleComponent c _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch REPEAL by {args.Session:user}"); var remaining = component.AuthorizationsRequired - component.AuthorizedEntities.Count; - _chatSystem.DispatchGlobalAnnouncement(Loc.GetString("emergency-shuttle-console-auth-revoked", ("remaining", remaining))); + _announcer.SendAnnouncement( + _announcer.GetAnnouncementId("ShuttleAuthRevoked"), + Filter.Broadcast(), + "emergency-shuttle-console-auth-revoked", + null, null, null, null, + ("remaining", remaining) + ); CheckForLaunch(component); UpdateAllEmergencyConsoles(); } @@ -296,9 +314,14 @@ private void OnEmergencyAuthorize(EntityUid uid, EmergencyShuttleConsoleComponen var remaining = component.AuthorizationsRequired - component.AuthorizedEntities.Count; if (remaining > 0) - _chatSystem.DispatchGlobalAnnouncement( - Loc.GetString("emergency-shuttle-console-auth-left", ("remaining", remaining)), - playSound: false, colorOverride: DangerColor); + _announcer.SendAnnouncement(_announcer.GetAnnouncementId("ShuttleAuthAdded"), + Filter.Broadcast(), + "emergency-shuttle-console-auth-left", + null, + DangerColor, + null, null, + ("remaining", remaining) + ); if (!CheckForLaunch(component)) _audio.PlayGlobal("/Audio/Misc/notice1.ogg", Filter.Broadcast(), recordReplay: true); @@ -399,12 +422,13 @@ private void AnnounceLaunch() if (_announced) return; _announced = true; - _chatSystem.DispatchGlobalAnnouncement( - Loc.GetString("emergency-shuttle-launch-time", ("consoleAccumulator", $"{_consoleAccumulator:0}")), - playSound: false, - colorOverride: DangerColor); - - _audio.PlayGlobal("/Audio/Misc/notice1.ogg", Filter.Broadcast(), recordReplay: true); + _announcer.SendAnnouncement( + _announcer.GetAnnouncementId("ShuttleAlmostLaunching"), + Filter.Broadcast(), + "emergency-shuttle-launch-time", + null, null, null, null, + ("consoleAccumulator", $"{_consoleAccumulator:0}") + ); } public bool DelayEmergencyRoundEnd() diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs index f8d995b8a4b..5cbc10e4f60 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs @@ -33,6 +33,7 @@ using Robust.Shared.Player; using Robust.Shared.Random; using Robust.Shared.Timing; +using Content.Server.Announcements.Systems; namespace Content.Server.Shuttles.Systems; @@ -63,6 +64,7 @@ public sealed partial class EmergencyShuttleSystem : EntitySystem [Dependency] private readonly StationSystem _station = default!; [Dependency] private readonly TransformSystem _transformSystem = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; + [Dependency] private readonly AnnouncerSystem _announcer = default!; private const float ShuttleSpawnBuffer = 1f; @@ -268,9 +270,8 @@ public void CallEmergencyShuttle(EntityUid stationUid, StationEmergencyShuttleCo if (targetGrid == null) { _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle {ToPrettyString(stationUid)} unable to dock with station {ToPrettyString(stationUid)}"); - _chatSystem.DispatchStationAnnouncement(stationUid, Loc.GetString("emergency-shuttle-good-luck"), playDefaultSound: false); - // TODO: Need filter extensions or something don't blame me. - _audio.PlayGlobal("/Audio/Misc/notice1.ogg", Filter.Broadcast(), true); + _announcer.SendAnnouncement(_announcer.GetAnnouncementId("ShuttleGoodLuck"), Filter.Broadcast(), + "emergency-shuttle-good-luck", colorOverride: DangerColor); return; } @@ -281,7 +282,13 @@ public void CallEmergencyShuttle(EntityUid stationUid, StationEmergencyShuttleCo if (TryComp(targetGrid.Value, out var targetXform)) { var angle = _dock.GetAngle(stationShuttle.EmergencyShuttle.Value, xform, targetGrid.Value, targetXform, xformQuery); - _chatSystem.DispatchStationAnnouncement(stationUid, Loc.GetString("emergency-shuttle-docked", ("time", $"{_consoleAccumulator:0}"), ("direction", angle.GetDir())), playDefaultSound: false); + _announcer.SendAnnouncementMessage( + _announcer.GetAnnouncementId("ShuttleDock"), + "emergency-shuttle-docked", + null, null, null, null, + ("time", $"{_consoleAccumulator:0}"), + ("direction", angle.GetDir()) + ); } // shuttle timers @@ -302,20 +309,23 @@ public void CallEmergencyShuttle(EntityUid stationUid, StationEmergencyShuttleCo } _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle {ToPrettyString(stationUid)} docked with stations"); - // TODO: Need filter extensions or something don't blame me. - _audio.PlayGlobal("/Audio/Announcements/shuttle_dock.ogg", Filter.Broadcast(), true); + _announcer.SendAnnouncementAudio(_announcer.GetAnnouncementId("ShuttleDock"), Filter.Broadcast()); } else { if (TryComp(targetGrid.Value, out var targetXform)) { var angle = _dock.GetAngle(stationShuttle.EmergencyShuttle.Value, xform, targetGrid.Value, targetXform, xformQuery); - _chatSystem.DispatchStationAnnouncement(stationUid, Loc.GetString("emergency-shuttle-nearby", ("direction", angle.GetDir())), playDefaultSound: false); + _announcer.SendAnnouncementMessage( + _announcer.GetAnnouncementId("ShuttleNearby"), + "emergency-shuttle-nearby", + null, null, null, null, + ("direction", angle.GetDir()) + ); } _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle {ToPrettyString(stationUid)} unable to find a valid docking port for {ToPrettyString(stationUid)}"); - // TODO: Need filter extensions or something don't blame me. - _audio.PlayGlobal("/Audio/Misc/notice1.ogg", Filter.Broadcast(), true); + _announcer.SendAnnouncementAudio(_announcer.GetAnnouncementId("ShuttleNearby"), Filter.Broadcast()); } } @@ -492,7 +502,7 @@ private void AddEmergencyShuttle(EntityUid uid, StationEmergencyShuttleComponent return; } - centcomm.ShuttleIndex += _mapManager.GetGrid(shuttle.Value).LocalAABB.Width + ShuttleSpawnBuffer; + centcomm.ShuttleIndex += Comp(shuttle.Value).LocalAABB.Width + ShuttleSpawnBuffer; // Update indices for all centcomm comps pointing to same map var query = AllEntityQuery(); diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs index e4e4534b0c5..cb322ac3964 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs @@ -559,7 +559,7 @@ private void UpdateHyperspace(float frameTime) private float GetSoundRange(EntityUid uid) { - if (!_mapManager.TryGetGrid(uid, out var grid)) + if (!TryComp(uid, out var grid)) return 4f; return MathF.Max(grid.LocalAABB.Width, grid.LocalAABB.Height) + 12.5f; diff --git a/Content.Server/Shuttles/Systems/ThrusterSystem.cs b/Content.Server/Shuttles/Systems/ThrusterSystem.cs index 1baffd4690e..74c42ccbc53 100644 --- a/Content.Server/Shuttles/Systems/ThrusterSystem.cs +++ b/Content.Server/Shuttles/Systems/ThrusterSystem.cs @@ -1,6 +1,5 @@ using System.Numerics; using Content.Server.Audio; -using Content.Server.Construction; using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Server.Shuttles.Components; @@ -12,6 +11,7 @@ using Content.Shared.Shuttles.Components; using Content.Shared.Temperature; using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Physics.Collision.Shapes; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; @@ -24,7 +24,6 @@ namespace Content.Server.Shuttles.Systems; public sealed class ThrusterSystem : EntitySystem { [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly ITileDefinitionManager _tileDefManager = default!; [Dependency] private readonly AmbientSoundSystem _ambient = default!; [Dependency] private readonly FixtureSystem _fixtureSystem = default!; @@ -95,7 +94,7 @@ private void OnShuttleTileChange(EntityUid uid, ShuttleComponent component, ref return; var tilePos = args.NewTile.GridIndices; - var grid = _mapManager.GetGrid(uid); + var grid = Comp(uid); var xformQuery = GetEntityQuery(); var thrusterQuery = GetEntityQuery(); @@ -436,7 +435,7 @@ private bool NozzleExposed(TransformComponent xform) return true; var (x, y) = xform.LocalPosition + xform.LocalRotation.Opposite().ToWorldVec(); - var tile = _mapManager.GetGrid(xform.GridUid.Value).GetTileRef(new Vector2i((int) Math.Floor(x), (int) Math.Floor(y))); + var tile = Comp(xform.GridUid.Value).GetTileRef(new Vector2i((int) Math.Floor(x), (int) Math.Floor(y))); return tile.Tile.IsSpace(); } diff --git a/Content.Server/Silicons/Laws/SiliconLawSystem.cs b/Content.Server/Silicons/Laws/SiliconLawSystem.cs index 4584a9e88b5..010682bc0d3 100644 --- a/Content.Server/Silicons/Laws/SiliconLawSystem.cs +++ b/Content.Server/Silicons/Laws/SiliconLawSystem.cs @@ -19,7 +19,6 @@ using Content.Shared.Stunnable; using Content.Shared.Wires; using Robust.Server.GameObjects; -using Robust.Shared.Audio.Systems; using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Toolshed; @@ -38,7 +37,6 @@ public sealed class SiliconLawSystem : SharedSiliconLawSystem [Dependency] private readonly SharedStunSystem _stunSystem = default!; [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly SharedRoleSystem _roles = default!; - [Dependency] private readonly SharedAudioSystem _audioSystem = default!; /// public override void Initialize() diff --git a/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs b/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs index 7784db015d3..c74a3c49d63 100644 --- a/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs +++ b/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs @@ -232,7 +232,7 @@ public void ConsumeEntitiesInContainer(EntityUid hungry, BaseContainer container /// public void ConsumeTile(EntityUid hungry, TileRef tile, EventHorizonComponent eventHorizon) { - ConsumeTiles(hungry, new List<(Vector2i, Tile)>(new[] { (tile.GridIndices, Tile.Empty) }), tile.GridUid, _mapMan.GetGrid(tile.GridUid), eventHorizon); + ConsumeTiles(hungry, new List<(Vector2i, Tile)>(new[] { (tile.GridIndices, Tile.Empty) }), tile.GridUid, Comp(tile.GridUid), eventHorizon); } /// @@ -240,7 +240,7 @@ public void ConsumeTile(EntityUid hungry, TileRef tile, EventHorizonComponent ev /// public void AttemptConsumeTile(EntityUid hungry, TileRef tile, EventHorizonComponent eventHorizon) { - AttemptConsumeTiles(hungry, new TileRef[1] { tile }, tile.GridUid, _mapMan.GetGrid(tile.GridUid), eventHorizon); + AttemptConsumeTiles(hungry, new TileRef[1] { tile }, tile.GridUid, Comp(tile.GridUid), eventHorizon); } /// diff --git a/Content.Server/Singularity/EntitySystems/RadiationCollectorSystem.cs b/Content.Server/Singularity/EntitySystems/RadiationCollectorSystem.cs index 92b963e2017..b26ab301c64 100644 --- a/Content.Server/Singularity/EntitySystems/RadiationCollectorSystem.cs +++ b/Content.Server/Singularity/EntitySystems/RadiationCollectorSystem.cs @@ -24,7 +24,6 @@ public sealed class RadiationCollectorSystem : EntitySystem [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedContainerSystem _containerSystem = default!; [Dependency] private readonly UseDelaySystem _useDelay = default!; - [Dependency] private readonly BatterySystem _batterySystem = default!; private const string GasTankContainer = "gas_tank"; diff --git a/Content.Server/Species/Systems/NymphSystem.cs b/Content.Server/Species/Systems/NymphSystem.cs index b7751afbf18..d491b957bfb 100644 --- a/Content.Server/Species/Systems/NymphSystem.cs +++ b/Content.Server/Species/Systems/NymphSystem.cs @@ -19,10 +19,10 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnRemovedFromPart); + SubscribeLocalEvent(OnRemovedFromPart); } - private void OnRemovedFromPart(EntityUid uid, NymphComponent comp, RemovedFromPartInBodyEvent args) + private void OnRemovedFromPart(EntityUid uid, NymphComponent comp, ref OrganRemovedFromBodyEvent args) { if (!_timing.IsFirstTimePredicted) return; diff --git a/Content.Server/Speech/Components/RandomBarkComponent.cs b/Content.Server/Speech/Components/RandomBarkComponent.cs new file mode 100644 index 00000000000..7229428f538 --- /dev/null +++ b/Content.Server/Speech/Components/RandomBarkComponent.cs @@ -0,0 +1,63 @@ +namespace Content.Server.Speech.Components; + +/// +/// Sends a random message from a list with a provided min/max time. +/// +[RegisterComponent] +public sealed partial class RandomBarkComponent : Component +{ + /// + /// Should the message be sent to the chat log? + /// + [DataField] + public bool ChatLog = false; + + /// + /// Minimum time an animal will go without speaking + /// + [DataField] + public int MinTime = 45; + + /// + /// Maximum time an animal will go without speaking + /// + [DataField] + public int MaxTime = 350; + + /// + /// Accumulator for counting time since the last bark + /// + [DataField] + public float BarkAccumulator = 8f; + + /// + /// Multiplier applied to the random time. Good for changing the frequency without having to specify exact values + /// + [DataField] + public float BarkMultiplier = 1f; + + /// + /// List of things to be said. Filled with garbage to be modified by an accent, but can be specified in the .yml + /// + [DataField] + public IReadOnlyList Barks = new[] + { + "Bark", + "Boof", + "Woofums", + "Rawrl", + "Eeeeeee", + "Barkums", + "Awooooooooooooooooooo awoo awoooo", + "Grrrrrrrrrrrrrrrrrr", + "Rarrwrarrwr", + "Goddamn I love gold fish crackers", + "Bork bork boof boof bork bork boof boof boof bork", + "Bark", + "Boof", + "Woofums", + "Rawrl", + "Eeeeeee", + "Barkums", + }; +} diff --git a/Content.Server/Speech/EntitySystems/ListeningSystem.cs b/Content.Server/Speech/EntitySystems/ListeningSystem.cs index ea3569e055c..f2a625600ca 100644 --- a/Content.Server/Speech/EntitySystems/ListeningSystem.cs +++ b/Content.Server/Speech/EntitySystems/ListeningSystem.cs @@ -8,6 +8,7 @@ namespace Content.Server.Speech.EntitySystems; /// public sealed class ListeningSystem : EntitySystem { + [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly SharedTransformSystem _xforms = default!; public override void Initialize() @@ -18,10 +19,10 @@ public override void Initialize() private void OnSpeak(EntitySpokeEvent ev) { - PingListeners(ev.Source, ev.Message, ev.ObfuscatedMessage); + PingListeners(ev.Source, ev.Message, ev.IsWhisper); } - public void PingListeners(EntityUid source, string message, string? obfuscatedMessage) + public void PingListeners(EntityUid source, string message, bool isWhisper) { // TODO whispering / audio volume? Microphone sensitivity? // for now, whispering just arbitrarily reduces the listener's max range. @@ -32,7 +33,7 @@ public void PingListeners(EntityUid source, string message, string? obfuscatedMe var attemptEv = new ListenAttemptEvent(source); var ev = new ListenEvent(message, source); - var obfuscatedEv = obfuscatedMessage == null ? null : new ListenEvent(obfuscatedMessage, source); + var obfuscatedEv = !isWhisper ? null : new ListenEvent(_chat.ObfuscateMessageReadability(message), source); var query = EntityQueryEnumerator(); while(query.MoveNext(out var listenerUid, out var listener, out var xform)) diff --git a/Content.Server/Speech/Systems/RandomBarkSystem.cs b/Content.Server/Speech/Systems/RandomBarkSystem.cs new file mode 100644 index 00000000000..4fc9dd420d2 --- /dev/null +++ b/Content.Server/Speech/Systems/RandomBarkSystem.cs @@ -0,0 +1,47 @@ +using Content.Server.Chat.Systems; +using Content.Shared.Mind.Components; +using Robust.Shared.Random; +using Content.Server.Speech.Components; + +namespace Content.Server.Speech.Systems; + +public sealed class RandomBarkSystem : EntitySystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly EntityManager _entity = default!; + + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInit); + } + + + private void OnInit(EntityUid uid, RandomBarkComponent barker, ComponentInit args) + { + barker.BarkAccumulator = _random.NextFloat(barker.MinTime, barker.MaxTime) * barker.BarkMultiplier; + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var barker)) + { + barker.BarkAccumulator -= frameTime; + if (barker.BarkAccumulator > 0) + continue; + + barker.BarkAccumulator = _random.NextFloat(barker.MinTime, barker.MaxTime) * barker.BarkMultiplier; + if (_entity.TryGetComponent(uid, out var actComp) && + actComp.HasMind) + continue; + + _chat.TrySendInGameICMessage(uid, _random.Pick(barker.Barks), InGameICChatType.Speak, barker.ChatLog ? ChatTransmitRange.Normal : ChatTransmitRange.HideChat); + } + } +} diff --git a/Content.Server/Spreader/SpreaderSystem.cs b/Content.Server/Spreader/SpreaderSystem.cs index 5b2f3298a2b..671c281d1f4 100644 --- a/Content.Server/Spreader/SpreaderSystem.cs +++ b/Content.Server/Spreader/SpreaderSystem.cs @@ -18,7 +18,6 @@ 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!; diff --git a/Content.Server/Standing/LayingDownComponent.cs b/Content.Server/Standing/LayingDownComponent.cs new file mode 100644 index 00000000000..7921749f148 --- /dev/null +++ b/Content.Server/Standing/LayingDownComponent.cs @@ -0,0 +1,14 @@ +namespace Content.Server.Standing; + +[RegisterComponent] +public sealed partial class LayingDownComponent : Component +{ + [DataField] + public float DownedSpeedMultiplier = 0.15f; + + [DataField] + public TimeSpan Cooldown = TimeSpan.FromSeconds(2.5f); + + [DataField] + public TimeSpan NextToggleAttempt = TimeSpan.Zero; +} diff --git a/Content.Server/Standing/LayingDownSystem.cs b/Content.Server/Standing/LayingDownSystem.cs new file mode 100644 index 00000000000..69787ae8308 --- /dev/null +++ b/Content.Server/Standing/LayingDownSystem.cs @@ -0,0 +1,101 @@ +using Content.Shared.ActionBlocker; +using Content.Shared.Input; +using Content.Shared.Movement.Systems; +using Content.Shared.Popups; +using Content.Shared.Standing; +using Robust.Shared.Input.Binding; +using Robust.Shared.Player; +using Robust.Shared.Timing; + +namespace Content.Server.Standing; + +/// Unfortunately cannot be shared because some standing conditions are server-side only +public sealed class LayingDownSystem : EntitySystem +{ + [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!; + [Dependency] private readonly MovementSpeedModifierSystem _movement = default!; + [Dependency] private readonly SharedPopupSystem _popups = default!; + [Dependency] private readonly Shared.Standing.StandingStateSystem _standing = default!; // WHY IS THERE TWO DIFFERENT STANDING SYSTEMS?! + [Dependency] private readonly IGameTiming _timing = default!; + + + public override void Initialize() + { + CommandBinds.Builder + .Bind(ContentKeyFunctions.ToggleStanding, InputCmdHandler.FromDelegate(ToggleStanding, handle: false, outsidePrediction: false)) + .Register(); + + SubscribeLocalEvent(DoRefreshMovementSpeed); + SubscribeLocalEvent(DoRefreshMovementSpeed); + SubscribeLocalEvent(OnRefreshMovementSpeed); + SubscribeLocalEvent(OnParentChanged); + } + + public override void Shutdown() + { + base.Shutdown(); + + CommandBinds.Unregister(); + } + + private void DoRefreshMovementSpeed(EntityUid uid, LayingDownComponent component, object args) + { + _movement.RefreshMovementSpeedModifiers(uid); + } + + private void OnRefreshMovementSpeed(EntityUid uid, LayingDownComponent component, RefreshMovementSpeedModifiersEvent args) + { + if (TryComp(uid, out var standingState) && standingState.Standing) + return; + + args.ModifySpeed(component.DownedSpeedMultiplier, component.DownedSpeedMultiplier); + } + + private void OnParentChanged(EntityUid uid, LayingDownComponent component, EntParentChangedMessage args) + { + // If the entity is not on a grid, try to make it stand up to avoid issues + if (!TryComp(uid, out var standingState) + || standingState.Standing + || Transform(uid).GridUid != null) + return; + + _standing.Stand(uid, standingState); + } + + private void ToggleStanding(ICommonSession? session) + { + if (session is not { AttachedEntity: { Valid: true } uid } playerSession + || !Exists(uid) + || !TryComp(uid, out var standingState) + || !TryComp(uid, out var layingDown)) + return; + + // If successful, show popup to self and others. Otherwise, only to self. + if (ToggleStandingImpl(uid, standingState, layingDown, out var popupBranch)) + { + _popups.PopupEntity(Loc.GetString($"laying-comp-{popupBranch}-other", ("entity", uid)), uid, Filter.PvsExcept(uid), true); + layingDown.NextToggleAttempt = _timing.CurTime + layingDown.Cooldown; + } + + _popups.PopupEntity(Loc.GetString($"laying-comp-{popupBranch}-self", ("entity", uid)), uid, uid); + } + + private bool ToggleStandingImpl(EntityUid uid, StandingStateComponent standingState, LayingDownComponent layingDown, out string popupBranch) + { + var success = layingDown.NextToggleAttempt <= _timing.CurTime; + + if (_standing.IsDown(uid, standingState)) + { + success = success && _standing.Stand(uid, standingState, force: false); + popupBranch = success ? "stand-success" : "stand-fail"; + } + else + { + success = success && Transform(uid).GridUid != null; // Do not allow laying down when not on a surface. + success = success && _standing.Down(uid, standingState: standingState, playSound: true, dropHeldItems: false); + popupBranch = success ? "lay-success" : "lay-fail"; + } + + return success; + } +} diff --git a/Content.Server/Station/Systems/StationDampeningSystem.cs b/Content.Server/Station/Systems/StationDampeningSystem.cs new file mode 100644 index 00000000000..f499127031e --- /dev/null +++ b/Content.Server/Station/Systems/StationDampeningSystem.cs @@ -0,0 +1,28 @@ +using Content.Server.Station.Events; +using Content.Shared.Physics; + +namespace Content.Server.Station.Systems; + +public sealed class StationDampeningSystem : EntitySystem +{ + public override void Initialize() + { + SubscribeLocalEvent(OnInitStation); + } + + private void OnInitStation(ref StationPostInitEvent ev) + { + foreach (var grid in ev.Station.Comp.Grids) + { + // If the station grid doesn't have defined dampening, give it a small dampening by default + // This will ensure cargo tech pros won't fling the station 1000 megaparsec away from the galaxy + if (!TryComp(grid, out var dampening)) + { + dampening = AddComp(grid); + dampening.Enabled = true; + dampening.LinearDampening = 0.01f; + dampening.AngularDampening = 0.01f; + } + } + } +} diff --git a/Content.Server/Station/Systems/StationJobsSystem.cs b/Content.Server/Station/Systems/StationJobsSystem.cs index a3b7a573545..debac8902e2 100644 --- a/Content.Server/Station/Systems/StationJobsSystem.cs +++ b/Content.Server/Station/Systems/StationJobsSystem.cs @@ -25,7 +25,6 @@ public sealed partial class StationJobsSystem : EntitySystem [Dependency] private readonly IConfigurationManager _configurationManager = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly GameTicker _gameTicker = default!; - [Dependency] private readonly StationSystem _stationSystem = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; /// diff --git a/Content.Server/Station/Systems/StationSystem.cs b/Content.Server/Station/Systems/StationSystem.cs index b9ff8a4339d..492f15c8e2b 100644 --- a/Content.Server/Station/Systems/StationSystem.cs +++ b/Content.Server/Station/Systems/StationSystem.cs @@ -29,7 +29,6 @@ public sealed class StationSystem : EntitySystem { [Dependency] private readonly IConfigurationManager _configurationManager = default!; [Dependency] private readonly ILogManager _logManager = default!; - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IPlayerManager _player = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ChatSystem _chatSystem = default!; diff --git a/Content.Server/StationEvents/BasicStationEventSchedulerSystem.cs b/Content.Server/StationEvents/BasicStationEventSchedulerSystem.cs index 36d30f50eee..0243a00c9a7 100644 --- a/Content.Server/StationEvents/BasicStationEventSchedulerSystem.cs +++ b/Content.Server/StationEvents/BasicStationEventSchedulerSystem.cs @@ -4,7 +4,9 @@ using Content.Server.GameTicking.Rules.Components; using Content.Server.StationEvents.Components; using Content.Shared.Administration; +using Content.Shared.CCVar; using JetBrains.Annotations; +using Robust.Shared.Configuration; using Robust.Shared.Random; using Robust.Shared.Toolshed; using Robust.Shared.Utility; @@ -20,6 +22,7 @@ public sealed class BasicStationEventSchedulerSystem : GameRuleSystem private void ResetTimer(BasicStationEventSchedulerComponent component) { - // 5 - 25 minutes. TG does 3-10 but that's pretty frequent - component.TimeUntilNextEvent = _random.Next(300, 1500); + component.TimeUntilNextEvent = _random.Next(_config.GetCVar(CCVars.GameEventsBasicMinimumTime), + _config.GetCVar(CCVars.GameEventsBasicMaximumTime)); } } diff --git a/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs b/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs index 53bc8b62a43..282ee5b612a 100644 --- a/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs +++ b/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs @@ -3,6 +3,30 @@ [RegisterComponent, Access(typeof(RampingStationEventSchedulerSystem))] public sealed partial class RampingStationEventSchedulerComponent : Component { + /// + /// The maximum number by which the event rate will be multiplied when shift time reaches the end time. + /// + [DataField] + public float ChaosModifier = 3f; + + /// + /// The minimum number by which the event rate will be multiplied when the shift has just begun. + /// + [DataField] + public float StartingChaosRatio = 0.1f; + + /// + /// The number by which all event delays will be multiplied. Unlike chaos, remains constant throughout the shift. + /// + [DataField] + public float EventDelayModifier = 1f; + + /// + /// The number by which average expected shift length is multiplied. Higher values lead to slower chaos growth. + /// + public float ShiftLengthModifier = 1f; + + // Everything below is overridden in the RampingStationEventSchedulerSystem based on CVars [DataField("endTime"), ViewVariables(VVAccess.ReadWrite)] public float EndTime; diff --git a/Content.Server/StationEvents/Components/StationEventComponent.cs b/Content.Server/StationEvents/Components/StationEventComponent.cs index b4456a4b5b7..980034aa7b7 100644 --- a/Content.Server/StationEvents/Components/StationEventComponent.cs +++ b/Content.Server/StationEvents/Components/StationEventComponent.cs @@ -19,16 +19,10 @@ public sealed partial class StationEventComponent : Component public float Weight = WeightNormal; [DataField("startAnnouncement")] - public string? StartAnnouncement; + public bool StartAnnouncement; [DataField("endAnnouncement")] - public string? EndAnnouncement; - - [DataField("startAudio")] - public SoundSpecifier? StartAudio; - - [DataField("endAudio")] - public SoundSpecifier? EndAudio; + public bool EndAnnouncement; /// /// In minutes, when is the first round time this event can start diff --git a/Content.Server/StationEvents/Events/AnomalySpawnRule.cs b/Content.Server/StationEvents/Events/AnomalySpawnRule.cs index 48a3b900c44..4cd94d3e719 100644 --- a/Content.Server/StationEvents/Events/AnomalySpawnRule.cs +++ b/Content.Server/StationEvents/Events/AnomalySpawnRule.cs @@ -2,20 +2,29 @@ using Content.Server.GameTicking.Rules.Components; using Content.Server.Station.Components; using Content.Server.StationEvents.Components; +using Content.Server.Announcements.Systems; +using Robust.Shared.Player; namespace Content.Server.StationEvents.Events; public sealed class AnomalySpawnRule : StationEventSystem { [Dependency] private readonly AnomalySystem _anomaly = default!; + [Dependency] private readonly AnnouncerSystem _announcer = default!; protected override void Added(EntityUid uid, AnomalySpawnRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args) { base.Added(uid, component, gameRule, args); - var str = Loc.GetString("anomaly-spawn-event-announcement", - ("sighting", Loc.GetString($"anomaly-spawn-sighting-{RobustRandom.Next(1, 6)}"))); - ChatSystem.DispatchGlobalAnnouncement(str, colorOverride: Color.FromHex("#18abf5")); + _announcer.SendAnnouncement( + _announcer.GetAnnouncementId(args.RuleId), + Filter.Broadcast(), + "anomaly-spawn-event-announcement", + null, + Color.FromHex("#18abf5"), + null, null, + ("sighting", Loc.GetString($"anomaly-spawn-sighting-{RobustRandom.Next(1, 6)}")) + ); } protected override void Started(EntityUid uid, AnomalySpawnRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) diff --git a/Content.Server/StationEvents/Events/BluespaceArtifactRule.cs b/Content.Server/StationEvents/Events/BluespaceArtifactRule.cs index 0eed77f1543..b25c1d6561c 100644 --- a/Content.Server/StationEvents/Events/BluespaceArtifactRule.cs +++ b/Content.Server/StationEvents/Events/BluespaceArtifactRule.cs @@ -1,18 +1,28 @@ using Content.Server.GameTicking.Rules.Components; using Content.Server.StationEvents.Components; using Robust.Shared.Random; +using Content.Server.Announcements.Systems; +using Robust.Shared.Player; namespace Content.Server.StationEvents.Events; public sealed class BluespaceArtifactRule : StationEventSystem { + [Dependency] private readonly AnnouncerSystem _announcer = default!; + protected override void Added(EntityUid uid, BluespaceArtifactRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args) { base.Added(uid, component, gameRule, args); - var str = Loc.GetString("bluespace-artifact-event-announcement", - ("sighting", Loc.GetString(RobustRandom.Pick(component.PossibleSighting)))); - ChatSystem.DispatchGlobalAnnouncement(str, colorOverride: Color.FromHex("#18abf5")); + _announcer.SendAnnouncement( + _announcer.GetAnnouncementId(args.RuleId), + Filter.Broadcast(), + "bluespace-artifact-event-announcement", + null, + Color.FromHex("#18abf5"), + null, null, + ("sighting", Loc.GetString(RobustRandom.Pick(component.PossibleSighting))) + ); } protected override void Started(EntityUid uid, BluespaceArtifactRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) diff --git a/Content.Server/StationEvents/Events/BreakerFlipRule.cs b/Content.Server/StationEvents/Events/BreakerFlipRule.cs index 494779fe350..b465cc1f556 100644 --- a/Content.Server/StationEvents/Events/BreakerFlipRule.cs +++ b/Content.Server/StationEvents/Events/BreakerFlipRule.cs @@ -4,6 +4,8 @@ using Content.Server.Station.Components; using Content.Server.StationEvents.Components; using JetBrains.Annotations; +using Content.Server.Announcements.Systems; +using Robust.Shared.Player; namespace Content.Server.StationEvents.Events; @@ -11,13 +13,21 @@ namespace Content.Server.StationEvents.Events; public sealed class BreakerFlipRule : StationEventSystem { [Dependency] private readonly ApcSystem _apcSystem = default!; + [Dependency] private readonly AnnouncerSystem _announcer = default!; protected override void Added(EntityUid uid, BreakerFlipRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args) { base.Added(uid, component, gameRule, args); - var str = Loc.GetString("station-event-breaker-flip-announcement", ("data", Loc.GetString(Loc.GetString($"random-sentience-event-data-{RobustRandom.Next(1, 6)}")))); - ChatSystem.DispatchGlobalAnnouncement(str, playSound: false, colorOverride: Color.Gold); + _announcer.SendAnnouncement( + _announcer.GetAnnouncementId(args.RuleId), + Filter.Broadcast(), + "station-event-breaker-flip-announcement", + null, + Color.Gold, + null, null, + ("data", Loc.GetString(Loc.GetString($"random-sentience-event-data-{RobustRandom.Next(1, 6)}"))) + ); } protected override void Started(EntityUid uid, BreakerFlipRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) diff --git a/Content.Server/StationEvents/Events/CargoGiftsRule.cs b/Content.Server/StationEvents/Events/CargoGiftsRule.cs index c174cc48c09..80af23c6fa4 100644 --- a/Content.Server/StationEvents/Events/CargoGiftsRule.cs +++ b/Content.Server/StationEvents/Events/CargoGiftsRule.cs @@ -6,6 +6,8 @@ using Content.Server.Station.Components; using Content.Server.StationEvents.Components; using Robust.Shared.Prototypes; +using Content.Server.Announcements.Systems; +using Robust.Shared.Player; namespace Content.Server.StationEvents.Events; @@ -14,14 +16,23 @@ public sealed class CargoGiftsRule : StationEventSystem [Dependency] private readonly CargoSystem _cargoSystem = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly GameTicker _ticker = default!; + [Dependency] private readonly AnnouncerSystem _announcer = default!; protected override void Added(EntityUid uid, CargoGiftsRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args) { base.Added(uid, component, gameRule, args); - var str = Loc.GetString(component.Announce, - ("sender", Loc.GetString(component.Sender)), ("description", Loc.GetString(component.Description)), ("dest", Loc.GetString(component.Dest))); - ChatSystem.DispatchGlobalAnnouncement(str, colorOverride: Color.FromHex("#18abf5")); + _announcer.SendAnnouncement( + _announcer.GetAnnouncementId(args.RuleId), + Filter.Broadcast(), + component.Announce, + null, + Color.FromHex("#18abf5"), + null, null, + ("sender", Loc.GetString(component.Sender)), + ("description", Loc.GetString(component.Description)), + ("dest", Loc.GetString(component.Dest)) + ); } /// diff --git a/Content.Server/StationEvents/Events/FalseAlarmRule.cs b/Content.Server/StationEvents/Events/FalseAlarmRule.cs index 05e9435b40a..e971a0aa982 100644 --- a/Content.Server/StationEvents/Events/FalseAlarmRule.cs +++ b/Content.Server/StationEvents/Events/FalseAlarmRule.cs @@ -4,6 +4,7 @@ using JetBrains.Annotations; using Robust.Shared.Player; using Robust.Shared.Random; +using Content.Server.Announcements.Systems; namespace Content.Server.StationEvents.Events; @@ -11,18 +12,20 @@ namespace Content.Server.StationEvents.Events; public sealed class FalseAlarmRule : StationEventSystem { [Dependency] private readonly EventManagerSystem _event = default!; + [Dependency] private readonly AnnouncerSystem _announcer = default!; protected override void Started(EntityUid uid, FalseAlarmRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) { base.Started(uid, component, gameRule, args); - var allEv = _event.AllEvents().Select(p => p.Value).ToList(); + var allEv = _event.AllEvents().Select(p => p.Key).ToList(); var picked = RobustRandom.Pick(allEv); - if (picked.StartAnnouncement != null) - { - ChatSystem.DispatchGlobalAnnouncement(Loc.GetString(picked.StartAnnouncement), playSound: false, colorOverride: Color.Gold); - } - Audio.PlayGlobal(picked.StartAudio, Filter.Broadcast(), true); + _announcer.SendAnnouncement( + _announcer.GetAnnouncementId(picked.ID), + Filter.Broadcast(), + _announcer.GetEventLocaleString(_announcer.GetAnnouncementId(picked.ID)), + colorOverride: Color.Gold + ); } } diff --git a/Content.Server/StationEvents/Events/MassHallucinationsRule.cs b/Content.Server/StationEvents/Events/MassHallucinationsRule.cs index 722a489541f..4fc158f8646 100644 --- a/Content.Server/StationEvents/Events/MassHallucinationsRule.cs +++ b/Content.Server/StationEvents/Events/MassHallucinationsRule.cs @@ -2,7 +2,7 @@ using Content.Server.StationEvents.Components; using Content.Server.Traits.Assorted; using Content.Shared.Mind.Components; -using Content.Shared.Traits.Assorted; +using Content.Shared.Traits.Assorted.Components; namespace Content.Server.StationEvents.Events; diff --git a/Content.Server/StationEvents/Events/NinjaSpawnRule.cs b/Content.Server/StationEvents/Events/NinjaSpawnRule.cs index c60f3298e74..8ad5c8602e3 100644 --- a/Content.Server/StationEvents/Events/NinjaSpawnRule.cs +++ b/Content.Server/StationEvents/Events/NinjaSpawnRule.cs @@ -2,10 +2,8 @@ using Content.Server.Ninja.Systems; using Content.Server.Station.Components; using Content.Server.StationEvents.Components; -using Robust.Server.GameObjects; using Robust.Shared.Map; using Robust.Shared.Map.Components; -using Robust.Shared.Random; namespace Content.Server.StationEvents.Events; @@ -14,7 +12,6 @@ namespace Content.Server.StationEvents.Events; /// public sealed class NinjaSpawnRule : StationEventSystem { - [Dependency] private readonly SpaceNinjaSystem _ninja = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; protected override void Started(EntityUid uid, NinjaSpawnRuleComponent comp, GameRuleComponent gameRule, GameRuleStartedEvent args) diff --git a/Content.Server/StationEvents/Events/PowerGridCheckRule.cs b/Content.Server/StationEvents/Events/PowerGridCheckRule.cs index 5503438df8a..97e89484612 100644 --- a/Content.Server/StationEvents/Events/PowerGridCheckRule.cs +++ b/Content.Server/StationEvents/Events/PowerGridCheckRule.cs @@ -54,13 +54,6 @@ protected override void Ended(EntityUid uid, PowerGridCheckRuleComponent compone } } - // Can't use the default EndAudio - component.AnnounceCancelToken?.Cancel(); - component.AnnounceCancelToken = new CancellationTokenSource(); - Timer.Spawn(3000, () => - { - Audio.PlayGlobal("/Audio/Announcements/power_on.ogg", Filter.Broadcast(), true, AudioParams.Default.WithVolume(-4f)); - }, component.AnnounceCancelToken.Token); component.Unpowered.Clear(); } diff --git a/Content.Server/StationEvents/Events/RandomSentienceRule.cs b/Content.Server/StationEvents/Events/RandomSentienceRule.cs index 4b7606d01f9..f667ad79750 100644 --- a/Content.Server/StationEvents/Events/RandomSentienceRule.cs +++ b/Content.Server/StationEvents/Events/RandomSentienceRule.cs @@ -2,11 +2,15 @@ using Content.Server.GameTicking.Rules.Components; using Content.Server.Ghost.Roles.Components; using Content.Server.StationEvents.Components; +using Content.Server.Announcements.Systems; +using Content.Server.Station.Components; namespace Content.Server.StationEvents.Events; public sealed class RandomSentienceRule : StationEventSystem { + [Dependency] private readonly AnnouncerSystem _announcer = default!; + protected override void Started(EntityUid uid, RandomSentienceRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) { HashSet stationsToNotify = new(); @@ -53,14 +57,16 @@ protected override void Started(EntityUid uid, RandomSentienceRuleComponent comp } foreach (var station in stationsToNotify) { - ChatSystem.DispatchStationAnnouncement( - station, - Loc.GetString("station-event-random-sentience-announcement", - ("kind1", kind1), ("kind2", kind2), ("kind3", kind3), ("amount", groupList.Count), + _announcer.SendAnnouncement( + _announcer.GetAnnouncementId(args.RuleId), + StationSystem.GetInStation(EntityManager.GetComponent(station)), + "station-event-random-sentience-announcement", + null, + Color.Gold, + null, null, + ("kind1", kind1), ("kind2", kind2), ("kind3", kind3), ("amount", groupList.Count), ("data", Loc.GetString($"random-sentience-event-data-{RobustRandom.Next(1, 6)}")), - ("strength", Loc.GetString($"random-sentience-event-strength-{RobustRandom.Next(1, 8)}"))), - playDefaultSound: false, - colorOverride: Color.Gold + ("strength", Loc.GetString($"random-sentience-event-strength-{RobustRandom.Next(1, 8)}")) ); } } diff --git a/Content.Server/StationEvents/Events/StationEventSystem.cs b/Content.Server/StationEvents/Events/StationEventSystem.cs index 7f05f8940d9..6de8024bd0a 100644 --- a/Content.Server/StationEvents/Events/StationEventSystem.cs +++ b/Content.Server/StationEvents/Events/StationEventSystem.cs @@ -9,6 +9,9 @@ using Robust.Shared.Map; using Robust.Shared.Player; using Robust.Shared.Prototypes; +using Content.Server.Announcements.Systems; +using Robust.Shared.Player; +using Content.Server.Station.Components; namespace Content.Server.StationEvents.Events; @@ -23,6 +26,7 @@ public abstract class StationEventSystem : GameRuleSystem where T : ICompo [Dependency] protected readonly ChatSystem ChatSystem = default!; [Dependency] protected readonly SharedAudioSystem Audio = default!; [Dependency] protected readonly StationSystem StationSystem = default!; + [Dependency] private readonly AnnouncerSystem _announcer = default!; protected ISawmill Sawmill = default!; @@ -43,12 +47,6 @@ protected override void Added(EntityUid uid, T component, GameRuleComponent game AdminLogManager.Add(LogType.EventAnnounced, $"Event added / announced: {ToPrettyString(uid)}"); - if (stationEvent.StartAnnouncement != null) - { - ChatSystem.DispatchGlobalAnnouncement(Loc.GetString(stationEvent.StartAnnouncement), playSound: false, colorOverride: Color.Gold); - } - - Audio.PlayGlobal(stationEvent.StartAudio, Filter.Broadcast(), true); stationEvent.StartTime = Timing.CurTime + stationEvent.StartDelay; } @@ -62,6 +60,16 @@ protected override void Started(EntityUid uid, T component, GameRuleComponent ga AdminLogManager.Add(LogType.EventStarted, LogImpact.High, $"Event started: {ToPrettyString(uid)}"); + if (stationEvent.StartAnnouncement) + { + _announcer.SendAnnouncement( + _announcer.GetAnnouncementId(args.RuleId), + Filter.Broadcast(), + _announcer.GetEventLocaleString(_announcer.GetAnnouncementId(args.RuleId)), + colorOverride: Color.Gold + ); + } + if (stationEvent.Duration != null) { var duration = stationEvent.MaxDuration == null @@ -82,12 +90,14 @@ protected override void Ended(EntityUid uid, T component, GameRuleComponent game AdminLogManager.Add(LogType.EventStopped, $"Event ended: {ToPrettyString(uid)}"); - if (stationEvent.EndAnnouncement != null) + if (stationEvent.EndAnnouncement) { - ChatSystem.DispatchGlobalAnnouncement(Loc.GetString(stationEvent.EndAnnouncement), playSound: false, colorOverride: Color.Gold); + _announcer.SendAnnouncement( + _announcer.GetAnnouncementId(args.RuleId, true), + Filter.Broadcast(), + _announcer.GetEventLocaleString(_announcer.GetAnnouncementId(args.RuleId, true)), + colorOverride: Color.Gold); } - - Audio.PlayGlobal(stationEvent.EndAudio, Filter.Broadcast(), true); } /// diff --git a/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs b/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs index ef3b5cf18a7..aa0c9b214b4 100644 --- a/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs +++ b/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs @@ -29,15 +29,15 @@ protected override void Started(EntityUid uid, RampingStationEventSchedulerCompo { base.Started(uid, component, gameRule, args); - var avgChaos = _cfg.GetCVar(CCVars.EventsRampingAverageChaos); - var avgTime = _cfg.GetCVar(CCVars.EventsRampingAverageEndTime); + var avgChaos = _cfg.GetCVar(CCVars.EventsRampingAverageChaos) * component.ChaosModifier; + var avgTime = _cfg.GetCVar(CCVars.EventsRampingAverageEndTime) * component.ShiftLengthModifier; // Worlds shittiest probability distribution // Got a complaint? Send them to - component.MaxChaos = _random.NextFloat(avgChaos - avgChaos / 4, avgChaos + avgChaos / 4); + component.MaxChaos = avgChaos * _random.NextFloat(0.75f, 1.25f); // This is in minutes, so *60 for seconds (for the chaos calc) - component.EndTime = _random.NextFloat(avgTime - avgTime / 4, avgTime + avgTime / 4) * 60f; - component.StartingChaos = component.MaxChaos / 10; + component.EndTime = avgTime * _random.NextFloat(0.75f, 1.25f) * 60f; + component.StartingChaos = component.MaxChaos * component.StartingChaosRatio; PickNextEventTime(uid, component); } @@ -68,9 +68,10 @@ public override void Update(float frameTime) private void PickNextEventTime(EntityUid uid, RampingStationEventSchedulerComponent component) { - var mod = GetChaosModifier(uid, component); + component.TimeUntilNextEvent = _random.NextFloat( + _cfg.GetCVar(CCVars.GameEventsRampingMinimumTime), + _cfg.GetCVar(CCVars.GameEventsRampingMaximumTime)); - // 4-12 minutes baseline. Will get faster over time as the chaos mod increases. - component.TimeUntilNextEvent = _random.NextFloat(240f / mod, 720f / mod); + component.TimeUntilNextEvent *= component.EventDelayModifier / GetChaosModifier(uid, component); } } diff --git a/Content.Server/StationGoal/StationGoalCommand.cs b/Content.Server/StationGoal/StationGoalCommand.cs new file mode 100644 index 00000000000..1c82509d691 --- /dev/null +++ b/Content.Server/StationGoal/StationGoalCommand.cs @@ -0,0 +1,55 @@ +using System.Linq; +using Content.Server.Administration; +using Content.Shared.Administration; +using Robust.Shared.Console; +using Robust.Shared.Prototypes; + +namespace Content.Server.StationGoal +{ + [AdminCommand(AdminFlags.Fun)] + public sealed class StationGoalCommand : IConsoleCommand + { + public string Command => "sendstationgoal"; + public string Description => Loc.GetString("send-station-goal-command-description"); + public string Help => Loc.GetString("send-station-goal-command-help-text", ("command", Command)); + + public void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (args.Length != 1) + { + shell.WriteError(Loc.GetString("shell-need-exactly-one-argument")); + return; + } + + var protoId = args[0]; + var prototypeManager = IoCManager.Resolve(); + if (!prototypeManager.TryIndex(protoId, out var proto)) + { + shell.WriteError(Loc.GetString("send-station-goal-command-error-no-goal-proto", ("id", protoId))); + return; + } + + var stationGoalPaper = IoCManager.Resolve().System(); + if (!stationGoalPaper.SendStationGoal(proto)) + { + shell.WriteError(Loc.GetString("send-station-goal-command-error-couldnt-fax")); + return; + } + } + + public CompletionResult GetCompletion(IConsoleShell shell, string[] args) + { + if (args.Length == 1) + { + var options = IoCManager.Resolve() + .EnumeratePrototypes() + .OrderBy(p => p.ID) + .Select(p => new CompletionOption(p.ID)); + + return CompletionResult.FromHintOptions(options, Loc.GetString("send-station-goal-command-arg-id")); + } + + return CompletionResult.Empty; + } + } +} diff --git a/Content.Server/StationGoal/StationGoalPaperComponent.cs b/Content.Server/StationGoal/StationGoalPaperComponent.cs new file mode 100644 index 00000000000..445b4746818 --- /dev/null +++ b/Content.Server/StationGoal/StationGoalPaperComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Server.StationGoal +{ + /// + /// Paper with a written station goal in it. + /// + [RegisterComponent] + public sealed partial class StationGoalPaperComponent : Component { } +} + diff --git a/Content.Server/StationGoal/StationGoalPaperSystem.cs b/Content.Server/StationGoal/StationGoalPaperSystem.cs new file mode 100644 index 00000000000..6a059c37a3d --- /dev/null +++ b/Content.Server/StationGoal/StationGoalPaperSystem.cs @@ -0,0 +1,118 @@ +using System.Text.RegularExpressions; +using Content.Server.GameTicking; +using Content.Server.Fax; +using Content.Server.Station.Systems; +using Content.Shared.CCVar; +using Content.Shared.Random; +using Content.Shared.Random.Helpers; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; +using Content.Shared.Dataset; + +namespace Content.Server.StationGoal; + +/// +/// System for station goals +/// +public sealed class StationGoalPaperSystem : EntitySystem +{ + [Dependency] private readonly IPrototypeManager _prototype = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly FaxSystem _fax = default!; + [Dependency] private readonly IConfigurationManager _config = default!; + [Dependency] private readonly StationSystem _station = default!; + + private static readonly Regex StationIdRegex = new(@".*-(\d+)$"); + + [ValidatePrototypeId] + private const string RandomPrototype = "StationGoals"; + [ValidatePrototypeId] + private const string RandomSignature = "names_last"; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnRoundStarted); + } + + + private void OnRoundStarted(RoundStartedEvent ev) + { + if (_config.GetCVar(CCVars.StationGoalsEnabled) + && _random.Prob(_config.GetCVar(CCVars.StationGoalsChance))) + SendRandomGoal(); + } + + /// + /// Send a random station goal to all faxes which are authorized to receive it + /// + /// If the fax was successful + /// Raised when station goal types in the prototype is invalid + public bool SendRandomGoal() + { + // Get the random station goal list + if (!_prototype.TryIndex(RandomPrototype, out var goals)) + { + Log.Error($"StationGoalPaperSystem: Random station goal prototype '{RandomPrototype}' not found"); + return false; + } + + // Get a random goal + var goal = RecursiveRandom(goals); + + // Send the goal + return SendStationGoal(goal); + } + + private StationGoalPrototype RecursiveRandom(WeightedRandomPrototype random) + { + var goal = random.Pick(_random); + + if (_prototype.TryIndex(goal, out var goalPrototype)) + return goalPrototype; + + if (_prototype.TryIndex(goal, out var goalRandom)) + return RecursiveRandom(goalRandom); + + throw new Exception($"StationGoalPaperSystem: Random station goal could not be found from prototypes {RandomPrototype} and {random.ID}"); + } + + /// + /// Send a station goal to all faxes which are authorized to receive it + /// + /// True if at least one fax received paper + public bool SendStationGoal(StationGoalPrototype goal) + { + var enumerator = EntityManager.EntityQueryEnumerator(); + var wasSent = false; + var signerName = _prototype.Index(RandomSignature); + + while (enumerator.MoveNext(out var uid, out var fax)) + { + if (!fax.ReceiveStationGoal + || !TryComp(_station.GetOwningStation(uid), out var meta)) + continue; + + var stationId = StationIdRegex.Match(meta.EntityName).Groups[1].Value; + + var printout = new FaxPrintout( + Loc.GetString("station-goal-fax-paper-header", + ("date", DateTime.Now.AddYears(1000).ToString("yyyy MMMM dd")), + ("station", string.IsNullOrEmpty(stationId) ? "???" : stationId), + ("content", goal.Text), + ("name", _random.Pick(signerName.Values)) + ), + Loc.GetString("station-goal-fax-paper-name"), + "StationGoalPaper" + ); + + _fax.Receive(uid, printout, null, fax); + + wasSent = true; + } + + return wasSent; + } +} diff --git a/Content.Server/StationGoal/StationGoalPrototype.cs b/Content.Server/StationGoal/StationGoalPrototype.cs new file mode 100644 index 00000000000..733759a37df --- /dev/null +++ b/Content.Server/StationGoal/StationGoalPrototype.cs @@ -0,0 +1,12 @@ +using Robust.Shared.Prototypes; + +namespace Content.Server.StationGoal +{ + [Serializable, Prototype("stationGoal")] + public sealed class StationGoalPrototype : IPrototype + { + [IdDataFieldAttribute] public string ID { get; } = default!; + + public string Text => Loc.GetString($"station-goal-{ID.ToLower()}"); + } +} diff --git a/Content.Server/Strip/StrippableSystem.cs b/Content.Server/Strip/StrippableSystem.cs index 96b2ecc00c6..686570f7dca 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,19 +20,23 @@ 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!; + [Dependency] private readonly ThievingSystem _thieving = default!; // TODO: ECS popups. Not all of these have ECS equivalents yet. @@ -48,64 +51,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 +120,528 @@ 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; - bool Check() + 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; + } + + 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); + + bool hidden = stealth == ThievingStealth.Hidden; + + if (!hidden) + StripPopup("strippable-component-alert-owner-insert", stealth, target, user: Identity.Entity(user, EntityManager), item: user.Comp.ActiveHandEntity!.Value); + + var prefix = hidden ? "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 = hidden, AttemptFrequency = AttemptFrequency.EveryTick, BreakOnDamage = true, BreakOnTargetMove = true, BreakOnUserMove = 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; + + if (!CanStripInsertInventory(user, target, held, slot)) + return; - var result = await _doAfter.WaitDoAfter(doAfterArgs); - if (result != DoAfterStatus.Finished) + if (!_handsSystem.TryDrop(user, handsComp: user.Comp)) return; - DebugTools.Assert(userHands.ActiveHand?.HeldEntity == held); + _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; + } + + if (slotItem != item) + 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 (!_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 hidden = stealth == ThievingStealth.Hidden; - bool Check() + if (!hidden) { - 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) + StripPopup("strippable-component-alert-owner-hidden", stealth, target, slot: slot); + else + StripPopup("strippable-component-alert-owner", stealth, target, user: Identity.Entity(user, EntityManager), item: item); } - var userEv = new BeforeStripEvent(component.HandStripDelay); - RaiseLocalEvent(user, userEv); - var ev = new BeforeGettingStrippedEvent(userEv.Time, userEv.Stealth); - RaiseLocalEvent(target, ev); + var prefix = hidden ? "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 = hidden, AttemptFrequency = AttemptFrequency.EveryTick, BreakOnDamage = true, BreakOnTargetMove = true, BreakOnUserMove = 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 hidden) + { + 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: hidden, animate: hidden); + _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); + + bool hidden = stealth == ThievingStealth.Hidden; - var doAfterArgs = new DoAfterArgs(EntityManager, user, ev.Time, new AwaitedDoAfterEvent(), null, target: target, used: item) + var prefix = hidden ? "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 = hidden, AttemptFrequency = AttemptFrequency.EveryTick, BreakOnDamage = true, BreakOnTargetMove = true, BreakOnUserMove = 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 hidden) + { + 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: hidden, animate: hidden, 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; + + if (!_handsSystem.TryGetHand(target, handName, out var handSlot, target.Comp)) + { + _popupSystem.PopupCursor(Loc.GetString("strippable-component-item-slot-free-message", ("owner", target)), user); + return false; + } - bool Check() + if (HasComp(handSlot.HeldEntity)) + return false; + + if (handSlot.HeldEntity == null) + return false; + + if (handSlot.HeldEntity != item) + return false; + + if (!_handsSystem.CanDropHeld(target, handSlot, false)) { - 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-cannot-drop-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); + 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); + + bool hidden = stealth == ThievingStealth.Hidden; + + if (!hidden) + StripPopup("strippable-component-alert-owner", stealth, target, user: Identity.Entity(user, EntityManager), item: item); - var doAfterArgs = new DoAfterArgs(EntityManager, user, ev.Time, new AwaitedDoAfterEvent(), null, target: target, used: item) + var prefix = hidden ? "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) { - ExtraCheck = Check, - Hidden = ev.Stealth, + Hidden = hidden, AttemptFrequency = AttemptFrequency.EveryTick, BreakOnDamage = true, BreakOnTargetMove = true, BreakOnUserMove = 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 hidden) + { + 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: hidden, animate: hidden, 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/SubFloor/SubFloorHideSystem.cs b/Content.Server/SubFloor/SubFloorHideSystem.cs index 7820badcebf..2767f500f9a 100644 --- a/Content.Server/SubFloor/SubFloorHideSystem.cs +++ b/Content.Server/SubFloor/SubFloorHideSystem.cs @@ -1,5 +1,6 @@ using Content.Shared.Construction.Components; using Content.Shared.SubFloor; +using Robust.Shared.Map.Components; namespace Content.Server.SubFloor; @@ -17,7 +18,7 @@ private void OnAnchorAttempt(EntityUid uid, SubFloorHideComponent component, Anc // No teleporting entities through floor tiles when anchoring them. var xform = Transform(uid); - if (MapManager.TryGetGrid(xform.GridUid, out var grid) + if (TryComp(xform.GridUid, out var grid) && HasFloorCover(grid, grid.TileIndicesFor(xform.Coordinates))) { args.Cancel(); diff --git a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSpeakerSystem.cs b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSpeakerSystem.cs index 7544fc376ba..0e694a801eb 100644 --- a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSpeakerSystem.cs +++ b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSpeakerSystem.cs @@ -1,10 +1,7 @@ using Content.Server.Chat.Systems; using Content.Server.Speech; using Content.Shared.Speech; -using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; -using Robust.Shared.Prototypes; -using Robust.Shared.Random; using Robust.Shared.Timing; namespace Content.Server.SurveillanceCamera; @@ -18,8 +15,6 @@ public sealed class SurveillanceCameraSpeakerSystem : EntitySystem [Dependency] private readonly SpeechSoundSystem _speechSound = default!; [Dependency] private readonly ChatSystem _chatSystem = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly IRobustRandom _random = default!; /// public override void Initialize() diff --git a/Content.Server/Temperature/Systems/TemperatureSystem.cs b/Content.Server/Temperature/Systems/TemperatureSystem.cs index aef4b89d509..0f57da4b881 100644 --- a/Content.Server/Temperature/Systems/TemperatureSystem.cs +++ b/Content.Server/Temperature/Systems/TemperatureSystem.cs @@ -11,7 +11,6 @@ using Content.Shared.Inventory; using Content.Shared.Rejuvenate; using Content.Shared.Temperature; -using Robust.Server.GameObjects; using Robust.Shared.Physics.Components; namespace Content.Server.Temperature.Systems; @@ -22,7 +21,6 @@ public sealed class TemperatureSystem : EntitySystem [Dependency] private readonly AtmosphereSystem _atmosphere = default!; [Dependency] private readonly DamageableSystem _damageable = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; - [Dependency] private readonly TransformSystem _transform = default!; /// /// All the components that will have their damage updated at the end of the tick. @@ -163,8 +161,9 @@ public float GetHeatCapacity(EntityUid uid, TemperatureComponent? comp = null, P { return Atmospherics.MinimumHeatCapacity; } - - return comp.SpecificHeat * physics.FixturesMass; + if (physics.Mass < 1) + return comp.SpecificHeat; + else return comp.SpecificHeat * physics.FixturesMass; } private void OnInit(EntityUid uid, InternalTemperatureComponent comp, MapInitEvent args) diff --git a/Content.Server/Tiles/LavaSystem.cs b/Content.Server/Tiles/LavaSystem.cs index 7aee0b65010..51bd6f8475f 100644 --- a/Content.Server/Tiles/LavaSystem.cs +++ b/Content.Server/Tiles/LavaSystem.cs @@ -11,7 +11,7 @@ public sealed class LavaSystem : EntitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnLavaStepTriggered); + SubscribeLocalEvent(OnLavaStepTriggered); SubscribeLocalEvent(OnLavaStepTriggerAttempt); } @@ -23,7 +23,7 @@ private void OnLavaStepTriggerAttempt(EntityUid uid, LavaComponent component, re args.Continue = true; } - private void OnLavaStepTriggered(EntityUid uid, LavaComponent component, ref StepTriggeredEvent args) + private void OnLavaStepTriggered(EntityUid uid, LavaComponent component, ref StepTriggeredOffEvent args) { var otherUid = args.Tripper; diff --git a/Content.Server/Traits/Assorted/ForeignerTraitComponent.cs b/Content.Server/Traits/Assorted/ForeignerTraitComponent.cs new file mode 100644 index 00000000000..756f44e7429 --- /dev/null +++ b/Content.Server/Traits/Assorted/ForeignerTraitComponent.cs @@ -0,0 +1,38 @@ +using Content.Shared.Language; +using Content.Shared.Language.Systems; +using Robust.Shared.Prototypes; + +namespace Content.Server.Traits.Assorted; + +/// +/// When applied to a not-yet-spawned player entity, removes from the lists of their languages +/// and gives them a translator instead. +/// +[RegisterComponent] +public sealed partial class ForeignerTraitComponent : Component +{ + /// + /// The "base" language that is to be removed and substituted with a translator. + /// By default, equals to the fallback language, which is GalacticCommon. + /// + [DataField] + public ProtoId BaseLanguage = SharedLanguageSystem.FallbackLanguagePrototype; + + /// + /// Whether this trait prevents the entity from understanding the base language. + /// + [DataField] + public bool CantUnderstand = true; + + /// + /// Whether this trait prevents the entity from speaking the base language. + /// + [DataField] + public bool CantSpeak = true; + + /// + /// The base translator prototype to use when creating a translator for the entity. + /// + [DataField(required: true)] + public ProtoId BaseTranslator = default!; +} diff --git a/Content.Server/Traits/Assorted/ForeignerTraitSystem.cs b/Content.Server/Traits/Assorted/ForeignerTraitSystem.cs new file mode 100644 index 00000000000..58e974227ce --- /dev/null +++ b/Content.Server/Traits/Assorted/ForeignerTraitSystem.cs @@ -0,0 +1,105 @@ +using System.Linq; +using Content.Server.Hands.Systems; +using Content.Server.Language; +using Content.Server.Storage.EntitySystems; +using Content.Shared.Clothing.Components; +using Content.Shared.Inventory; +using Content.Shared.Language; +using Content.Shared.Language.Components; +using Content.Shared.Language.Components.Translators; +using Content.Shared.Storage; +using Robust.Shared.Prototypes; + +namespace Content.Server.Traits.Assorted; + + +public sealed partial class ForeignerTraitSystem : EntitySystem +{ + [Dependency] private readonly EntityManager _entMan = default!; + [Dependency] private readonly HandsSystem _hands = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly LanguageSystem _languages = default!; + [Dependency] private readonly StorageSystem _storage = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnSpawn); // TraitSystem adds it after PlayerSpawnCompleteEvent so it's fine + } + + private void OnSpawn(Entity entity, ref ComponentInit args) + { + if (entity.Comp.CantUnderstand && !entity.Comp.CantSpeak) + Log.Warning($"Allowing entity {entity.Owner} to speak a language but not understand it leads to undefined behavior."); + + if (!TryComp(entity, out var knowledge)) + { + Log.Warning($"Entity {entity.Owner} does not have a LanguageKnowledge but has a ForeignerTrait!"); + return; + } + + var alternateLanguage = knowledge.SpokenLanguages.Find(it => it != entity.Comp.BaseLanguage); + if (alternateLanguage == null) + { + Log.Warning($"Entity {entity.Owner} does not have an alternative language to choose from (must have at least one non-GC for ForeignerTrait)!"); + return; + } + + if (TryGiveTranslator(entity.Owner, entity.Comp.BaseTranslator, entity.Comp.BaseLanguage, alternateLanguage, out var translator)) + { + _languages.RemoveLanguage(entity, entity.Comp.BaseLanguage, entity.Comp.CantSpeak, entity.Comp.CantUnderstand, knowledge); + } + } + + /// + /// Tries to create and give the entity a translator to translator that translates speech between the two specified languages. + /// + public bool TryGiveTranslator( + EntityUid uid, + string baseTranslatorPrototype, + ProtoId translatorLanguage, + ProtoId entityLanguage, + out EntityUid result) + { + result = EntityUid.Invalid; + if (translatorLanguage == entityLanguage) + return false; + + var translator = _entMan.SpawnNextToOrDrop(baseTranslatorPrototype, uid); + result = translator; + + if (!TryComp(translator, out var handheld)) + { + handheld = AddComp(translator); + handheld.ToggleOnInteract = true; + handheld.SetLanguageOnInteract = true; + } + + // Allows to speak the specified language and requires entities language. + handheld.SpokenLanguages = [translatorLanguage]; + handheld.UnderstoodLanguages = [translatorLanguage]; + handheld.RequiredLanguages = [entityLanguage]; + + // Try to put it in entities hand + if (_hands.TryPickupAnyHand(uid, translator, false, false, false)) + return true; + + // Try to find a valid clothing slot on the entity and equip the translator there + if (TryComp(translator, out var clothing) + && clothing.Slots != SlotFlags.NONE + && _inventory.TryGetSlots(uid, out var slots) + && slots.Any(it => _inventory.TryEquip(uid, translator, it.Name, true, false))) + return true; + + // Try to put the translator into entities bag, if it has one + if (_inventory.TryGetSlotEntity(uid, "back", out var bag) + && TryComp(bag, out var storage) + && _storage.Insert(bag.Value, translator, out _, null, storage, false, false)) + return true; + + // If all of the above has failed, just drop it at the same location as the entity + // This should ideally never happen, but who knows. + Transform(translator).Coordinates = Transform(uid).Coordinates; + + return true; + } +} diff --git a/Content.Server/Traits/Assorted/LightweightDrunkComponent.cs b/Content.Server/Traits/Assorted/LightweightDrunkComponent.cs new file mode 100644 index 00000000000..4daff2e1338 --- /dev/null +++ b/Content.Server/Traits/Assorted/LightweightDrunkComponent.cs @@ -0,0 +1,11 @@ +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// Used for the lightweight trait. LightweightDrunkSystem will multiply the effects of ethanol being metabolized +/// +[RegisterComponent] +public sealed partial class LightweightDrunkComponent : Component +{ + [DataField("boozeStrengthMultiplier"), ViewVariables(VVAccess.ReadWrite)] + public float BoozeStrengthMultiplier = 4f; +} diff --git a/Content.Server/Traits/Assorted/LightweightDrunkSystem.cs b/Content.Server/Traits/Assorted/LightweightDrunkSystem.cs new file mode 100644 index 00000000000..b5e9b877764 --- /dev/null +++ b/Content.Server/Traits/Assorted/LightweightDrunkSystem.cs @@ -0,0 +1,23 @@ +using Content.Server.Body.Components; +using Content.Server.Body.Systems; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Traits.Assorted.Components; + +namespace Content.Shared.Traits.Assorted.Systems; +public sealed class LightweightDrunkSystem : EntitySystem +{ + public override void Initialize() + { + SubscribeLocalEvent(OnTryMetabolizeReagent); + } + + private void OnTryMetabolizeReagent(EntityUid uid, LightweightDrunkComponent comp, ref TryMetabolizeReagent args) + { + Log.Debug(args.Prototype.ID); + if (args.Prototype.ID != "Ethanol") + return; + + args.Scale *= comp.BoozeStrengthMultiplier; + args.QuantityMultiplier *= comp.BoozeStrengthMultiplier; + } +} \ No newline at end of file diff --git a/Content.Server/Traits/Assorted/ParacusiaSystem.cs b/Content.Server/Traits/Assorted/ParacusiaSystem.cs index 4b0205ff536..cf08e09e90e 100644 --- a/Content.Server/Traits/Assorted/ParacusiaSystem.cs +++ b/Content.Server/Traits/Assorted/ParacusiaSystem.cs @@ -1,5 +1,7 @@ using Content.Shared.Traits.Assorted; +using Content.Shared.Traits.Assorted.Systems; using Robust.Shared.Audio; +using Content.Shared.Traits.Assorted.Components; namespace Content.Server.Traits.Assorted; diff --git a/Content.Server/Traits/TraitSystem.cs b/Content.Server/Traits/TraitSystem.cs index 22ee0e4861f..be2c3c05039 100644 --- a/Content.Server/Traits/TraitSystem.cs +++ b/Content.Server/Traits/TraitSystem.cs @@ -1,7 +1,13 @@ +using System.Linq; using Content.Server.GameTicking; +using Content.Server.Players.PlayTimeTracking; +using Content.Shared.Customization.Systems; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; +using Content.Shared.Roles; using Content.Shared.Traits; +using Pidgin.Configuration; +using Robust.Shared.Configuration; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.Manager; @@ -9,9 +15,12 @@ namespace Content.Server.Traits; public sealed class TraitSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly ISerializationManager _serializationManager = default!; - [Dependency] private readonly SharedHandsSystem _sharedHandsSystem = default!; + [Dependency] private readonly IPrototypeManager _prototype = default!; + [Dependency] private readonly ISerializationManager _serialization = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; + [Dependency] private readonly CharacterRequirementsSystem _characterRequirements = default!; + [Dependency] private readonly PlayTimeTrackingManager _playTimeTracking = default!; + [Dependency] private readonly IConfigurationManager _configuration = default!; public override void Initialize() { @@ -25,16 +34,17 @@ private void OnPlayerSpawnComplete(PlayerSpawnCompleteEvent args) { foreach (var traitId in args.Profile.TraitPreferences) { - if (!_prototypeManager.TryIndex(traitId, out var traitPrototype)) + if (!_prototype.TryIndex(traitId, out var traitPrototype)) { Log.Warning($"No trait found with ID {traitId}!"); return; } - if (traitPrototype.Whitelist != null && !traitPrototype.Whitelist.IsValid(args.Mob)) - continue; - - if (traitPrototype.Blacklist != null && traitPrototype.Blacklist.IsValid(args.Mob)) + if (!_characterRequirements.CheckRequirementsValid(traitPrototype, traitPrototype.Requirements, + _prototype.Index(args.JobId ?? _prototype.EnumeratePrototypes().First().ID), + args.Profile, _playTimeTracking.GetTrackerTimes(args.Player), + EntityManager, _prototype, _configuration, + out _)) continue; // Add all components required by the prototype @@ -43,22 +53,10 @@ private void OnPlayerSpawnComplete(PlayerSpawnCompleteEvent args) if (HasComp(args.Mob, entry.Component.GetType())) continue; - var comp = (Component) _serializationManager.CreateCopy(entry.Component, notNullableOverride: true); + var comp = (Component) _serialization.CreateCopy(entry.Component, notNullableOverride: true); comp.Owner = args.Mob; EntityManager.AddComponent(args.Mob, comp); } - - // Add item required by the trait - if (traitPrototype.TraitGear != null) - { - if (!TryComp(args.Mob, out HandsComponent? handsComponent)) - continue; - - var coords = Transform(args.Mob).Coordinates; - var inhandEntity = EntityManager.SpawnEntity(traitPrototype.TraitGear, coords); - _sharedHandsSystem.TryPickup(args.Mob, inhandEntity, checkActionBlocker: false, - handsComp: handsComponent); - } } } } diff --git a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs index 31c9b0d2b86..4749fd8b4b3 100644 --- a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs +++ b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs @@ -8,6 +8,7 @@ using Content.Shared.Actions.Events; using Content.Shared.Administration.Components; using Content.Shared.CombatMode; +using Content.Shared.Contests; using Content.Shared.Damage.Events; using Content.Shared.Damage.Systems; using Content.Shared.Database; @@ -43,6 +44,7 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem [Dependency] private readonly SharedColorFlashEffectSystem _color = default!; [Dependency] private readonly SolutionContainerSystem _solutions = default!; [Dependency] private readonly TagSystem _tag = default!; + [Dependency] private readonly ContestsSystem _contests = default!; public override void Initialize() { @@ -138,7 +140,7 @@ protected override bool DoDisarm(EntityUid user, DisarmAttackEvent ev, EntityUid if (attemptEvent.Cancelled) return false; - var chance = CalculateDisarmChance(user, target, inTargetHand, combatMode); + var chance = CalculateDisarmChance(user, target, inTargetHand, combatMode) * _contests.MassContest(user, target); if (_random.Prob(chance)) { diff --git a/Content.Server/Weapons/Ranged/Systems/FireOnDropSystem.cs b/Content.Server/Weapons/Ranged/Systems/FireOnDropSystem.cs new file mode 100644 index 00000000000..a6112ad49cf --- /dev/null +++ b/Content.Server/Weapons/Ranged/Systems/FireOnDropSystem.cs @@ -0,0 +1,27 @@ +using Content.Shared.Throwing; +using Content.Shared.Weapons.Ranged.Components; +using Content.Shared.Weapons.Ranged.Systems; +using Robust.Shared.Random; + +namespace Content.Server.Weapons.Ranged.Systems; + +public sealed class FireOnDropSystem : EntitySystem +{ + [Dependency] private readonly SharedGunSystem _gun = default!; + [Dependency] private readonly IRobustRandom _random = default!; + + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(HandleLand); + } + + + private void HandleLand(EntityUid uid, GunComponent component, ref ThrowDoHitEvent args) + { + if (_random.Prob(component.FireOnDropChance)) + _gun.AttemptShoot(uid, uid, component, Transform(uid).Coordinates.Offset(Transform(uid).LocalRotation.ToVec())); + } +} diff --git a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs index b8f8f122111..9db00d2949c 100644 --- a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs +++ b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs @@ -1,11 +1,11 @@ using System.Linq; using System.Numerics; -using Content.Server.Administration.Logs; using Content.Server.Cargo.Systems; using Content.Server.Interaction; using Content.Server.Power.EntitySystems; using Content.Server.Stunnable; using Content.Server.Weapons.Ranged.Components; +using Content.Shared.Contests; using Content.Shared.Damage; using Content.Shared.Damage.Systems; using Content.Shared.Database; @@ -29,7 +29,6 @@ namespace Content.Server.Weapons.Ranged.Systems; public sealed partial class GunSystem : SharedGunSystem { - [Dependency] private readonly IAdminLogManager _adminLogger = default!; [Dependency] private readonly IComponentFactory _factory = default!; [Dependency] private readonly BatterySystem _battery = default!; [Dependency] private readonly DamageExamineSystem _damageExamine = default!; @@ -39,6 +38,7 @@ public sealed partial class GunSystem : SharedGunSystem [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly StaminaSystem _stamina = default!; [Dependency] private readonly StunSystem _stun = default!; + [Dependency] private readonly ContestsSystem _contests = default!; public const float DamagePitchVariation = SharedMeleeWeaponSystem.DamagePitchVariation; public const float GunClumsyChance = 0.5f; @@ -97,7 +97,7 @@ public override void Shoot(EntityUid gunUid, GunComponent gun, List<(EntityUid? var toMap = toCoordinates.ToMapPos(EntityManager, TransformSystem); var mapDirection = toMap - fromMap.Position; var mapAngle = mapDirection.ToAngle(); - var angle = GetRecoilAngle(Timing.CurTime, gun, mapDirection.ToAngle()); + var angle = GetRecoilAngle(Timing.CurTime, gun, mapDirection.ToAngle(), user); // If applicable, this ensures the projectile is parented to grid on spawn, instead of the map. var fromEnt = MapManager.TryFindGridAt(fromMap, out var gridUid, out var grid) @@ -280,6 +280,13 @@ public override void Shoot(EntityUid gunUid, GunComponent gun, List<(EntityUid? private void ShootOrThrow(EntityUid uid, Vector2 mapDirection, Vector2 gunVelocity, GunComponent gun, EntityUid gunUid, EntityUid? user) { + if (gun.Target is { } target && !TerminatingOrDeleted(target)) + { + var targeted = EnsureComp(uid); + targeted.Target = target; + Dirty(uid, targeted); + } + // Do a throw if (!HasComp(uid)) { @@ -311,7 +318,7 @@ private Angle[] LinearSpread(Angle start, Angle end, int intervals) return angles; } - private Angle GetRecoilAngle(TimeSpan curTime, GunComponent component, Angle direction) + private Angle GetRecoilAngle(TimeSpan curTime, GunComponent component, Angle direction, EntityUid? shooter) { var timeSinceLastFire = (curTime - component.LastFire).TotalSeconds; var newTheta = MathHelper.Clamp(component.CurrentAngle.Theta + component.AngleIncreaseModified.Theta - component.AngleDecayModified.Theta * timeSinceLastFire, component.MinAngleModified.Theta, component.MaxAngleModified.Theta); @@ -319,7 +326,8 @@ private Angle GetRecoilAngle(TimeSpan curTime, GunComponent component, Angle dir component.LastFire = component.NextFire; // Convert it so angle can go either side. - var random = Random.NextFloat(-0.5f, 0.5f); + + var random = Random.NextFloat(-0.5f, 0.5f) / _contests.MassContest(shooter); var spread = component.CurrentAngle.Theta * random; var angle = new Angle(direction.Theta + component.CurrentAngle.Theta * random); DebugTools.Assert(spread <= component.MaxAngleModified.Theta); diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ThrowArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ThrowArtifactSystem.cs index 85783b552da..57a30a2fd9e 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ThrowArtifactSystem.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ThrowArtifactSystem.cs @@ -1,12 +1,10 @@ using System.Numerics; -using Content.Server.Maps; using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Content.Shared.Ghost; using Content.Shared.Maps; using Content.Shared.Physics; using Content.Shared.Throwing; -using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; using Robust.Shared.Random; @@ -14,7 +12,6 @@ namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; public sealed class ThrowArtifactSystem : EntitySystem { - [Dependency] private readonly IMapManager _map = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly ThrowingSystem _throwing = default!; @@ -29,7 +26,7 @@ public override void Initialize() private void OnActivated(EntityUid uid, ThrowArtifactComponent component, ArtifactActivatedEvent args) { var xform = Transform(uid); - if (_map.TryGetGrid(xform.GridUid, out var grid)) + if (TryComp(xform.GridUid, out var grid)) { var tiles = grid.GetTilesIntersecting( Box2.CenteredAround(xform.WorldPosition, new Vector2(component.Range * 2, component.Range))); diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactGasTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactGasTriggerSystem.cs index 96f1dc37835..00f409f5533 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactGasTriggerSystem.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactGasTriggerSystem.cs @@ -1,7 +1,6 @@ using Content.Server.Atmos.EntitySystems; using Content.Server.Xenoarchaeology.XenoArtifacts.Events; using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; -using Robust.Server.GameObjects; namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; @@ -9,7 +8,6 @@ public sealed class ArtifactGasTriggerSystem : EntitySystem { [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; [Dependency] private readonly ArtifactSystem _artifactSystem = default!; - [Dependency] private readonly TransformSystem _transformSystem = default!; public override void Initialize() { diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactHeatTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactHeatTriggerSystem.cs index 33d1a43c125..5525cdf3591 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactHeatTriggerSystem.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactHeatTriggerSystem.cs @@ -3,7 +3,6 @@ using Content.Shared.Interaction; using Content.Shared.Temperature; using Content.Shared.Weapons.Melee.Events; -using Robust.Server.GameObjects; namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; @@ -11,7 +10,6 @@ public sealed class ArtifactHeatTriggerSystem : EntitySystem { [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; [Dependency] private readonly ArtifactSystem _artifactSystem = default!; - [Dependency] private readonly TransformSystem _transformSystem = default!; public override void Initialize() { diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs index 239b6741608..9976d56da0b 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/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactPressureTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactPressureTriggerSystem.cs index 4388756cce0..8777ab0a8c7 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactPressureTriggerSystem.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactPressureTriggerSystem.cs @@ -1,6 +1,5 @@ using Content.Server.Atmos.EntitySystems; using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; -using Robust.Server.GameObjects; namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; @@ -11,7 +10,6 @@ public sealed class ArtifactPressureTriggerSystem : EntitySystem { [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; [Dependency] private readonly ArtifactSystem _artifactSystem = default!; - [Dependency] private readonly TransformSystem _transformSystem = default!; public override void Update(float frameTime) { diff --git a/Content.Server/Zombies/ZombieSystem.Transform.cs b/Content.Server/Zombies/ZombieSystem.Transform.cs index daadd4b518b..c87132cc3cb 100644 --- a/Content.Server/Zombies/ZombieSystem.Transform.cs +++ b/Content.Server/Zombies/ZombieSystem.Transform.cs @@ -26,17 +26,17 @@ 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.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; -using Content.Shared.Traits.Assorted; using Robust.Shared.Audio.Systems; +using Content.Shared.Traits.Assorted.Components; namespace Content.Server.Zombies { @@ -59,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!; [Dependency] private readonly ActionsSystem _actions = default!; // DeltaV - No psionic zombies @@ -282,7 +281,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 bef57eceb39..080bef44e7a 100644 --- a/Content.Server/Zombies/ZombieSystem.cs +++ b/Content.Server/Zombies/ZombieSystem.cs @@ -2,9 +2,7 @@ using Content.Server.Body.Systems; using Content.Server.Chat; using Content.Server.Chat.Systems; -using Content.Server.Cloning; using Content.Server.Emoting.Systems; -using Content.Server.Inventory; using Content.Server.Speech.EntitySystems; using Content.Shared.Bed.Sleep; using Content.Shared.Cloning; @@ -31,7 +29,6 @@ public sealed partial class ZombieSystem : SharedZombieSystem [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly BloodstreamSystem _bloodstream = default!; [Dependency] private readonly DamageableSystem _damageable = default!; - [Dependency] private readonly ServerInventorySystem _inv = default!; [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly AutoEmoteSystem _autoEmote = default!; [Dependency] private readonly EmoteOnDamageSystem _emoteOnDamage = default!; diff --git a/Content.Shared/ActionBlocker/ActionBlockerSystem.cs b/Content.Shared/ActionBlocker/ActionBlockerSystem.cs index a914a8f267d..f5ed2df227c 100644 --- a/Content.Shared/ActionBlocker/ActionBlockerSystem.cs +++ b/Content.Shared/ActionBlocker/ActionBlockerSystem.cs @@ -202,7 +202,7 @@ public bool CanChangeDirection(EntityUid uid) public bool CanShiver(EntityUid uid) { var ev = new ShiverAttemptEvent(uid); - RaiseLocalEvent(uid, ev); + RaiseLocalEvent(uid, ref ev); return !ev.Cancelled; } @@ -210,7 +210,7 @@ public bool CanShiver(EntityUid uid) public bool CanSweat(EntityUid uid) { var ev = new SweatAttemptEvent(uid); - RaiseLocalEvent(uid, ev); + RaiseLocalEvent(uid, ref ev); return !ev.Cancelled; } diff --git a/Content.Shared/Administration/AdminData.cs b/Content.Shared/Administration/AdminData.cs index 5b5873bce36..229edbcd4c3 100644 --- a/Content.Shared/Administration/AdminData.cs +++ b/Content.Shared/Administration/AdminData.cs @@ -12,6 +12,11 @@ public sealed class AdminData /// public bool Active; + /// + /// Whether the admin is in stealth mode and won't appear in adminwho to admins without the Stealth flag. + /// + public bool Stealth; + /// /// The admin's title. /// @@ -56,6 +61,14 @@ public bool CanAdminMenu() return HasFlag(AdminFlags.Admin); } + /// + /// Check if this admin can be hidden and see other hidden admins. + /// + public bool CanStealth() + { + return HasFlag(AdminFlags.Stealth); + } + public bool CanAdminReloadPrototypes() { return HasFlag(AdminFlags.Host); diff --git a/Content.Shared/Administration/AdminFlags.cs b/Content.Shared/Administration/AdminFlags.cs index 64cf522faaf..9842e638c2c 100644 --- a/Content.Shared/Administration/AdminFlags.cs +++ b/Content.Shared/Administration/AdminFlags.cs @@ -96,7 +96,12 @@ public enum AdminFlags : uint MassBan = 1 << 15, /// - /// DeltaV - The ability to whitelist people. Either this permission or +BAN is required for remove. + /// Allows you to remain hidden from adminwho except to other admins with this flag. + /// + Stealth = 1 << 16, + + /// + /// DeltaV - The ability to whitelist people. Either this permission or +BAN is required for remove. /// Whitelist = 1 << 20, diff --git a/Content.Shared/Administration/AdminFrozenSystem.cs b/Content.Shared/Administration/AdminFrozenSystem.cs index 14438cc5912..4ec9600b0bd 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/Alert/AlertType.cs b/Content.Shared/Alert/AlertType.cs index b917dd692d7..dc323dc64a8 100644 --- a/Content.Shared/Alert/AlertType.cs +++ b/Content.Shared/Alert/AlertType.cs @@ -37,6 +37,7 @@ public enum AlertType : byte Internals, Toxins, Muted, + Walking, VowOfSilence, VowBroken, Essence, @@ -52,7 +53,8 @@ public enum AlertType : byte SuitPower, BorgHealth, BorgCrit, - BorgDead + BorgDead, + Offer, } } diff --git a/Content.Shared/Announcements/Events/AnnouncementSendEvent.cs b/Content.Shared/Announcements/Events/AnnouncementSendEvent.cs new file mode 100644 index 00000000000..ca75742aed6 --- /dev/null +++ b/Content.Shared/Announcements/Events/AnnouncementSendEvent.cs @@ -0,0 +1,23 @@ +using Robust.Shared.Audio; +using Robust.Shared.Network; +using Robust.Shared.Serialization; + +namespace Content.Shared.Announcements.Events; + + +[Serializable, NetSerializable] +public sealed class AnnouncementSendEvent : EntityEventArgs +{ + public string AnnouncerId { get; } + public string AnnouncementId { get; } + public List Recipients { get; } + public AudioParams AudioParams { get; } + + public AnnouncementSendEvent(string announcerId, string announcementId, List recipients, AudioParams audioParams) + { + AnnouncerId = announcerId; + AnnouncementId = announcementId; + Recipients = recipients; + AudioParams = audioParams; + } +} diff --git a/Content.Shared/Announcements/Prototypes/AnnouncerPrototype.cs b/Content.Shared/Announcements/Prototypes/AnnouncerPrototype.cs new file mode 100644 index 00000000000..42db148df9c --- /dev/null +++ b/Content.Shared/Announcements/Prototypes/AnnouncerPrototype.cs @@ -0,0 +1,71 @@ +using Robust.Shared.Audio; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Announcements.Prototypes; + +/// +/// Defines an announcer and their announcement file paths +/// +[Prototype("announcer")] +public sealed class AnnouncerPrototype : IPrototype +{ + [IdDataField] + public string ID { get; } = default!; + + /// + /// A prefix to add to all announcement paths unless told not to by + /// + /// Paths always start in Resources/ + [DataField("basePath")] + public string BasePath { get; } = default!; + + /// + /// Audio parameters to apply to all announcement sounds unless overwritten by + /// + [DataField("baseAudioParams")] + public AudioParams? BaseAudioParams { get; } + + [DataField("announcements")] + public AnnouncementData[] Announcements { get; } = default!; +} + +/// +/// Defines a path to an announcement file and that announcement's ID +/// +[DataDefinition] +public sealed partial class AnnouncementData +{ + [DataField("id")] + public string ID = default!; + + /// + /// If true, the will not be prepended to this announcement's path + /// + [DataField("ignoreBasePath")] + public bool IgnoreBasePath = false; + + /// + /// Where to look for the announcement audio file + /// + [DataField("path")] + public string? Path; + + /// + /// Use a soundCollection instead of a single sound + /// + [DataField("collection"), ValidatePrototypeId] + public string? Collection; + + /// + /// Overrides the default announcement message for this announcement type + /// + [DataField("message")] + public string? MessageOverride; + + /// + /// Audio parameters to apply to this announcement sound + /// Will override + /// + [DataField("audioParams")] + public AudioParams? AudioParams; +} diff --git a/Content.Shared/Announcements/Systems/SharedAnnouncerSystem.cs b/Content.Shared/Announcements/Systems/SharedAnnouncerSystem.cs new file mode 100644 index 00000000000..c29513285e1 --- /dev/null +++ b/Content.Shared/Announcements/Systems/SharedAnnouncerSystem.cs @@ -0,0 +1,152 @@ +using System.Linq; +using System.Text.RegularExpressions; +using Content.Shared.Announcements.Prototypes; +using Robust.Shared.Audio; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Announcements.Systems; + +public abstract class SharedAnnouncerSystem : EntitySystem +{ + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + + + /// + /// Gets an announcement path from the announcer + /// + /// ID of the announcement from the announcer to get information for + /// ID of the announcer to use instead of the current one + public string GetAnnouncementPath(string announcementId, string announcerId) + { + if (!_proto.TryIndex(announcerId, out var announcer)) + return ""; + + // Get the announcement data from the announcer + // Will be the fallback if the data for the announcementId is not found + var announcementType = announcer.Announcements.FirstOrDefault(a => a.ID == announcementId) ?? + announcer.Announcements.First(a => a.ID.ToLower() == "fallback"); + + // If the greedy announcementType wants to do the job of announcer, ignore the base path and just return the path + if (announcementType.IgnoreBasePath) + return announcementType.Path!; + // If the announcementType has a collection, get the sound from the collection + if (announcementType.Collection != null) + return _audio.GetSound(new SoundCollectionSpecifier(announcementType.Collection)); + // If nothing is overriding the base paths, return the base path + the announcement file path + return $"{announcer.BasePath}/{announcementType.Path}"; + } + + /// + /// Gets audio params from the announcer + /// + /// ID of the announcement from the announcer to get information for + /// Announcer prototype to get information from + public string GetAnnouncementPath(string announcementId, AnnouncerPrototype announcer) + { + // Get the announcement data from the announcer + // Will be the fallback if the data for the announcementId is not found + var announcementType = announcer.Announcements.FirstOrDefault(a => a.ID == announcementId) ?? + announcer.Announcements.First(a => a.ID.ToLower() == "fallback"); + + // If the greedy announcementType wants to do the job of announcer, ignore the base path and just return the path + if (announcementType.IgnoreBasePath) + return announcementType.Path!; + // If the announcementType has a collection, get the sound from the collection + if (announcementType.Collection != null) + return _audio.GetSound(new SoundCollectionSpecifier(announcementType.Collection)); + // If nothing is overriding the base paths, return the base path + the announcement file path + return $"{announcer.BasePath}/{announcementType.Path}"; + } + + /// + /// Converts a prototype ID to a consistently used format for announcements + /// + public string GetAnnouncementId(string announcementId, bool ended = false) + { + // Replace the first letter with lowercase + var id = char.ToLowerInvariant(announcementId[0]) + announcementId[1..]; + + // If the event has ended, add "Complete" to the end + if (ended) + id += "Complete"; + + return id; + } + + + /// + /// Gets audio params from the announcer + /// + /// ID of the announcement from the announcer to get information from + /// ID of the announcer to use instead of the current one + public AudioParams? GetAudioParams(string announcementId, string announcerId) + { + if (!_proto.TryIndex(announcerId, out var announcer)) + return null; + + // Get the announcement data from the announcer + // Will be the fallback if the data for the announcementId is not found + var announcementType = announcer.Announcements.FirstOrDefault(a => a.ID == announcementId) ?? + announcer.Announcements.First(a => a.ID == "fallback"); + + // Return the announcer.BaseAudioParams if the announcementType doesn't have an override + return announcementType.AudioParams ?? announcer.BaseAudioParams ?? null; // For some reason the formatter doesn't warn me about "?? null" being redundant, so it stays + } + + /// + /// Gets audio params from the announcer + /// + /// ID of the announcement from the announcer to get information from + /// Announcer prototype to get information from + public AudioParams? GetAudioParams(string announcementId, AnnouncerPrototype announcer) + { + // Get the announcement data from the announcer + // Will be the fallback if the data for the announcementId is not found + var announcementType = announcer.Announcements.FirstOrDefault(a => a.ID == announcementId) ?? + announcer.Announcements.First(a => a.ID == "fallback"); + + // Return the announcer.BaseAudioParams if the announcementType doesn't have an override + return announcementType.AudioParams ?? announcer.BaseAudioParams; + } + + + /// + /// Gets an announcement message from the announcer + /// + /// ID of the announcement from the announcer to get information from + /// ID of the announcer to get information from + /// Locale arguments to pass to the overwritten announcement + public string? GetAnnouncementMessage(string announcementId, string announcerId, + params (string, object)[] localeArgs) + { + if (!_proto.TryIndex(announcerId, out var announcer)) + return null; + + // Get the announcement data from the announcer + // Will be the fallback if the data for the announcementId is not found + var announcementType = announcer.Announcements.FirstOrDefault(a => a.ID == announcementId) ?? + announcer.Announcements.First(a => a.ID == "fallback"); + + // Return the announcementType.MessageOverride if it exists, otherwise return null + return announcementType.MessageOverride != null ? Loc.GetString(announcementType.MessageOverride, localeArgs) : null; + } + + /// + /// Gets an announcement message from an event ID + /// + /// ID of the event to convert + /// Format for the locale string, replaces "{}" with the converted ID + /// The IDs use a hardcoded format, you can probably handle other formats yourself + /// Localized announcement + public string GetEventLocaleString(string eventId, string localeBase = "station-event-{}-announcement") + { + // Replace capital letters with lowercase plus a hyphen before it + var capsCapture = new Regex("([A-Z])"); + var id = capsCapture.Replace(eventId, "-$1").ToLower(); + + // Replace {} with the converted ID + return localeBase.Replace("{}", id); + } +} diff --git a/Content.Shared/Body/Events/MechanismBodyEvents.cs b/Content.Shared/Body/Events/MechanismBodyEvents.cs index b52a333613f..968b172aef5 100644 --- a/Content.Shared/Body/Events/MechanismBodyEvents.cs +++ b/Content.Shared/Body/Events/MechanismBodyEvents.cs @@ -1,61 +1,28 @@ -namespace Content.Shared.Body.Events -{ - // All of these events are raised on a mechanism entity when added/removed to a body in different - // ways. - - /// - /// Raised on a mechanism when it is added to a body part. - /// - public sealed class AddedToPartEvent : EntityEventArgs - { - public EntityUid Part; - - public AddedToPartEvent(EntityUid part) - { - Part = part; - } - } - - /// - /// Raised on a mechanism when it is added to a body part within a body. - /// - public sealed class AddedToPartInBodyEvent : EntityEventArgs - { - public EntityUid Body; - public EntityUid Part; - - public AddedToPartInBodyEvent(EntityUid body, EntityUid part) - { - Body = body; - Part = part; - } - } - - /// - /// Raised on a mechanism when it is removed from a body part. - /// - public sealed class RemovedFromPartEvent : EntityEventArgs - { - public EntityUid OldPart; - - public RemovedFromPartEvent(EntityUid oldPart) - { - OldPart = oldPart; - } - } - - /// - /// Raised on a mechanism when it is removed from a body part within a body. - /// - public sealed class RemovedFromPartInBodyEvent : EntityEventArgs - { - public EntityUid OldBody; - public EntityUid OldPart; - - public RemovedFromPartInBodyEvent(EntityUid oldBody, EntityUid oldPart) - { - OldBody = oldBody; - OldPart = oldPart; - } - } -} +namespace Content.Shared.Body.Events; + +// All of these events are raised on a mechanism entity when added/removed to a body in different +// ways. + +/// +/// Raised on a mechanism when it is added to a body part. +/// +[ByRefEvent] +public readonly record struct OrganAddedEvent(EntityUid Part); + +/// +/// Raised on a mechanism when it is added to a body part within a body. +/// +[ByRefEvent] +public readonly record struct OrganAddedToBodyEvent(EntityUid Body, EntityUid Part); + +/// +/// Raised on a mechanism when it is removed from a body part. +/// +[ByRefEvent] +public readonly record struct OrganRemovedEvent(EntityUid OldPart); + +/// +/// Raised on a mechanism when it is removed from a body part within a body. +/// +[ByRefEvent] +public readonly record struct OrganRemovedFromBodyEvent(EntityUid OldBody, EntityUid OldPart); diff --git a/Content.Shared/Body/Events/ShiverAttemptEvent.cs b/Content.Shared/Body/Events/ShiverAttemptEvent.cs index 8c2761f545d..e9400bc48d7 100644 --- a/Content.Shared/Body/Events/ShiverAttemptEvent.cs +++ b/Content.Shared/Body/Events/ShiverAttemptEvent.cs @@ -1,12 +1,8 @@ -namespace Content.Shared.Body.Events -{ - public sealed class ShiverAttemptEvent : CancellableEntityEventArgs - { - public ShiverAttemptEvent(EntityUid uid) - { - Uid = uid; - } +namespace Content.Shared.Body.Events; - public EntityUid Uid { get; } - } +[ByRefEvent] +public record struct ShiverAttemptEvent(EntityUid Uid) +{ + public readonly EntityUid Uid = Uid; + public bool Cancelled = false; } diff --git a/Content.Shared/Body/Events/SweatAttemptEvent.cs b/Content.Shared/Body/Events/SweatAttemptEvent.cs index 7f4b3fab15d..7506538c439 100644 --- a/Content.Shared/Body/Events/SweatAttemptEvent.cs +++ b/Content.Shared/Body/Events/SweatAttemptEvent.cs @@ -1,12 +1,8 @@ -namespace Content.Shared.Body.Events -{ - public sealed class SweatAttemptEvent : CancellableEntityEventArgs - { - public SweatAttemptEvent(EntityUid uid) - { - Uid = uid; - } +namespace Content.Shared.Body.Events; - public EntityUid Uid { get; } - } +[ByRefEvent] +public record struct SweatAttemptEvent(EntityUid Uid) +{ + public readonly EntityUid Uid = Uid; + public bool Cancelled = false; } diff --git a/Content.Shared/Body/Organ/OrganComponent.cs b/Content.Shared/Body/Organ/OrganComponent.cs index 9e1de6b3559..3048927b5fb 100644 --- a/Content.Shared/Body/Organ/OrganComponent.cs +++ b/Content.Shared/Body/Organ/OrganComponent.cs @@ -1,4 +1,4 @@ -using Content.Shared.Body.Systems; +using Content.Shared.Body.Systems; using Robust.Shared.Containers; using Robust.Shared.GameStates; @@ -11,6 +11,6 @@ public sealed partial class OrganComponent : Component /// /// Relevant body this organ is attached to. /// - [DataField("body"), AutoNetworkedField] + [DataField, AutoNetworkedField] public EntityUid? Body; } diff --git a/Content.Shared/Body/Part/BodyPartEvents.cs b/Content.Shared/Body/Part/BodyPartEvents.cs index 4dbc543fc8e..0d8d2c8a268 100644 --- a/Content.Shared/Body/Part/BodyPartEvents.cs +++ b/Content.Shared/Body/Part/BodyPartEvents.cs @@ -1,7 +1,7 @@ -namespace Content.Shared.Body.Part; +namespace Content.Shared.Body.Part; [ByRefEvent] -public readonly record struct BodyPartAddedEvent(string Slot, BodyPartComponent Part); +public readonly record struct BodyPartAddedEvent(string Slot, Entity Part); [ByRefEvent] -public readonly record struct BodyPartRemovedEvent(string Slot, BodyPartComponent Part); +public readonly record struct BodyPartRemovedEvent(string Slot, Entity Part); diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs index bc7cf63124c..1a35afdbe00 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs @@ -9,7 +9,6 @@ using Content.Shared.Gibbing.Events; using Content.Shared.Gibbing.Systems; using Content.Shared.Inventory; -using Content.Shared.Inventory.Events; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; @@ -30,8 +29,10 @@ public partial class SharedBodySystem [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly GibbingSystem _gibbingSystem = default!; [Dependency] private readonly SharedAudioSystem _audioSystem = default!; + private const float GibletLaunchImpulse = 8; private const float GibletLaunchImpulseVariance = 3; + private void InitializeBody() { // Body here to handle root body parts. @@ -43,7 +44,7 @@ private void InitializeBody() SubscribeLocalEvent(OnBodyCanDrag); } - private void OnBodyInserted(EntityUid uid, BodyComponent component, EntInsertedIntoContainerMessage args) + private void OnBodyInserted(Entity ent, ref EntInsertedIntoContainerMessage args) { // Root body part? var slotId = args.Container.ID; @@ -51,21 +52,21 @@ private void OnBodyInserted(EntityUid uid, BodyComponent component, EntInsertedI if (slotId != BodyRootContainerId) return; - var entity = args.Entity; + var insertedUid = args.Entity; - if (TryComp(entity, out BodyPartComponent? childPart)) + if (TryComp(insertedUid, out BodyPartComponent? part)) { - AddPart(uid, entity, slotId, childPart); - RecursiveBodyUpdate(entity, uid, childPart); + AddPart((ent, ent), (insertedUid, part), slotId); + RecursiveBodyUpdate((insertedUid, part), ent); } - if (TryComp(entity, out OrganComponent? organ)) + if (TryComp(insertedUid, out OrganComponent? organ)) { - AddOrgan(entity, uid, uid, organ); + AddOrgan((insertedUid, organ), ent, ent); } } - private void OnBodyRemoved(EntityUid uid, BodyComponent component, EntRemovedFromContainerMessage args) + private void OnBodyRemoved(Entity ent, ref EntRemovedFromContainerMessage args) { // Root body part? var slotId = args.Container.ID; @@ -73,55 +74,55 @@ private void OnBodyRemoved(EntityUid uid, BodyComponent component, EntRemovedFro if (slotId != BodyRootContainerId) return; - var entity = args.Entity; - DebugTools.Assert(!TryComp(entity, out BodyPartComponent? b) || b.Body == uid); - DebugTools.Assert(!TryComp(entity, out OrganComponent? o) || o.Body == uid); + var removedUid = args.Entity; + DebugTools.Assert(!TryComp(removedUid, out BodyPartComponent? b) || b.Body == ent); + DebugTools.Assert(!TryComp(removedUid, out OrganComponent? o) || o.Body == ent); - if (TryComp(entity, out BodyPartComponent? childPart)) + if (TryComp(removedUid, out BodyPartComponent? part)) { - RemovePart(uid, entity, slotId, childPart); - RecursiveBodyUpdate(entity, null, childPart); + RemovePart((ent, ent), (removedUid, part), slotId); + RecursiveBodyUpdate((removedUid, part), null); } - if (TryComp(entity, out OrganComponent? organ)) - RemoveOrgan(entity, uid, organ); + if (TryComp(removedUid, out OrganComponent? organ)) + RemoveOrgan((removedUid, organ), ent); } - private void OnBodyInit(EntityUid bodyId, BodyComponent body, ComponentInit args) + private void OnBodyInit(Entity ent, ref ComponentInit args) { // Setup the initial container. - body.RootContainer = Containers.EnsureContainer(bodyId, BodyRootContainerId); + ent.Comp.RootContainer = Containers.EnsureContainer(ent, BodyRootContainerId); } - private void OnBodyMapInit(EntityUid bodyId, BodyComponent body, MapInitEvent args) + private void OnBodyMapInit(Entity ent, ref MapInitEvent args) { - if (body.Prototype == null) + if (ent.Comp.Prototype is null) return; // One-time setup // Obviously can't run in Init to avoid double-spawns on save / load. - var prototype = Prototypes.Index(body.Prototype.Value); - MapInitBody(bodyId, prototype); + var prototype = Prototypes.Index(ent.Comp.Prototype.Value); + MapInitBody(ent, prototype); } private void MapInitBody(EntityUid bodyEntity, BodyPrototype prototype) { var protoRoot = prototype.Slots[prototype.Root]; - if (protoRoot.Part == null) + if (protoRoot.Part is null) return; // This should already handle adding the entity to the root. - var rootPartEntity = SpawnInContainerOrDrop(protoRoot.Part, bodyEntity, BodyRootContainerId); - var rootPart = Comp(rootPartEntity); + var rootPartUid = SpawnInContainerOrDrop(protoRoot.Part, bodyEntity, BodyRootContainerId); + var rootPart = Comp(rootPartUid); rootPart.Body = bodyEntity; - Dirty(rootPartEntity, rootPart); + Dirty(rootPartUid, rootPart); // Setup the rest of the body entities. - SetupOrgans(rootPartEntity, rootPart, protoRoot.Organs); - MapInitParts(rootPartEntity, prototype); + SetupOrgans((rootPartUid, rootPart), protoRoot.Organs); + MapInitParts(rootPartUid, prototype); } - private void OnBodyCanDrag(EntityUid uid, BodyComponent component, ref CanDragEvent args) + private void OnBodyCanDrag(Entity ent, ref CanDragEvent args) { args.Handled = true; } @@ -169,7 +170,7 @@ private void MapInitParts(EntityUid rootPartId, BodyPrototype prototype) var partSlot = CreatePartSlot(parentEntity, connection, childPartComponent.PartType, parentPartComponent); var cont = Containers.GetContainer(parentEntity, GetPartSlotContainerId(connection)); - if (partSlot == null || !Containers.Insert(childPart, cont)) + if (partSlot is null || !Containers.Insert(childPart, cont)) { Log.Error($"Could not create slot for connection {connection} in body {prototype.ID}"); QueueDel(childPart); @@ -177,7 +178,7 @@ private void MapInitParts(EntityUid rootPartId, BodyPrototype prototype) } // Add organs - SetupOrgans(childPart, childPartComponent, connectionSlot.Organs); + SetupOrgans((childPart, childPartComponent), connectionSlot.Organs); // Enqueue it so we can also get its neighbors. frontier.Enqueue(connection); @@ -185,16 +186,16 @@ private void MapInitParts(EntityUid rootPartId, BodyPrototype prototype) } } - private void SetupOrgans(EntityUid partId, BodyPartComponent partComponent, Dictionary organs) + private void SetupOrgans(Entity ent, Dictionary organs) { foreach (var (organSlotId, organProto) in organs) { - var slot = CreateOrganSlot(organSlotId, partId, partComponent); - SpawnInContainerOrDrop(organProto, partId, GetOrganContainerId(organSlotId)); + var slot = CreateOrganSlot((ent, ent), organSlotId); + SpawnInContainerOrDrop(organProto, ent, GetOrganContainerId(organSlotId)); - if (slot == null) + if (slot is null) { - Log.Error($"Could not create organ for slot {organSlotId} in {ToPrettyString(partId)}"); + Log.Error($"Could not create organ for slot {organSlotId} in {ToPrettyString(ent)}"); } } } @@ -202,12 +203,14 @@ private void SetupOrgans(EntityUid partId, BodyPartComponent partComponent, Dict /// /// Gets all body containers on this entity including the root one. /// - public IEnumerable GetBodyContainers(EntityUid id, BodyComponent? body = null, + public IEnumerable GetBodyContainers( + EntityUid id, + BodyComponent? body = null, BodyPartComponent? rootPart = null) { - if (!Resolve(id, ref body, false) || - body.RootContainer.ContainedEntity == null || - !Resolve(body.RootContainer.ContainedEntity.Value, ref rootPart)) + if (!Resolve(id, ref body, logMissing: false) + || body.RootContainer.ContainedEntity is null + || !Resolve(body.RootContainer.ContainedEntity.Value, ref rootPart)) { yield break; } @@ -223,13 +226,15 @@ public IEnumerable GetBodyContainers(EntityUid id, BodyComponent? /// /// Gets all child body parts of this entity, including the root entity. /// - public IEnumerable<(EntityUid Id, BodyPartComponent Component)> GetBodyChildren(EntityUid? id, BodyComponent? body = null, + public IEnumerable<(EntityUid Id, BodyPartComponent Component)> GetBodyChildren( + EntityUid? id, + BodyComponent? body = null, BodyPartComponent? rootPart = null) { - if (id == null || - !Resolve(id.Value, ref body, false) || - body.RootContainer.ContainedEntity == null || - !Resolve(body.RootContainer.ContainedEntity.Value, ref rootPart)) + if (id is null + || !Resolve(id.Value, ref body, logMissing: false) + || body.RootContainer.ContainedEntity is null + || !Resolve(body.RootContainer.ContainedEntity.Value, ref rootPart)) { yield break; } @@ -240,9 +245,11 @@ public IEnumerable GetBodyContainers(EntityUid id, BodyComponent? } } - public IEnumerable<(EntityUid Id, OrganComponent Component)> GetBodyOrgans(EntityUid? bodyId, BodyComponent? body = null) + public IEnumerable<(EntityUid Id, OrganComponent Component)> GetBodyOrgans( + EntityUid? bodyId, + BodyComponent? body = null) { - if (bodyId == null || !Resolve(bodyId.Value, ref body, false)) + if (bodyId is null || !Resolve(bodyId.Value, ref body, logMissing: false)) yield break; foreach (var part in GetBodyChildren(bodyId, body)) @@ -260,10 +267,15 @@ public IEnumerable GetBodyContainers(EntityUid id, BodyComponent? /// /// /// - public IEnumerable GetBodyAllSlots(EntityUid bodyId, BodyComponent? body = null) + public IEnumerable GetBodyAllSlots( + EntityUid bodyId, + BodyComponent? body = null) { - if (!Resolve(bodyId, ref body, false) || body.RootContainer.ContainedEntity == null) + if (!Resolve(bodyId, ref body, logMissing: false) + || body.RootContainer.ContainedEntity is null) + { yield break; + } foreach (var slot in GetAllBodyPartSlots(body.RootContainer.ContainedEntity.Value)) { @@ -279,12 +291,11 @@ public virtual HashSet GibBody( Vector2? splatDirection = null, float splatModifier = 1, Angle splatCone = default, - SoundSpecifier? gibSoundOverride = null - ) + SoundSpecifier? gibSoundOverride = null) { var gibs = new HashSet(); - if (!Resolve(bodyId, ref body, false)) + if (!Resolve(bodyId, ref body, logMissing: false)) return gibs; var root = GetRootPartOrNull(bodyId, body); @@ -311,7 +322,7 @@ public virtual HashSet GibBody( launchImpulseVariance:GibletLaunchImpulseVariance, launchCone: splatCone); } } - if(TryComp(bodyId, out var inventory)) + if (TryComp(bodyId, out var inventory)) { foreach (var item in _inventory.GetHandOrInventoryEntities(bodyId)) { diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs b/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs index fa113907058..efabebfc858 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs @@ -1,4 +1,4 @@ -using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.CodeAnalysis; using Content.Shared.Body.Components; using Content.Shared.Body.Events; using Content.Shared.Body.Organ; @@ -9,41 +9,50 @@ namespace Content.Shared.Body.Systems; public partial class SharedBodySystem { - private void AddOrgan(EntityUid uid, EntityUid bodyUid, EntityUid parentPartUid, OrganComponent component) + private void AddOrgan( + Entity organEnt, + EntityUid bodyUid, + EntityUid parentPartUid) { - component.Body = bodyUid; - RaiseLocalEvent(uid, new AddedToPartEvent(parentPartUid)); + organEnt.Comp.Body = bodyUid; + var addedEv = new OrganAddedEvent(parentPartUid); + RaiseLocalEvent(organEnt, ref addedEv); - if (component.Body != null) - RaiseLocalEvent(uid, new AddedToPartInBodyEvent(component.Body.Value, parentPartUid)); + if (organEnt.Comp.Body is not null) + { + var addedInBodyEv = new OrganAddedToBodyEvent(bodyUid, parentPartUid); + RaiseLocalEvent(organEnt, ref addedInBodyEv); + } - Dirty(uid, component); + Dirty(organEnt, organEnt.Comp); } - private void RemoveOrgan(EntityUid uid, EntityUid parentPartUid, OrganComponent component) + private void RemoveOrgan(Entity organEnt, EntityUid parentPartUid) { - RaiseLocalEvent(uid, new RemovedFromPartEvent(parentPartUid)); + var removedEv = new OrganRemovedEvent(parentPartUid); + RaiseLocalEvent(organEnt, ref removedEv); - if (component.Body != null) + if (organEnt.Comp.Body is { Valid: true } bodyUid) { - RaiseLocalEvent(uid, new RemovedFromPartInBodyEvent(component.Body.Value, parentPartUid)); + var removedInBodyEv = new OrganRemovedFromBodyEvent(bodyUid, parentPartUid); + RaiseLocalEvent(organEnt, ref removedInBodyEv); } - component.Body = null; - Dirty(uid, component); + organEnt.Comp.Body = null; + Dirty(organEnt, organEnt.Comp); } /// /// Creates the specified organ slot on the parent entity. /// - private OrganSlot? CreateOrganSlot(string slotId, EntityUid parent, BodyPartComponent? part = null) + private OrganSlot? CreateOrganSlot(Entity parentEnt, string slotId) { - if (!Resolve(parent, ref part, false)) + if (!Resolve(parentEnt, ref parentEnt.Comp, logMissing: false)) return null; - Containers.EnsureContainer(parent, GetOrganContainerId(slotId)); + Containers.EnsureContainer(parentEnt, GetOrganContainerId(slotId)); var slot = new OrganSlot(slotId); - part.Organs.Add(slotId, slot); + parentEnt.Comp.Organs.Add(slotId, slot); return slot; } @@ -58,20 +67,23 @@ public bool TryCreateOrganSlot( { slot = null; - if (parent == null || !Resolve(parent.Value, ref part, false)) + if (parent is null || !Resolve(parent.Value, ref part, logMissing: false)) { return false; } Containers.EnsureContainer(parent.Value, GetOrganContainerId(slotId)); slot = new OrganSlot(slotId); - return part.Organs.TryAdd(slotId,slot.Value); + return part.Organs.TryAdd(slotId, slot.Value); } /// /// Returns whether the slotId exists on the partId. /// - public bool CanInsertOrgan(EntityUid partId, string slotId, BodyPartComponent? part = null) + public bool CanInsertOrgan( + EntityUid partId, + string slotId, + BodyPartComponent? part = null) { return Resolve(partId, ref part) && part.Organs.ContainsKey(slotId); } @@ -79,26 +91,32 @@ public bool CanInsertOrgan(EntityUid partId, string slotId, BodyPartComponent? p /// /// Returns whether the specified organ slot exists on the partId. /// - public bool CanInsertOrgan(EntityUid partId, OrganSlot slot, BodyPartComponent? part = null) + public bool CanInsertOrgan( + EntityUid partId, + OrganSlot slot, + BodyPartComponent? part = null) { return CanInsertOrgan(partId, slot.Id, part); } - public bool InsertOrgan(EntityUid partId, EntityUid organId, string slotId, BodyPartComponent? part = null, OrganComponent? organ = null) + public bool InsertOrgan( + EntityUid partId, + EntityUid organId, + string slotId, + BodyPartComponent? part = null, + OrganComponent? organ = null) { - if (!Resolve(organId, ref organ, false) || - !Resolve(partId, ref part, false) || - !CanInsertOrgan(partId, slotId, part)) + if (!Resolve(organId, ref organ, logMissing: false) + || !Resolve(partId, ref part, logMissing: false) + || !CanInsertOrgan(partId, slotId, part)) { return false; } var containerId = GetOrganContainerId(slotId); - if (!Containers.TryGetContainer(partId, containerId, out var container)) - return false; - - return Containers.Insert(organId, container); + return Containers.TryGetContainer(partId, containerId, out var container) + && Containers.Insert(organId, container); } /// @@ -111,10 +129,8 @@ public bool RemoveOrgan(EntityUid organId, OrganComponent? organ = null) var parent = container.Owner; - if (!HasComp(parent)) - return false; - - return Containers.Remove(organId, container); + return HasComp(parent) + && Containers.Remove(organId, container); } /// @@ -126,8 +142,8 @@ public bool AddOrganToFirstValidSlot( BodyPartComponent? part = null, OrganComponent? organ = null) { - if (!Resolve(partId, ref part, false) || - !Resolve(organId, ref organ, false)) + if (!Resolve(partId, ref part, logMissing: false) + || !Resolve(organId, ref organ, logMissing: false)) { return false; } diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs index e07aac06226..ee79faa0b8e 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs @@ -1,4 +1,4 @@ -using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.CodeAnalysis; using System.Linq; using Content.Shared.Body.Components; using Content.Shared.Body.Events; @@ -23,52 +23,52 @@ private void InitializeParts() SubscribeLocalEvent(OnBodyPartRemoved); } - private void OnBodyPartInserted(EntityUid uid, BodyPartComponent component, EntInsertedIntoContainerMessage args) + private void OnBodyPartInserted(Entity ent, ref EntInsertedIntoContainerMessage args) { // Body part inserted into another body part. - var entity = args.Entity; + var insertedUid = args.Entity; var slotId = args.Container.ID; - if (component.Body == null) + if (ent.Comp.Body is null) return; - if (TryComp(entity, out BodyPartComponent? childPart)) + if (TryComp(insertedUid, out BodyPartComponent? part)) { - AddPart(component.Body.Value, entity, slotId, childPart); - RecursiveBodyUpdate(entity, component.Body.Value, childPart); + AddPart(ent.Comp.Body.Value, (insertedUid, part), slotId); + RecursiveBodyUpdate((insertedUid, part), ent.Comp.Body.Value); } - if (TryComp(entity, out OrganComponent? organ)) - AddOrgan(entity, component.Body.Value, uid, organ); + if (TryComp(insertedUid, out OrganComponent? organ)) + AddOrgan((insertedUid, organ), ent.Comp.Body.Value, ent); } - private void OnBodyPartRemoved(EntityUid uid, BodyPartComponent component, EntRemovedFromContainerMessage args) + private void OnBodyPartRemoved(Entity ent, ref EntRemovedFromContainerMessage args) { // Body part removed from another body part. - var entity = args.Entity; + var removedUid = args.Entity; var slotId = args.Container.ID; - DebugTools.Assert(!TryComp(entity, out BodyPartComponent? b) || b.Body == component.Body); - DebugTools.Assert(!TryComp(entity, out OrganComponent? o) || o.Body == component.Body); + DebugTools.Assert(!TryComp(removedUid, out BodyPartComponent? b) || b.Body == ent.Comp.Body); + DebugTools.Assert(!TryComp(removedUid, out OrganComponent? o) || o.Body == ent.Comp.Body); - if (TryComp(entity, out BodyPartComponent? childPart) && childPart.Body != null) + if (TryComp(removedUid, out BodyPartComponent? part) && part.Body is not null) { - RemovePart(childPart.Body.Value, entity, slotId, childPart); - RecursiveBodyUpdate(entity, null, childPart); + RemovePart(part.Body.Value, (removedUid, part), slotId); + RecursiveBodyUpdate((removedUid, part), null); } - if (TryComp(entity, out OrganComponent? organ)) - RemoveOrgan(entity, uid, organ); + if (TryComp(removedUid, out OrganComponent? organ)) + RemoveOrgan((removedUid, organ), ent); } - private void RecursiveBodyUpdate(EntityUid uid, EntityUid? bodyUid, BodyPartComponent component) + private void RecursiveBodyUpdate(Entity ent, EntityUid? bodyUid) { - component.Body = bodyUid; - Dirty(uid, component); + ent.Comp.Body = bodyUid; + Dirty(ent, ent.Comp); - foreach (var slotId in component.Organs.Keys) + foreach (var slotId in ent.Comp.Organs.Keys) { - if (!Containers.TryGetContainer(uid, GetOrganContainerId(slotId), out var container)) + if (!Containers.TryGetContainer(ent, GetOrganContainerId(slotId), out var container)) continue; foreach (var organ in container.ContainedEntities) @@ -78,105 +78,108 @@ private void RecursiveBodyUpdate(EntityUid uid, EntityUid? bodyUid, BodyPartComp Dirty(organ, organComp); - if (organComp.Body != null) - RaiseLocalEvent(organ, new RemovedFromPartInBodyEvent(organComp.Body.Value, uid)); + if (organComp.Body is { Valid: true } oldBodyUid) + { + var removedEv = new OrganRemovedFromBodyEvent(oldBodyUid, ent); + RaiseLocalEvent(organ, ref removedEv); + } organComp.Body = bodyUid; - if (bodyUid != null) - RaiseLocalEvent(organ, new AddedToPartInBodyEvent(bodyUid.Value, uid)); + if (bodyUid is not null) + { + var addedEv = new OrganAddedToBodyEvent(bodyUid.Value, ent); + RaiseLocalEvent(organ, ref addedEv); + } } } - foreach (var slotId in component.Children.Keys) + foreach (var slotId in ent.Comp.Children.Keys) { - if (!Containers.TryGetContainer(uid, GetPartSlotContainerId(slotId), out var container)) + if (!Containers.TryGetContainer(ent, GetPartSlotContainerId(slotId), out var container)) continue; - foreach (var containedEnt in container.ContainedEntities) + foreach (var containedUid in container.ContainedEntities) { - if (TryComp(containedEnt, out BodyPartComponent? childPart)) - RecursiveBodyUpdate(containedEnt, bodyUid, childPart); + if (TryComp(containedUid, out BodyPartComponent? childPart)) + RecursiveBodyUpdate((containedUid, childPart), bodyUid); } } } protected virtual void AddPart( - EntityUid bodyUid, - EntityUid partUid, - string slotId, - BodyPartComponent component, - BodyComponent? bodyComp = null) + Entity bodyEnt, + Entity partEnt, + string slotId) { - DebugTools.AssertOwner(partUid, component); - Dirty(partUid, component); - component.Body = bodyUid; + Dirty(partEnt, partEnt.Comp); + partEnt.Comp.Body = bodyEnt; - var ev = new BodyPartAddedEvent(slotId, component); - RaiseLocalEvent(bodyUid, ref ev); + var ev = new BodyPartAddedEvent(slotId, partEnt); + RaiseLocalEvent(bodyEnt, ref ev); - AddLeg(partUid, bodyUid, component, bodyComp); + AddLeg(partEnt, bodyEnt); } protected virtual void RemovePart( - EntityUid bodyUid, - EntityUid partUid, - string slotId, - BodyPartComponent component, - BodyComponent? bodyComp = null) + Entity bodyEnt, + Entity partEnt, + string slotId) { - DebugTools.AssertOwner(partUid, component); - Resolve(bodyUid, ref bodyComp, false); - Dirty(partUid, component); - component.Body = null; + Resolve(bodyEnt, ref bodyEnt.Comp, logMissing: false); + Dirty(partEnt, partEnt.Comp); + partEnt.Comp.Body = null; - var ev = new BodyPartRemovedEvent(slotId, component); - RaiseLocalEvent(bodyUid, ref ev); + var ev = new BodyPartRemovedEvent(slotId, partEnt); + RaiseLocalEvent(bodyEnt, ref ev); - RemoveLeg(partUid, bodyUid, component); - PartRemoveDamage(bodyUid, component, bodyComp); + RemoveLeg(partEnt, bodyEnt); + PartRemoveDamage(bodyEnt, partEnt); } - private void AddLeg(EntityUid uid, EntityUid bodyUid, BodyPartComponent component, BodyComponent? bodyComp = null) + private void AddLeg(Entity legEnt, Entity bodyEnt) { - if (!Resolve(bodyUid, ref bodyComp, false)) + if (!Resolve(bodyEnt, ref bodyEnt.Comp, logMissing: false)) return; - if (component.PartType == BodyPartType.Leg) + if (legEnt.Comp.PartType == BodyPartType.Leg) { - bodyComp.LegEntities.Add(uid); - UpdateMovementSpeed(bodyUid); - Dirty(bodyUid, bodyComp); + bodyEnt.Comp.LegEntities.Add(legEnt); + UpdateMovementSpeed(bodyEnt); + Dirty(bodyEnt, bodyEnt.Comp); } } - private void RemoveLeg(EntityUid uid, EntityUid bodyUid, BodyPartComponent component, BodyComponent? bodyComp = null) + private void RemoveLeg(Entity legEnt, Entity bodyEnt) { - if (!Resolve(bodyUid, ref bodyComp, false)) + if (!Resolve(bodyEnt, ref bodyEnt.Comp, logMissing: false)) return; - if (component.PartType == BodyPartType.Leg) + if (legEnt.Comp.PartType == BodyPartType.Leg) { - bodyComp.LegEntities.Remove(uid); - UpdateMovementSpeed(bodyUid); - Dirty(bodyUid, bodyComp); + bodyEnt.Comp.LegEntities.Remove(legEnt); + UpdateMovementSpeed(bodyEnt); + Dirty(bodyEnt, bodyEnt.Comp); - if (!bodyComp.LegEntities.Any()) + if (!bodyEnt.Comp.LegEntities.Any()) { - Standing.Down(bodyUid); + Standing.Down(bodyEnt); } } } - private void PartRemoveDamage(EntityUid parent, BodyPartComponent component, BodyComponent? bodyComp = null) + private void PartRemoveDamage(Entity bodyEnt, Entity partEnt) { - if (!Resolve(parent, ref bodyComp, false)) + if (!Resolve(bodyEnt, ref bodyEnt.Comp, logMissing: false)) return; - if (!_timing.ApplyingState && component.IsVital && !GetBodyChildrenOfType(parent, component.PartType, bodyComp).Any()) + if (!_timing.ApplyingState + && partEnt.Comp.IsVital + && !GetBodyChildrenOfType(bodyEnt, partEnt.Comp.PartType, bodyEnt.Comp).Any() + ) { // TODO BODY SYSTEM KILL : remove this when wounding and required parts are implemented properly var damage = new DamageSpecifier(Prototypes.Index("Bloodloss"), 300); - Damageable.TryChangeDamage(parent, damage); + Damageable.TryChangeDamage(bodyEnt, damage); } } @@ -212,7 +215,8 @@ private void PartRemoveDamage(EntityUid parent, BodyPartComponent component, Bod var parent = container.Owner; - if (!TryComp(parent, out var parentBody) || !parentBody.Children.ContainsKey(slotId)) + if (!TryComp(parent, out var parentBody) + || !parentBody.Children.ContainsKey(slotId)) return null; return (parent, slotId); @@ -252,7 +256,7 @@ public bool TryGetParentBodyPart( BodyPartType partType, BodyPartComponent? part = null) { - if (!Resolve(partUid, ref part, false)) + if (!Resolve(partUid, ref part, logMissing: false)) return null; Containers.EnsureContainer(partUid, GetPartSlotContainerId(slotId)); @@ -275,8 +279,8 @@ public bool TryCreatePartSlot( { slot = null; - if (partId == null || - !Resolve(partId.Value, ref part, false)) + if (partId is null + || !Resolve(partId.Value, ref part, logMissing: false)) { return false; } @@ -310,24 +314,31 @@ public bool TryCreatePartSlotAndAttach( /// /// Returns true if the partId is the root body container for the specified bodyId. /// - public bool IsPartRoot(EntityUid bodyId, EntityUid partId, BodyComponent? body = null, BodyPartComponent? part = null) + public bool IsPartRoot( + EntityUid bodyId, + EntityUid partId, + BodyComponent? body = null, + BodyPartComponent? part = null) { - if (!Resolve(partId, ref part)|| !Resolve(bodyId, ref body)) - return false; - - return Containers.TryGetContainingContainer(bodyId, partId, out var container) && container.ID == BodyRootContainerId; + return Resolve(partId, ref part) + && Resolve(bodyId, ref body) + && Containers.TryGetContainingContainer(bodyId, partId, out var container) + && container.ID == BodyRootContainerId; } /// /// Returns true if we can attach the partId to the bodyId as the root entity. /// - public bool CanAttachToRoot(EntityUid bodyId, EntityUid partId, BodyComponent? body = null, + public bool CanAttachToRoot( + EntityUid bodyId, + EntityUid partId, + BodyComponent? body = null, BodyPartComponent? part = null) { - return Resolve(bodyId, ref body) && - Resolve(partId, ref part) && - body.RootContainer.ContainedEntity == null && - bodyId != part.Body; + return Resolve(bodyId, ref body) + && Resolve(partId, ref part) + && body.RootContainer.ContainedEntity is null + && bodyId != part.Body; } /// @@ -335,8 +346,11 @@ public bool CanAttachToRoot(EntityUid bodyId, EntityUid partId, BodyComponent? b /// public (EntityUid Entity, BodyPartComponent BodyPart)? GetRootPartOrNull(EntityUid bodyId, BodyComponent? body = null) { - if (!Resolve(bodyId, ref body) || body.RootContainer.ContainedEntity == null) + if (!Resolve(bodyId, ref body) + || body.RootContainer.ContainedEntity is null) + { return null; + } return (body.RootContainer.ContainedEntity.Value, Comp(body.RootContainer.ContainedEntity.Value)); @@ -352,13 +366,9 @@ public bool CanAttachPart( BodyPartComponent? parentPart = null, BodyPartComponent? part = null) { - if (!Resolve(partId, ref part, false) || - !Resolve(parentId, ref parentPart, false)) - { - return false; - } - - return CanAttachPart(parentId, slot.Id, partId, parentPart, part); + return Resolve(partId, ref part, logMissing: false) + && Resolve(parentId, ref parentPart, logMissing: false) + && CanAttachPart(parentId, slot.Id, partId, parentPart, part); } /// @@ -371,16 +381,12 @@ public bool CanAttachPart( BodyPartComponent? parentPart = null, BodyPartComponent? part = null) { - if (!Resolve(partId, ref part, false) || - !Resolve(parentId, ref parentPart, false) || - !parentPart.Children.TryGetValue(slotId, out var parentSlotData)) - { - return false; - } - - return part.PartType == parentSlotData.Type && - Containers.TryGetContainer(parentId, GetPartSlotContainerId(slotId), out var container) && - Containers.CanInsert(partId, container); + return Resolve(partId, ref part, logMissing: false) + && Resolve(parentId, ref parentPart, logMissing: false) + && parentPart.Children.TryGetValue(slotId, out var parentSlotData) + && part.PartType == parentSlotData.Type + && Containers.TryGetContainer(parentId, GetPartSlotContainerId(slotId), out var container) + && Containers.CanInsert(partId, container); } public bool AttachPartToRoot( @@ -389,14 +395,10 @@ public bool AttachPartToRoot( BodyComponent? body = null, BodyPartComponent? part = null) { - if (!Resolve(bodyId, ref body) || - !Resolve(partId, ref part) || - !CanAttachToRoot(bodyId, partId, body, part)) - { - return false; - } - - return Containers.Insert(partId, body.RootContainer); + return Resolve(bodyId, ref body) + && Resolve(partId, ref part) + && CanAttachToRoot(bodyId, partId, body, part) + && Containers.Insert(partId, body.RootContainer); } #endregion @@ -406,20 +408,16 @@ public bool AttachPartToRoot( /// /// Attaches a body part to the specified body part parent. /// - public bool AttachPart( - EntityUid parentPartId, - string slotId, - EntityUid partId, - BodyPartComponent? parentPart = null, - BodyPartComponent? part = null) - { - if (!Resolve(parentPartId, ref parentPart, false) || - !parentPart.Children.TryGetValue(slotId, out var slot)) - { - return false; - } - - return AttachPart(parentPartId, slot, partId, parentPart, part); + public bool AttachPart( + EntityUid parentPartId, + string slotId, + EntityUid partId, + BodyPartComponent? parentPart = null, + BodyPartComponent? part = null) + { + return Resolve(parentPartId, ref parentPart, logMissing: false) + && parentPart.Children.TryGetValue(slotId, out var slot) + && AttachPart(parentPartId, slot, partId, parentPart, part); } /// @@ -432,10 +430,10 @@ public bool AttachPart( BodyPartComponent? parentPart = null, BodyPartComponent? part = null) { - if (!Resolve(parentPartId, ref parentPart, false) || - !Resolve(partId, ref part, false) || - !CanAttachPart(parentPartId, slot.Id, partId, parentPart, part) || - !parentPart.Children.ContainsKey(slot.Id)) + if (!Resolve(parentPartId, ref parentPart, logMissing: false) + || !Resolve(partId, ref part, logMissing: false) + || !CanAttachPart(parentPartId, slot.Id, partId, parentPart, part) + || !parentPart.Children.ContainsKey(slot.Id)) { return false; } @@ -453,13 +451,16 @@ public bool AttachPart( #region Misc - public void UpdateMovementSpeed(EntityUid bodyId, BodyComponent? body = null, MovementSpeedModifierComponent? movement = null) + public void UpdateMovementSpeed( + EntityUid bodyId, + BodyComponent? body = null, + MovementSpeedModifierComponent? movement = null) { - if (!Resolve(bodyId, ref body, ref movement, false)) - return; - - if (body.RequiredLegs <= 0) + if (!Resolve(bodyId, ref body, ref movement, logMissing: false) + || body.RequiredLegs <= 0) + { return; + } var walkSpeed = 0f; var sprintSpeed = 0f; @@ -488,7 +489,7 @@ public void UpdateMovementSpeed(EntityUid bodyId, BodyComponent? body = null, Mo /// public IEnumerable<(EntityUid Id, OrganComponent Component)> GetPartOrgans(EntityUid partId, BodyPartComponent? part = null) { - if (!Resolve(partId, ref part, false)) + if (!Resolve(partId, ref part, logMissing: false)) yield break; foreach (var slotId in part.Organs.Keys) @@ -513,7 +514,7 @@ public void UpdateMovementSpeed(EntityUid bodyId, BodyComponent? body = null, Mo /// public IEnumerable GetPartContainers(EntityUid id, BodyPartComponent? part = null) { - if (!Resolve(id, ref part, false) || + if (!Resolve(id, ref part, logMissing: false) || part.Children.Count == 0) { yield break; @@ -541,9 +542,11 @@ public IEnumerable GetPartContainers(EntityUid id, BodyPartCompon /// /// Returns all body part components for this entity including itself. /// - public IEnumerable<(EntityUid Id, BodyPartComponent Component)> GetBodyPartChildren(EntityUid partId, BodyPartComponent? part = null) + public IEnumerable<(EntityUid Id, BodyPartComponent Component)> GetBodyPartChildren( + EntityUid partId, + BodyPartComponent? part = null) { - if (!Resolve(partId, ref part, false)) + if (!Resolve(partId, ref part, logMissing: false)) yield break; yield return (partId, part); @@ -571,9 +574,11 @@ public IEnumerable GetPartContainers(EntityUid id, BodyPartCompon /// /// Returns all body part slots for this entity. /// - public IEnumerable GetAllBodyPartSlots(EntityUid partId, BodyPartComponent? part = null) + public IEnumerable GetAllBodyPartSlots( + EntityUid partId, + BodyPartComponent? part = null) { - if (!Resolve(partId, ref part, false)) + if (!Resolve(partId, ref part, logMissing: false)) yield break; foreach (var (slotId, slot) in part.Children) @@ -601,7 +606,10 @@ public IEnumerable GetAllBodyPartSlots(EntityUid partId, BodyPartC /// /// Returns true if the bodyId has any parts of this type. /// - public bool BodyHasPartType(EntityUid bodyId, BodyPartType type, BodyComponent? body = null) + public bool BodyHasPartType( + EntityUid bodyId, + BodyPartType type, + BodyComponent? body = null) { return GetBodyChildrenOfType(bodyId, type, body).Any(); } @@ -615,8 +623,8 @@ public bool PartHasChild( BodyPartComponent? parent, BodyPartComponent? child) { - if (!Resolve(parentId, ref parent, false) || - !Resolve(childId, ref child, false)) + if (!Resolve(parentId, ref parent, logMissing: false) + || !Resolve(childId, ref child, logMissing: false)) { return false; } @@ -638,15 +646,11 @@ public bool BodyHasChild( BodyComponent? body = null, BodyPartComponent? part = null) { - if (!Resolve(bodyId, ref body, false) || - body.RootContainer.ContainedEntity == null || - !Resolve(partId, ref part, false) || - !TryComp(body.RootContainer.ContainedEntity, out BodyPartComponent? rootPart)) - { - return false; - } - - return PartHasChild(body.RootContainer.ContainedEntity.Value, partId, rootPart, part); + return Resolve(bodyId, ref body, logMissing: false) + && body.RootContainer.ContainedEntity is not null + && Resolve(partId, ref part, logMissing: false) + && TryComp(body.RootContainer.ContainedEntity, out BodyPartComponent? rootPart) + && PartHasChild(body.RootContainer.ContainedEntity.Value, partId, rootPart, part); } public IEnumerable<(EntityUid Id, BodyPartComponent Component)> GetBodyChildrenOfType( @@ -721,9 +725,11 @@ public bool TryGetBodyPartOrganComponents( /// /// Gets the parent body part and all immediate child body parts for the partId. /// - public IEnumerable GetBodyPartAdjacentParts(EntityUid partId, BodyPartComponent? part = null) + public IEnumerable GetBodyPartAdjacentParts( + EntityUid partId, + BodyPartComponent? part = null) { - if (!Resolve(partId, ref part, false)) + if (!Resolve(partId, ref part, logMissing: false)) yield break; if (TryGetParentBodyPart(partId, out var parentUid, out _)) @@ -745,7 +751,7 @@ public IEnumerable GetBodyPartAdjacentParts(EntityUid partId, BodyPar BodyPartComponent? part = null) where T : IComponent { - if (!Resolve(partId, ref part, false)) + if (!Resolve(partId, ref part, logMissing: false)) yield break; var query = GetEntityQuery(); @@ -762,7 +768,7 @@ public bool TryGetBodyPartAdjacentPartsComponents( BodyPartComponent? part = null) where T : IComponent { - if (!Resolve(partId, ref part, false)) + if (!Resolve(partId, ref part, logMissing: false)) { comps = null; return false; diff --git a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs index 8172947a039..3355713bb2e 100644 --- a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs +++ b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs @@ -10,7 +10,6 @@ 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; @@ -19,6 +18,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; @@ -348,11 +348,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); } } @@ -361,12 +361,12 @@ public bool TryBuckle(EntityUid buckleUid, EntityUid userUid, EntityUid strapUid _physics.ResetDynamics(buckleUid, 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 8f683356637..67218657e52 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/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index f8943a9bf90..2ba535c2539 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -173,6 +173,33 @@ public static readonly CVarDef public static readonly CVarDef GameLobbyEnableWin = CVarDef.Create("game.enablewin", true, CVar.ARCHIVE); + /// + /// Minimum time between Basic station events in seconds + /// + public static readonly CVarDef // 5 Minutes + GameEventsBasicMinimumTime = CVarDef.Create("game.events_basic_minimum_time", 300, CVar.SERVERONLY); + + /// + /// Maximum time between Basic station events in seconds + /// + public static readonly CVarDef // 25 Minutes + GameEventsBasicMaximumTime = CVarDef.Create("game.events_basic_maximum_time", 1500, CVar.SERVERONLY); + + /// + /// Minimum time between Ramping station events in seconds + /// + public static readonly CVarDef // 4 Minutes + GameEventsRampingMinimumTime = CVarDef.Create("game.events_ramping_minimum_time", 240, CVar.SERVERONLY); + + /// + /// Maximum time between Ramping station events in seconds + /// + public static readonly CVarDef // 12 Minutes + GameEventsRampingMaximumTime = CVarDef.Create("game.events_ramping_maximum_time", 720, CVar.SERVERONLY); + + /// + /// + /// /// Controls the maximum number of character slots a player is allowed to have. /// @@ -341,14 +368,34 @@ public static readonly CVarDef public static readonly CVarDef DebugCoordinatesAdminOnly = CVarDef.Create("game.debug_coordinates_admin_only", true, CVar.SERVER | CVar.REPLICATED); + + /// + /// Whether to allow characters to select traits. + /// + public static readonly CVarDef GameTraitsEnabled = + CVarDef.Create("game.traits_enabled", true, CVar.REPLICATED); + + /// + /// How many traits a character can have at most. + /// + public static readonly CVarDef GameTraitsMax = + CVarDef.Create("game.traits_max", 5, CVar.REPLICATED); + + /// + /// How many points a character should start with. + /// + public static readonly CVarDef GameTraitsDefaultPoints = + CVarDef.Create("game.traits_default_points", 5, CVar.REPLICATED); + + /// - /// Whether or not to allow characters to select loadout items. + /// Whether to allow characters to select loadout items. /// public static readonly CVarDef GameLoadoutsEnabled = CVarDef.Create("game.loadouts_enabled", true, CVar.REPLICATED); /// - /// How many points to give to each player for loadouts. + /// How many points to give to each player for loadouts. /// public static readonly CVarDef GameLoadoutsPoints = CVarDef.Create("game.loadouts_points", 14, CVar.REPLICATED); @@ -388,6 +435,36 @@ public static readonly CVarDef CVarDef.Create("game.round_end_sound_collection", "RoundEnd", CVar.SERVERONLY); + /* + * Announcers + */ + + /// + /// Weighted list of announcers to choose from + /// + public static readonly CVarDef AnnouncerList = + CVarDef.Create("announcer.list", "RandomAnnouncers", CVar.REPLICATED); + + /// + /// Optionally force set an announcer + /// + public static readonly CVarDef Announcer = + CVarDef.Create("announcer.announcer", "", CVar.SERVERONLY); + + /// + /// Optionally blacklist announcers + /// List of IDs separated by commas + /// + public static readonly CVarDef AnnouncerBlacklist = + CVarDef.Create("announcer.blacklist", "", CVar.SERVERONLY); + + /// + /// Changes how loud the announcers are for the client + /// + public static readonly CVarDef AnnouncerVolume = + CVarDef.Create("announcer.volume", 0.5f, CVar.ARCHIVE | CVar.CLIENTONLY); + + /* * Queue */ @@ -396,8 +473,8 @@ public static readonly CVarDef /// Controls if the connections queue is enabled /// If enabled plyaers will be added to a queue instead of being kicked after SoftMaxPlayers is reached /// - public static readonly CVarDef - QueueEnabled = CVarDef.Create("queue.enabled", false, CVar.SERVERONLY); + public static readonly CVarDef QueueEnabled = + CVarDef.Create("queue.enabled", false, CVar.SERVERONLY); /* @@ -763,6 +840,9 @@ public static readonly CVarDef public static readonly CVarDef CombatModeIndicatorsPointShow = CVarDef.Create("hud.combat_mode_indicators_point_show", true, CVar.ARCHIVE | CVar.CLIENTONLY); + public static readonly CVarDef OfferModeIndicatorsPointShow = + CVarDef.Create("hud.offer_mode_indicators_point_show", true, CVar.ARCHIVE | CVar.CLIENTONLY); + public static readonly CVarDef LoocAboveHeadShow = CVarDef.Create("hud.show_looc_above_head", true, CVar.ARCHIVE | CVar.CLIENTONLY); @@ -1089,7 +1169,7 @@ public static readonly CVarDef /// Useful to prevent clipping through objects. /// public static readonly CVarDef SpaceWindMaxVelocity = - CVarDef.Create("atmos.space_wind_max_velocity", 30f, CVar.SERVERONLY); + CVarDef.Create("atmos.space_wind_max_velocity", 15f, CVar.SERVERONLY); /// /// The maximum force that may be applied to an object by pushing (i.e. not throwing) atmospheric pressure differences. @@ -1098,6 +1178,24 @@ public static readonly CVarDef public static readonly CVarDef SpaceWindMaxPushForce = CVarDef.Create("atmos.space_wind_max_push_force", 20f, CVar.SERVERONLY); + /// + /// If an object's mass is below this number, then this number is used in place of mass to determine whether air pressure can throw an object. + /// This has nothing to do with throwing force, only acting as a way of reducing the odds of tiny 5 gram objects from being yeeted by people's breath + /// + /// + /// If you are reading this because you want to change it, consider looking into why almost every item in the game weighs only 5 grams + /// And maybe do your part to fix that? :) + /// + public static readonly CVarDef SpaceWindMinimumCalculatedMass = + CVarDef.Create("atmos.space_wind_minimum_calculated_mass", 10f, CVar.SERVERONLY); + + /// + /// Calculated as 1/Mass, where Mass is the physics.Mass of the desired threshold. + /// If an object's inverse mass is lower than this, it is capped at this. Basically, an upper limit to how heavy an object can be before it stops resisting space wind more. + /// + public static readonly CVarDef SpaceWindMaximumCalculatedInverseMass = + CVarDef.Create("atmos.space_wind_maximum_calculated_inverse_mass", 0.04f, CVar.SERVERONLY); + /// /// Whether monstermos tile equalization is enabled. /// @@ -1119,7 +1217,21 @@ public static readonly CVarDef /// Also looks weird on slow spacing for unrelated reasons. If you do want to enable this, you should probably turn on instaspacing. /// public static readonly CVarDef MonstermosRipTiles = - CVarDef.Create("atmos.monstermos_rip_tiles", false, CVar.SERVERONLY); + CVarDef.Create("atmos.monstermos_rip_tiles", true, CVar.SERVERONLY); + + /// + /// Taken as the cube of a tile's mass, this acts as a minimum threshold of mass for which air pressure calculates whether or not to rip a tile from the floor + /// This should be set by default to the cube of the game's lowest mass tile as defined in their prototypes, but can be increased for server performance reasons + /// + public static readonly CVarDef MonstermosRipTilesMinimumPressure = + CVarDef.Create("atmos.monstermos_rip_tiles_min_pressure", 7500f, CVar.SERVERONLY); + + /// + /// Taken after the minimum pressure is checked, the effective pressure is multiplied by this amount. + /// This allows server hosts to finely tune how likely floor tiles are to be ripped apart by air pressure + /// + public static readonly CVarDef MonstermosRipTilesPressureOffset = + CVarDef.Create("atmos.monstermos_rip_tiles_pressure_offset", 0.44f, CVar.SERVERONLY); /// /// Whether explosive depressurization will cause the grid to gain an impulse. @@ -1150,6 +1262,13 @@ public static readonly CVarDef public static readonly CVarDef AtmosSpacingMaxWind = CVarDef.Create("atmos.mmos_max_wind", 500f, CVar.SERVERONLY); + /// + /// Increases default airflow calculations to O(n^2) complexity, for use with heavy space wind optimizations. Potato servers BEWARE + /// This solves the problem of objects being trapped in an infinite loop of slamming into a wall repeatedly. + /// + public static readonly CVarDef MonstermosUseExpensiveAirflow = + CVarDef.Create("atmos.mmos_expensive_airflow", true, CVar.SERVERONLY); + /// /// Whether atmos superconduction is enabled. /// @@ -1206,6 +1325,13 @@ public static readonly CVarDef public static readonly CVarDef AtmosHeatScale = CVarDef.Create("atmos.heat_scale", 8f, CVar.SERVERONLY); + /// + /// A multiplier on the amount of force applied to Humanoid entities, as tracked by HumanoidAppearanceComponent + /// This multiplier is added after all other checks are made, and applies to both throwing force, and how easy it is for an entity to be thrown. + /// + public static readonly CVarDef AtmosHumanoidThrowMultiplier = + CVarDef.Create("atmos.humanoid_throw_multiplier", 2f, CVar.SERVERONLY); + /* * MIDI instruments */ @@ -1591,15 +1717,32 @@ public static readonly CVarDef public static readonly CVarDef ViewportWidth = CVarDef.Create("viewport.width", 21, CVar.CLIENTONLY | CVar.ARCHIVE); + /* + * FOV + */ + + /// + /// The number by which the current FOV size is divided for each level. + /// + public static readonly CVarDef ZoomLevelStep = + CVarDef.Create("fov.zoom_step", 1.2f, CVar.SERVER | CVar.REPLICATED); + + /// + /// How many times the player can zoom in until they reach the minimum zoom. + /// This does not affect the maximum zoom. + /// + public static readonly CVarDef ZoomLevels = + CVarDef.Create("fov.zoom_levels", 7, CVar.SERVER | CVar.REPLICATED); + /* * UI */ public static readonly CVarDef UILayout = - CVarDef.Create("ui.layout", "Default", CVar.CLIENTONLY | CVar.ARCHIVE); + CVarDef.Create("ui.layout", "Separated", CVar.CLIENTONLY | CVar.ARCHIVE); - public static readonly CVarDef DefaultScreenChatSize = - CVarDef.Create("ui.default_chat_size", "", CVar.CLIENTONLY | CVar.ARCHIVE); + public static readonly CVarDef OverlayScreenChatSize = + CVarDef.Create("ui.overlay_chat_size", "", CVar.CLIENTONLY | CVar.ARCHIVE); public static readonly CVarDef SeparatedScreenChatSize = CVarDef.Create("ui.separated_chat_size", "0.6,0", CVar.CLIENTONLY | CVar.ARCHIVE); @@ -2106,5 +2249,42 @@ public static readonly CVarDef /// public static readonly CVarDef PsionicRollsEnabled = CVarDef.Create("psionics.rolls_enabled", true, CVar.SERVERONLY); + + /// + /// Whether height & width sliders adjust a character's Fixture Component + /// + public static readonly CVarDef HeightAdjustModifiesHitbox = + CVarDef.Create("heightadjust.modifies_hitbox", true, CVar.SERVERONLY); + + /// + /// Whether height & width sliders adjust a player's max view distance + /// + public static readonly CVarDef HeightAdjustModifiesZoom = + CVarDef.Create("heightadjust.modifies_zoom", true, CVar.SERVERONLY); + + /// + /// Enables station goals + /// + public static readonly CVarDef StationGoalsEnabled = + CVarDef.Create("game.station_goals", true, CVar.SERVERONLY); + + /// + /// Chance for a station goal to be sent + /// + public static readonly CVarDef StationGoalsChance = + CVarDef.Create("game.station_goals_chance", 0.1f, CVar.SERVERONLY); + + /// + /// Toggles all MassContest functions. All mass contests output 1f when false + /// + public static readonly CVarDef DoMassContests = + CVarDef.Create("contests.do_mass_contests", true, CVar.REPLICATED | CVar.SERVER); + + /// + /// The maximum amount that Mass Contests can modify a physics multiplier, given as a +/- percentage + /// Default of 0.25f outputs between * 0.75f and 1.25f + /// + public static readonly CVarDef MassContestsMaxPercentage = + CVarDef.Create("contests.max_percentage", 0.25f, CVar.REPLICATED | CVar.SERVER); } } diff --git a/Content.Shared/Chasm/ChasmSystem.cs b/Content.Shared/Chasm/ChasmSystem.cs index 51299557dbd..86b8d4fc4d7 100644 --- a/Content.Shared/Chasm/ChasmSystem.cs +++ b/Content.Shared/Chasm/ChasmSystem.cs @@ -24,7 +24,7 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnStepTriggered); + SubscribeLocalEvent(OnStepTriggered); SubscribeLocalEvent(OnStepTriggerAttempt); SubscribeLocalEvent(OnUpdateCanMove); } @@ -47,7 +47,7 @@ public override void Update(float frameTime) } } - private void OnStepTriggered(EntityUid uid, ChasmComponent component, ref StepTriggeredEvent args) + private void OnStepTriggered(EntityUid uid, ChasmComponent component, ref StepTriggeredOffEvent args) { // already doomed if (HasComp(args.Tripper)) diff --git a/Content.Shared/Chat/V2/Moderation/ChatCensor.cs b/Content.Shared/Chat/V2/Moderation/ChatCensor.cs new file mode 100644 index 00000000000..b5d6aa03441 --- /dev/null +++ b/Content.Shared/Chat/V2/Moderation/ChatCensor.cs @@ -0,0 +1,59 @@ +using System.Linq; + +namespace Content.Shared.Chat.V2.Moderation; + +public interface IChatCensor +{ + public bool Censor(string input, out string output, char replaceWith = '*'); +} + +public sealed class CompoundChatCensor(IEnumerable censors) : IChatCensor +{ + public bool Censor(string input, out string output, char replaceWith = '*') + { + var censored = false; + + foreach (var censor in censors) + { + if (censor.Censor(input, out output, replaceWith)) + { + censored = true; + } + } + + output = input; + + return censored; + } +} + +public sealed class ChatCensorFactory +{ + private List _censors = new(); + + public void With(IChatCensor censor) + { + _censors.Add(censor); + } + + /// + /// Builds a ChatCensor that combines all the censors that have been added to this. + /// + public IChatCensor Build() + { + return new CompoundChatCensor(_censors.ToArray()); + } + + /// + /// Resets the build state to zero, allowing for different rules to be provided to the next censor(s) built. + /// + /// True if the builder had any setup prior to the reset. + public bool Reset() + { + var notEmpty = _censors.Count > 0; + + _censors = new List(); + + return notEmpty; + } +} diff --git a/Content.Shared/Chat/V2/Moderation/RegexCensor.cs b/Content.Shared/Chat/V2/Moderation/RegexCensor.cs new file mode 100644 index 00000000000..cd47bf0c33c --- /dev/null +++ b/Content.Shared/Chat/V2/Moderation/RegexCensor.cs @@ -0,0 +1,15 @@ +using System.Text.RegularExpressions; + +namespace Content.Shared.Chat.V2.Moderation; + +public sealed class RegexCensor(Regex censorInstruction) : IChatCensor +{ + private readonly Regex _censorInstruction = censorInstruction; + + public bool Censor(string input, out string output, char replaceWith = '*') + { + output = _censorInstruction.Replace(input, replaceWith.ToString()); + + return !string.Equals(input, output); + } +} diff --git a/Content.Shared/Chat/V2/Moderation/SimpleCensor.cs b/Content.Shared/Chat/V2/Moderation/SimpleCensor.cs new file mode 100644 index 00000000000..a6bb70dd9f6 --- /dev/null +++ b/Content.Shared/Chat/V2/Moderation/SimpleCensor.cs @@ -0,0 +1,340 @@ +using System.Collections.Frozen; +using System.Linq; +using System.Text; +using System.Text.Unicode; + +namespace Content.Shared.Chat.V2.Moderation; + +/// +/// A basic censor. Not bullet-proof. +/// +public sealed class SimpleCensor : IChatCensor +{ + // Common substitution symbols are replaced with one of the characters they commonly substitute. + private bool _shouldSanitizeLeetspeak; + private FrozenDictionary _leetspeakReplacements = FrozenDictionary.Empty; + + // Special characters are replaced with spaces. + private bool _shouldSanitizeSpecialCharacters; + private HashSet _specialCharacterReplacements = []; + + // Censored words are removed unless they're a false positive (e.g. Scunthorpe) + private string[] _censoredWords = Array.Empty(); + private string[] _falsePositives = Array.Empty(); + + // False negatives are censored words that contain a false positives. + private string[] _falseNegatives = Array.Empty(); + + // What unicode ranges are allowed? If this array is empty, don't filter by range. + private UnicodeRange[] _allowedUnicodeRanges= Array.Empty(); + + /// + /// Censors the input string. + /// + /// The input string + /// The output string + /// The character to replace with + /// If output is valid + public bool Censor(string input, out string output, char replaceWith = '*') + { + output = Censor(input, replaceWith); + + return !string.Equals(input, output); + } + + public string Censor(string input, char replaceWith = '*') + { + // We flat-out ban anything not in the allowed unicode ranges, stripping them + input = SanitizeOutBlockedUnicode(input); + + var originalInput = input.ToCharArray(); + + input = SanitizeInput(input); + + var censored = input.ToList(); + + // Remove false negatives + input = CheckProfanity(input, censored, _falseNegatives, replaceWith); + + // Get false positives + var falsePositives = FindFalsePositives(censored, replaceWith); + + // Remove censored words + CheckProfanity(input, censored, _censoredWords, replaceWith); + + // Reconstruct + // Reconstruct false positives + for (var i = 0; i < falsePositives.Length; i++) + { + if (falsePositives[i] != replaceWith) + { + censored[i] = falsePositives[i]; + } + } + + for (var i = 0; i < originalInput.Length; i++) + { + if (originalInput[i] == ' ') + { + censored.Insert(i, ' '); + + continue; + } + + if (_shouldSanitizeSpecialCharacters && _specialCharacterReplacements.Contains(originalInput[i])) + { + censored.Insert(i, originalInput[i]); + + continue; + } + + if (_shouldSanitizeLeetspeak || _shouldSanitizeSpecialCharacters) + { + // detect "()" + if (originalInput[i] == '(' && i != originalInput.Length - 1 && originalInput[i+1] == ')') + { + // censored has now had "o" replaced with "o) so both strings line up again..." + censored.Insert(i+1, censored[i] != replaceWith ? ')' : replaceWith); + } + } + + if (censored[i] != replaceWith) + { + censored[i] = originalInput[i]; + } + } + + // SO says this is fast... + return string.Concat(censored); + } + + /// + /// Adds a l33tsp34k sanitization rule + /// + /// The censor for further configuration + public SimpleCensor WithSanitizeLeetSpeak() + { + _shouldSanitizeLeetspeak = true; + + return BuildCharacterReplacements(); + } + + /// + /// Adds a l33tsp34k sanitization rule + /// + /// The censor for further configuration + public SimpleCensor WithSanitizeSpecialCharacters() + { + _shouldSanitizeSpecialCharacters = true; + + return BuildCharacterReplacements(); + } + + public SimpleCensor WithRanges(UnicodeRange[] ranges) + { + _allowedUnicodeRanges = ranges; + + return this; + } + + public SimpleCensor WithCustomDictionary(string[] naughtyWords) + { + _censoredWords = naughtyWords; + + return this; + } + + public SimpleCensor WithFalsePositives(string[] falsePositives) + { + _falsePositives = falsePositives; + + return this; + } + + public SimpleCensor WithFalseNegatives(string[] falseNegatives) + { + _falseNegatives = falseNegatives; + + return this; + } + + public SimpleCensor WithLeetspeakReplacements(Dictionary replacements) + { + _leetspeakReplacements = replacements.ToFrozenDictionary(); + + return this; + } + + public SimpleCensor WithSpecialCharacterReplacements(Dictionary replacements) + { + _leetspeakReplacements = replacements.ToFrozenDictionary(); + + return this; + } + + private string CheckProfanity(string input, List censored, string[] words, char replaceWith = '*') + { + foreach (var word in words) + { + var wordLength = word.Length; + var endOfFoundWord = 0; + var foundIndex = input.IndexOf(word, endOfFoundWord, StringComparison.OrdinalIgnoreCase); + + while(foundIndex > -1) + { + endOfFoundWord = foundIndex + wordLength; + + for (var i = 0; i < wordLength; i++) + { + censored[foundIndex+i] = replaceWith; + } + + foundIndex = input.IndexOf(word, endOfFoundWord, StringComparison.OrdinalIgnoreCase); + } + } + + return input; + } + + private char[] FindFalsePositives(List chars, char replaceWith = '*') + { + var input = string.Concat(chars); + + var output = Enumerable.Repeat(replaceWith, input.Length).ToArray(); + var inputAsARr = input.ToArray(); + + foreach (var word in _falsePositives) + { + var wordLength = word.Length; + var endOfFoundWord = 0; + var foundIndex = input.IndexOf(word, endOfFoundWord, StringComparison.OrdinalIgnoreCase); + + while(foundIndex > -1) + { + endOfFoundWord = foundIndex + wordLength; + + for (var i = foundIndex; i < endOfFoundWord; i++) + { + output[i] = inputAsARr[i]; + } + + foundIndex = input.IndexOf(word, endOfFoundWord, StringComparison.OrdinalIgnoreCase); + } + } + + return output; + } + + private string SanitizeInput(string input) + { + // "()" is a broad enough trick to beat censors that we we should check for it broadly. + if (_shouldSanitizeLeetspeak || _shouldSanitizeSpecialCharacters) + { + input = input.Replace("()", "o"); + } + + var sb = new StringBuilder(); + + // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator + foreach (var character in input) + { + if (character == ' ' || _shouldSanitizeSpecialCharacters && _specialCharacterReplacements.Contains(character)) + { + continue; + } + + if (_shouldSanitizeLeetspeak && _leetspeakReplacements.TryGetValue(character, out var leetRepl)) + { + sb.Append(leetRepl); + + continue; + } + + sb.Append(character); + } + + return sb.ToString(); + } + + /// + /// Returns a string with all characters not in ISO-8851-1 replaced with question marks + /// + private string SanitizeOutBlockedUnicode(string input) + { + if (_allowedUnicodeRanges.Length <= 0) + { + return input; + } + + var sb = new StringBuilder(); + + foreach (var symbol in input.EnumerateRunes()) + { + // ReSharper disable once LoopCanBeConvertedToQuery + foreach (var range in _allowedUnicodeRanges) + { + if (symbol.Value < range.FirstCodePoint || symbol.Value >= range.FirstCodePoint + range.Length) + continue; + + sb.Append(symbol); + + break; + } + } + + return sb.ToString(); + } + + private SimpleCensor BuildCharacterReplacements() + { + if (_shouldSanitizeSpecialCharacters) + { + _specialCharacterReplacements = + [ + '-', + '_', + '|', + '.', + ',', + '(', + ')', + '<', + '>', + '"', + '`', + '~', + '*', + '&', + '%', + '$', + '#', + '@', + '!', + '?', + '+' + ]; + } + + if (_shouldSanitizeLeetspeak) + { + _leetspeakReplacements = new Dictionary + { + ['4'] = 'a', + ['$'] = 's', + ['!'] = 'i', + ['+'] = 't', + ['#'] = 'h', + ['@'] = 'a', + ['0'] = 'o', + ['1'] = 'i', // also obviously can be l; gamer-words need i's more though. + ['7'] = 'l', + ['3'] = 'e', + ['5'] = 's', + ['9'] = 'g', + ['<'] = 'c' + }.ToFrozenDictionary(); + } + + return this; + } +} diff --git a/Content.Shared/Chemistry/Reagent/ReagentEffect.cs b/Content.Shared/Chemistry/Reagent/ReagentEffect.cs index 5bcb21fedb3..41eea55cca4 100644 --- a/Content.Shared/Chemistry/Reagent/ReagentEffect.cs +++ b/Content.Shared/Chemistry/Reagent/ReagentEffect.cs @@ -107,6 +107,7 @@ public readonly record struct ReagentEffectArgs( FixedPoint2 Quantity, IEntityManager EntityManager, ReactionMethod? Method, - float Scale + float Scale = 1f, + float QuantityMultiplier = 1f ); } diff --git a/Content.Shared/Climbing/Systems/ClimbSystem.cs b/Content.Shared/Climbing/Systems/ClimbSystem.cs index 6a2976a8387..fceb6143e19 100644 --- a/Content.Shared/Climbing/Systems/ClimbSystem.cs +++ b/Content.Shared/Climbing/Systems/ClimbSystem.cs @@ -34,7 +34,6 @@ public sealed partial class ClimbSystem : VirtualController [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly FixtureSystem _fixtureSystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedBodySystem _bodySystem = default!; [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; diff --git a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs index f189db005bc..976682c9903 100644 --- a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs @@ -62,6 +62,11 @@ private void QuickEquip( { foreach (var slotDef in userEnt.Comp1.Slots) { + // Do not attempt to quick-equip clothing in pocket slots. + // We should probably add a special flag to SlotDefinition to skip quick equip if more similar slots get added. + if (slotDef.SlotFlags.HasFlag(SlotFlags.POCKET)) + continue; + if (!_invSystem.CanEquip(userEnt, toEquipEnt, slotDef.Name, out _, slotDef, userEnt, toEquipEnt)) continue; diff --git a/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs index 0138de7a98f..4abe7bc876a 100644 --- a/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs @@ -27,6 +27,7 @@ public sealed class ToggleableClothingSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly SharedStrippableSystem _strippable = default!; + [Dependency] private readonly ThievingSystem _thieving = default!; public override void Initialize() { @@ -95,7 +96,9 @@ 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); + + bool hidden = (stealth == ThievingStealth.Hidden); var args = new DoAfterArgs(EntityManager, user, time, new ToggleClothingDoAfterEvent(), item, wearer, item) { @@ -110,11 +113,8 @@ private void StartDoAfter(EntityUid user, EntityUid item, EntityUid wearer, Togg if (!_doAfter.TryStartDoAfter(args)) return; - if (!stealth) - { - var popup = Loc.GetString("strippable-component-alert-owner-interact", ("user", Identity.Entity(user, EntityManager)), ("item", item)); - _popupSystem.PopupEntity(popup, wearer, wearer, PopupType.Large); - } + if (!hidden) + _strippable.StripPopup("strippable-component-alert-owner-interact", stealth, wearer, user: Identity.Entity(user, EntityManager), item: item); } private void OnGetAttachedStripVerbsEvent(EntityUid uid, AttachedClothingComponent component, GetVerbsEvent args) diff --git a/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutCategoryPrototype.cs b/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutCategoryPrototype.cs index 5dd880d3f1b..445cbc10e6d 100644 --- a/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutCategoryPrototype.cs +++ b/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutCategoryPrototype.cs @@ -2,6 +2,7 @@ namespace Content.Shared.Clothing.Loadouts.Prototypes; + /// /// A prototype defining a valid category for s to go into. /// diff --git a/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutPrototype.cs b/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutPrototype.cs index bc31fc15701..9ca575fa72e 100644 --- a/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutPrototype.cs +++ b/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutPrototype.cs @@ -1,10 +1,12 @@ using Content.Shared.Clothing.Loadouts.Systems; +using Content.Shared.Customization.Systems; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; namespace Content.Shared.Clothing.Loadouts.Prototypes; + [Prototype("loadout")] public sealed class LoadoutPrototype : IPrototype { @@ -17,7 +19,7 @@ public sealed class LoadoutPrototype : IPrototype /// /// Which tab category to put this under /// - [DataField(customTypeSerializer:typeof(PrototypeIdSerializer))] + [DataField, ValidatePrototypeId] public string Category = "Uncategorized"; /// @@ -41,5 +43,5 @@ public sealed class LoadoutPrototype : IPrototype [DataField] - public List Requirements = new(); + public List Requirements = new(); } diff --git a/Content.Shared/Clothing/Loadouts/Systems/LoadoutRequirements.cs b/Content.Shared/Clothing/Loadouts/Systems/LoadoutRequirements.cs deleted file mode 100644 index b76a31e422b..00000000000 --- a/Content.Shared/Clothing/Loadouts/Systems/LoadoutRequirements.cs +++ /dev/null @@ -1,375 +0,0 @@ -using System.Linq; -using Content.Shared.CCVar; -using Content.Shared.Humanoid.Prototypes; -using Content.Shared.Players.PlayTimeTracking; -using Content.Shared.Preferences; -using Content.Shared.Roles; -using Content.Shared.Roles.Jobs; -using Content.Shared.Traits; -using JetBrains.Annotations; -using Robust.Shared.Configuration; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization; -using Robust.Shared.Utility; - -namespace Content.Shared.Clothing.Loadouts.Systems; - -[ImplicitDataDefinitionForInheritors, MeansImplicitUse] -[Serializable, NetSerializable] -public abstract partial class LoadoutRequirement -{ - /// - /// If true valid requirements will be treated as invalid and vice versa - /// - [DataField] - public bool Inverted = false; - - /// - /// Checks if this loadout requirement is valid for the given parameters - /// - /// Description for the requirement, shown when not null - public abstract bool IsValid( - JobPrototype job, - HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, - IPrototypeManager prototypeManager, - IConfigurationManager configManager, - out FormattedMessage? reason - ); -} - - -#region HumanoidCharacterProfile - -/// -/// Requires the profile to be within an age range -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class LoadoutAgeRequirement : LoadoutRequirement -{ - [DataField(required: true)] - public int Min; - - [DataField(required: true)] - public int Max; - - public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, - IConfigurationManager configManager, out FormattedMessage? reason) - { - reason = FormattedMessage.FromMarkup(Loc.GetString("loadout-age-requirement", - ("min", Min), ("max", Max))); - return profile.Age >= Min && profile.Age <= Max; - } -} - -/// -/// Requires the profile to use either a Backpack, Satchel, or Duffelbag -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class LoadoutBackpackTypeRequirement : LoadoutRequirement -{ - [DataField(required: true)] - public BackpackPreference Preference; - - public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, - IConfigurationManager configManager, out FormattedMessage? reason) - { - reason = FormattedMessage.FromMarkup(Loc.GetString("loadout-backpack-type-requirement", - ("type", Loc.GetString($"humanoid-profile-editor-preference-{Preference.ToString().ToLower()}")))); - return profile.Backpack == Preference; - } -} - -/// -/// Requires the profile to use either Jumpsuits or Jumpskirts -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class LoadoutClothingPreferenceRequirement : LoadoutRequirement -{ - [DataField(required: true)] - public ClothingPreference Preference; - - public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, - IConfigurationManager configManager, out FormattedMessage? reason) - { - reason = FormattedMessage.FromMarkup(Loc.GetString("loadout-clothing-preference-requirement", - ("preference", Loc.GetString($"humanoid-profile-editor-preference-{Preference.ToString().ToLower()}")))); - return profile.Clothing == Preference; - } -} - -/// -/// Requires the profile to be a certain species -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class LoadoutSpeciesRequirement : LoadoutRequirement -{ - [DataField(required: true)] - public ProtoId Species; - - public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, - IConfigurationManager configManager, out FormattedMessage? reason) - { - reason = FormattedMessage.FromMarkup(Loc.GetString("loadout-species-requirement", - ("species", Loc.GetString($"species-name-{Species.ToString().ToLower()}")))); - return profile.Species == Species; - } -} - -/// -/// Requires the profile to have a certain trait -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class LoadoutTraitRequirement : LoadoutRequirement -{ - [DataField(required: true)] - public ProtoId Trait; - - public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, - IConfigurationManager configManager, out FormattedMessage? reason) - { - reason = FormattedMessage.FromMarkup(Loc.GetString("loadout-trait-requirement", - ("trait", Loc.GetString($"trait-{Trait.ToString().ToLower()}-name")))); - return profile.TraitPreferences.Contains(Trait.ToString()); - } -} - -#endregion - -#region Jobs - -/// -/// Requires the selected job to be a certain one -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class LoadoutJobRequirement : LoadoutRequirement -{ - [DataField(required: true)] - public List> Jobs; - - public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, - IConfigurationManager configManager, out FormattedMessage? reason) - { - // Join localized job names with a comma - var jobsString = string.Join(", ", Jobs.Select(j => Loc.GetString(prototypeManager.Index(j).Name))); - // Form the reason message - jobsString = Loc.GetString("loadout-job-requirement", ("job", jobsString)); - - reason = FormattedMessage.FromMarkup(jobsString); - return Jobs.Contains(job.ID); - } -} - -/// -/// Requires the playtime for a department to be within a certain range -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class LoadoutDepartmentTimeRequirement : LoadoutRequirement -{ - [DataField] - public TimeSpan Min = TimeSpan.MinValue; - - [DataField] - public TimeSpan Max = TimeSpan.MaxValue; - - [DataField(required: true)] - public ProtoId Department; - - public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, - IConfigurationManager configManager, out FormattedMessage? reason) - { - // Disable the requirement if the role timers are disabled - if (!configManager.GetCVar(CCVars.GameRoleTimers)) - { - reason = null; - return !Inverted; - } - - var department = prototypeManager.Index(Department); - - // Combine all of this department's job playtimes - var playtime = TimeSpan.Zero; - foreach (var other in department.Roles) - { - var proto = prototypeManager.Index(other).PlayTimeTracker; - - playTimes.TryGetValue(proto, out var otherTime); - playtime += otherTime; - } - - if (playtime > Max) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("loadout-timer-department-too-high", - ("time", playtime.Minutes - Max.Minutes), - ("department", Loc.GetString($"department-{department.ID}")), - ("departmentColor", department.Color))); - return false; - } - - if (playtime < Min) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("loadout-timer-department-insufficient", - ("time", Min.Minutes - playtime.Minutes), - ("department", Loc.GetString($"department-{department.ID}")), - ("departmentColor", department.Color))); - return false; - } - - reason = null; - return true; - } -} - -/// -/// Requires the player to have a certain amount of overall job time -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class LoadoutOverallTimeRequirement : LoadoutRequirement -{ - [DataField] - public TimeSpan Min = TimeSpan.MinValue; - - [DataField] - public TimeSpan Max = TimeSpan.MaxValue; - - public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, - IConfigurationManager configManager, out FormattedMessage? reason) - { - // Disable the requirement if the role timers are disabled - if (!configManager.GetCVar(CCVars.GameRoleTimers)) - { - reason = null; - return !Inverted; - } - - // Get the overall time - var overallTime = playTimes.GetValueOrDefault(PlayTimeTrackingShared.TrackerOverall); - - if (overallTime > Max) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("loadout-timer-overall-too-high", - ("time", overallTime.Minutes - Max.Minutes))); - return false; - } - - if (overallTime < Min) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("loadout-timer-overall-insufficient", - ("time", Min.Minutes - overallTime.Minutes))); - return false; - } - - reason = null; - return true; - } -} - -/// -/// Requires the playtime for a tracker to be within a certain range -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class LoadoutPlaytimeRequirement : LoadoutRequirement -{ - [DataField] - public TimeSpan Min = TimeSpan.MinValue; - - [DataField] - public TimeSpan Max = TimeSpan.MaxValue; - - [DataField(required: true)] - public ProtoId Tracker; - - public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, - IConfigurationManager configManager, out FormattedMessage? reason) - { - // Disable the requirement if the role timers are disabled - if (!configManager.GetCVar(CCVars.GameRoleTimers)) - { - reason = null; - return !Inverted; - } - - // Get SharedJobSystem - if (!entityManager.EntitySysManager.TryGetEntitySystem(out SharedJobSystem? jobSystem)) - { - DebugTools.Assert("LoadoutRequirements: SharedJobSystem not found"); - reason = null; - return false; - } - - // Get the JobPrototype of the Tracker - var trackerJob = jobSystem.GetJobPrototype(Tracker); - - // Get the primary department of the Tracker - if (!jobSystem.TryGetPrimaryDepartment(trackerJob, out var department) && - !jobSystem.TryGetDepartment(trackerJob, out department)) - { - DebugTools.Assert($"LoadoutRequirements: Department not found for job {trackerJob}"); - reason = null; - return false; - } - - // Get the time for the tracker - playTimes.TryGetValue(Tracker, out var time); - reason = null; - - if (time > Max) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("loadout-timer-role-too-high", - ("time", time.Minutes - Max.Minutes), - ("job", trackerJob), - ("departmentColor", department.Color))); - return false; - } - - if (time < Min) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("loadout-timer-role-insufficient", - ("time", Min.Minutes - time.Minutes), - ("job", trackerJob), - ("departmentColor", department.Color))); - return false; - } - - return true; - } -} - -#endregion diff --git a/Content.Shared/Clothing/Loadouts/Systems/LoadoutSystem.cs b/Content.Shared/Clothing/Loadouts/Systems/LoadoutSystem.cs index eb9a5dcbc8c..09e3db3793f 100644 --- a/Content.Shared/Clothing/Loadouts/Systems/LoadoutSystem.cs +++ b/Content.Shared/Clothing/Loadouts/Systems/LoadoutSystem.cs @@ -1,5 +1,6 @@ using Content.Shared.Clothing.Components; using Content.Shared.Clothing.Loadouts.Prototypes; +using Content.Shared.Customization.Systems; using Content.Shared.Inventory; using Content.Shared.Preferences; using Content.Shared.Roles; @@ -17,7 +18,8 @@ public sealed class LoadoutSystem : EntitySystem [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly InventorySystem _inventory = default!; - [Dependency] private readonly IConfigurationManager _configurationManager = default!; + [Dependency] private readonly IConfigurationManager _configuration = default!; + [Dependency] private readonly CharacterRequirementsSystem _characterRequirements = default!; public override void Initialize() { @@ -66,8 +68,9 @@ public List ApplyCharacterLoadout(EntityUid uid, JobPrototype job, Hu continue; - if (!CheckRequirementsValid(loadoutProto.Requirements, job, profile, - playTimes ?? new Dictionary(), EntityManager, _prototype, _configurationManager, + if (!_characterRequirements.CheckRequirementsValid(loadoutProto, loadoutProto.Requirements, job, profile, + playTimes ?? new Dictionary(), + EntityManager, _prototype, _configuration, out _)) continue; @@ -115,35 +118,4 @@ public List ApplyCharacterLoadout(EntityUid uid, JobPrototype job, Hu // The server has more information about the inventory system than the client does and the client doesn't need to put loadouts in backpacks return failedLoadouts; } - - - public bool CheckRequirementsValid(List requirements, JobPrototype job, - HumanoidCharacterProfile profile, Dictionary playTimes, IEntityManager entityManager, - IPrototypeManager prototypeManager, IConfigurationManager configManager, out List reasons) - { - reasons = new List(); - var valid = true; - - foreach (var requirement in requirements) - { - // Set valid to false if the requirement is invalid and not inverted, if it's inverted set it to true when it's valid - if (!requirement.IsValid(job, profile, playTimes, entityManager, prototypeManager, configManager, out var reason)) - { - if (valid) - valid = requirement.Inverted; - } - else - { - if (valid) - valid = !requirement.Inverted; - } - - if (reason != null) - { - reasons.Add(reason); - } - } - - return valid; - } } diff --git a/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs b/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs index 70bcfbab43f..c041cf1ba06 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)) @@ -271,7 +270,7 @@ private bool TileFree(EntityCoordinates coordinates, PhysicsComponent anchorBody // Probably ignore CanCollide on the anchoring body? var gridUid = coordinates.GetGridUid(EntityManager); - if (!_mapManager.TryGetGrid(gridUid, out var grid)) + if (!TryComp(gridUid, out var grid)) return false; var tileIndices = grid.TileIndicesFor(coordinates); diff --git a/Content.Shared/Construction/SharedFlatpackSystem.cs b/Content.Shared/Construction/SharedFlatpackSystem.cs index a62488d6f38..8b21bca52ae 100644 --- a/Content.Shared/Construction/SharedFlatpackSystem.cs +++ b/Content.Shared/Construction/SharedFlatpackSystem.cs @@ -114,8 +114,7 @@ public void SetupFlatpack(Entity ent, EntityUid? board) if (!Resolve(ent, ref ent.Comp)) return; - EntProtoId machinePrototypeId; - string? entityPrototype; + var machinePrototypeId = new EntProtoId(); if (TryComp(board, out var machineBoard) && machineBoard.Prototype is not null) machinePrototypeId = machineBoard.Prototype; else if (TryComp(board, out var computerBoard) && computerBoard.Prototype is not null) diff --git a/Content.Shared/Contests/ContestsSystem.cs b/Content.Shared/Contests/ContestsSystem.cs new file mode 100644 index 00000000000..6386bfd7a23 --- /dev/null +++ b/Content.Shared/Contests/ContestsSystem.cs @@ -0,0 +1,116 @@ +using Content.Shared.CCVar; +using Robust.Shared.Configuration; +using Robust.Shared.Physics.Components; + +namespace Content.Shared.Contests +{ + public sealed partial class ContestsSystem : EntitySystem + { + [Dependency] private readonly IConfigurationManager _cfg = default!; + + /// + /// The presumed average mass of a player entity + /// Defaulted to the average mass of an adult human + /// + private const float AverageMass = 71f; + + #region Mass Contests + /// + /// Outputs the ratio of mass between a performer and the average human mass + /// + /// Uid of Performer + public float MassContest(EntityUid performerUid, float otherMass = AverageMass) + { + if (_cfg.GetCVar(CCVars.DoMassContests) + && TryComp(performerUid, out var performerPhysics) + && performerPhysics.Mass != 0) + return Math.Clamp(performerPhysics.Mass / otherMass, 1 - _cfg.GetCVar(CCVars.MassContestsMaxPercentage), 1 + _cfg.GetCVar(CCVars.MassContestsMaxPercentage)); + + return 1f; + } + + /// + /// + /// MaybeMassContest, in case your entity doesn't exist + /// + public float MassContest(EntityUid? performerUid, float otherMass = AverageMass) + { + if (_cfg.GetCVar(CCVars.DoMassContests)) + { + var ratio = performerUid is { } uid ? MassContest(uid, otherMass) : 1f; + return ratio; + } + + return 1f; + } + + /// + /// Outputs the ratio of mass between a performer and the average human mass + /// If a function already has the performer's physics component, this is faster + /// + /// + public float MassContest(PhysicsComponent performerPhysics, float otherMass = AverageMass) + { + if (_cfg.GetCVar(CCVars.DoMassContests) + && performerPhysics.Mass != 0) + return Math.Clamp(performerPhysics.Mass / otherMass, 1 - _cfg.GetCVar(CCVars.MassContestsMaxPercentage), 1 + _cfg.GetCVar(CCVars.MassContestsMaxPercentage)); + + return 1f; + } + + /// + /// Outputs the ratio of mass between a performer and a target, accepts either EntityUids or PhysicsComponents in any combination + /// If you have physics components already in your function, use instead + /// + /// + /// + public float MassContest(EntityUid performerUid, EntityUid targetUid) + { + if (_cfg.GetCVar(CCVars.DoMassContests) + && TryComp(performerUid, out var performerPhysics) + && TryComp(targetUid, out var targetPhysics) + && performerPhysics.Mass != 0 + && targetPhysics.InvMass != 0) + return Math.Clamp(performerPhysics.Mass * targetPhysics.InvMass, 1 - _cfg.GetCVar(CCVars.MassContestsMaxPercentage), 1 + _cfg.GetCVar(CCVars.MassContestsMaxPercentage)); + + return 1f; + } + + /// + public float MassContest(EntityUid performerUid, PhysicsComponent targetPhysics) + { + if (_cfg.GetCVar(CCVars.DoMassContests) + && TryComp(performerUid, out var performerPhysics) + && performerPhysics.Mass != 0 + && targetPhysics.InvMass != 0) + return Math.Clamp(performerPhysics.Mass * targetPhysics.InvMass, 1 - _cfg.GetCVar(CCVars.MassContestsMaxPercentage), 1 + _cfg.GetCVar(CCVars.MassContestsMaxPercentage)); + + return 1f; + } + + /// + public float MassContest(PhysicsComponent performerPhysics, EntityUid targetUid) + { + if (_cfg.GetCVar(CCVars.DoMassContests) + && TryComp(targetUid, out var targetPhysics) + && performerPhysics.Mass != 0 + && targetPhysics.InvMass != 0) + return Math.Clamp(performerPhysics.Mass * targetPhysics.InvMass, 1 - _cfg.GetCVar(CCVars.MassContestsMaxPercentage), 1 + _cfg.GetCVar(CCVars.MassContestsMaxPercentage)); + + return 1f; + } + + /// + public float MassContest(PhysicsComponent performerPhysics, PhysicsComponent targetPhysics) + { + if (_cfg.GetCVar(CCVars.DoMassContests) + && performerPhysics.Mass != 0 + && targetPhysics.InvMass != 0) + return Math.Clamp(performerPhysics.Mass * targetPhysics.InvMass, 1 - _cfg.GetCVar(CCVars.MassContestsMaxPercentage), 1 + _cfg.GetCVar(CCVars.MassContestsMaxPercentage)); + + return 1f; + } + + #endregion + } +} diff --git a/Content.Shared/Coordinates/EntityCoordinatesExtensions.cs b/Content.Shared/Coordinates/EntityCoordinatesExtensions.cs index b9083eabe19..47d359d3875 100644 --- a/Content.Shared/Coordinates/EntityCoordinatesExtensions.cs +++ b/Content.Shared/Coordinates/EntityCoordinatesExtensions.cs @@ -1,6 +1,5 @@ using System.Numerics; using Robust.Shared.Map; -using Robust.Shared.Map.Components; namespace Content.Shared.Coordinates { @@ -20,17 +19,5 @@ public static EntityCoordinates ToCoordinates(this EntityUid id, float x, float { return new EntityCoordinates(id, x, y); } - - [Obsolete] - public static EntityCoordinates ToCoordinates(this MapGridComponent grid, float x, float y) - { - return ToCoordinates(grid.Owner, x, y); - } - - [Obsolete] - public static EntityCoordinates ToCoordinates(this MapGridComponent grid) - { - return ToCoordinates(grid.Owner, Vector2.Zero); - } } } diff --git a/Content.Shared/Coordinates/Helpers/SnapgridHelper.cs b/Content.Shared/Coordinates/Helpers/SnapgridHelper.cs index 567a600388e..db9ee85a0cd 100644 --- a/Content.Shared/Coordinates/Helpers/SnapgridHelper.cs +++ b/Content.Shared/Coordinates/Helpers/SnapgridHelper.cs @@ -22,7 +22,7 @@ public static EntityCoordinates SnapToGrid(this EntityCoordinates coordinates, I return EntityCoordinates.FromMap(coordinates.EntityId, mapPos, xformSys); } - var grid = mapManager.GetGrid(gridId.Value); + var grid = entMan.GetComponent(gridId.Value); var tileSize = grid.TileSize; var localPos = coordinates.WithEntityId(gridId.Value).Position; var x = (int)Math.Floor(localPos.X / tileSize) + tileSize / 2f; diff --git a/Content.Shared/Cuffs/Components/HandcuffComponent.cs b/Content.Shared/Cuffs/Components/HandcuffComponent.cs index 77a77cf2f84..d305f6067d0 100644 --- a/Content.Shared/Cuffs/Components/HandcuffComponent.cs +++ b/Content.Shared/Cuffs/Components/HandcuffComponent.cs @@ -12,37 +12,37 @@ public sealed partial class HandcuffComponent : Component /// /// The time it takes to cuff an entity. /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField] public float CuffTime = 3.5f; /// /// The time it takes to uncuff an entity. /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField] public float UncuffTime = 3.5f; /// /// The time it takes for a cuffed entity to uncuff itself. /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField] public float BreakoutTime = 15f; /// /// If an entity being cuffed is stunned, this amount of time is subtracted from the time it takes to add/remove their cuffs. /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField] public float StunBonus = 2f; /// /// Will the cuffs break when removed? /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField] public bool BreakOnRemove; /// /// Will the cuffs break when removed? /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField] public EntProtoId? BrokenPrototype; /// @@ -55,35 +55,42 @@ public sealed partial class HandcuffComponent : Component /// /// The path of the RSI file used for the player cuffed overlay. /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField] public string? CuffedRSI = "Objects/Misc/handcuffs.rsi"; /// /// The iconstate used with the RSI file for the player cuffed overlay. /// - [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + [DataField, AutoNetworkedField] public string? BodyIconState = "body-overlay"; /// /// An opptional color specification for /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField] public Color Color = Color.White; - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField] public SoundSpecifier StartCuffSound = new SoundPathSpecifier("/Audio/Items/Handcuffs/cuff_start.ogg"); - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField] public SoundSpecifier EndCuffSound = new SoundPathSpecifier("/Audio/Items/Handcuffs/cuff_end.ogg"); - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField] public SoundSpecifier StartBreakoutSound = new SoundPathSpecifier("/Audio/Items/Handcuffs/cuff_breakout_start.ogg"); - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField] public SoundSpecifier StartUncuffSound = new SoundPathSpecifier("/Audio/Items/Handcuffs/cuff_takeoff_start.ogg"); - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField] public SoundSpecifier EndUncuffSound = new SoundPathSpecifier("/Audio/Items/Handcuffs/cuff_takeoff_end.ogg"); + + /// + /// Acts as a two-state option for handcuff speed. When true, handcuffs will be easier to get out of if you are larger than average. Representing the use of strength to break things like zipties. + /// When false, handcuffs are easier to get out of if you are smaller than average, representing the use of dexterity to slip the cuffs. + /// + [DataField] + public bool UncuffEasierWhenLarge = false; } /// diff --git a/Content.Shared/Cuffs/SharedCuffableSystem.cs b/Content.Shared/Cuffs/SharedCuffableSystem.cs index fc005fd30fa..641d2bffc2d 100644 --- a/Content.Shared/Cuffs/SharedCuffableSystem.cs +++ b/Content.Shared/Cuffs/SharedCuffableSystem.cs @@ -5,6 +5,7 @@ using Content.Shared.Alert; using Content.Shared.Atmos.Piping.Unary.Components; using Content.Shared.Buckle.Components; +using Content.Shared.Contests; using Content.Shared.Cuffs.Components; using Content.Shared.Database; using Content.Shared.DoAfter; @@ -21,9 +22,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 +36,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 { @@ -58,6 +59,7 @@ public abstract partial class SharedCuffableSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly UseDelaySystem _delay = default!; + [Dependency] private readonly ContestsSystem _contests = default!; public override void Initialize() { @@ -70,7 +72,7 @@ public override void Initialize() SubscribeLocalEvent(OnCuffsInsertedIntoContainer); SubscribeLocalEvent(OnRejuvenate); SubscribeLocalEvent(OnStartup); - SubscribeLocalEvent(HandleStopPull); + SubscribeLocalEvent(HandleStopPull); SubscribeLocalEvent(HandleMoveAttempt); SubscribeLocalEvent(OnEquipAttempt); SubscribeLocalEvent(OnUnequipAttempt); @@ -182,7 +184,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 +216,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) @@ -559,7 +561,7 @@ public void TryUncuff(EntityUid target, EntityUid user, EntityUid? cuffsToRemove return; } - var uncuffTime = isOwner ? cuff.BreakoutTime : cuff.UncuffTime; + var uncuffTime = (isOwner ? cuff.BreakoutTime : cuff.UncuffTime) * (cuff.UncuffEasierWhenLarge ? 1 / _contests.MassContest(user) : _contests.MassContest(user)); if (isOwner) { diff --git a/Content.Shared/Customization/Systems/CharacterRequirements.cs b/Content.Shared/Customization/Systems/CharacterRequirements.cs new file mode 100644 index 00000000000..b7200c60e85 --- /dev/null +++ b/Content.Shared/Customization/Systems/CharacterRequirements.cs @@ -0,0 +1,529 @@ +using System.Linq; +using Content.Shared.CCVar; +using Content.Shared.Clothing.Loadouts.Prototypes; +using Content.Shared.Humanoid.Prototypes; +using Content.Shared.Players.PlayTimeTracking; +using Content.Shared.Preferences; +using Content.Shared.Roles; +using Content.Shared.Roles.Jobs; +using Content.Shared.Traits; +using JetBrains.Annotations; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; + +namespace Content.Shared.Customization.Systems; + + +[ImplicitDataDefinitionForInheritors, MeansImplicitUse] +[Serializable, NetSerializable] +public abstract partial class CharacterRequirement +{ + /// + /// If true valid requirements will be treated as invalid and vice versa + /// + [DataField] + public bool Inverted; + + /// + /// Checks if this character requirement is valid for the given parameters + /// + /// Description for the requirement, shown when not null + public abstract bool IsValid( + IPrototype prototype, + JobPrototype job, + HumanoidCharacterProfile profile, + Dictionary playTimes, + IEntityManager entityManager, + IPrototypeManager prototypeManager, + IConfigurationManager configManager, + out FormattedMessage? reason + ); +} + + +#region HumanoidCharacterProfile + +/// +/// Requires the profile to be within an age range +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterAgeRequirement : CharacterRequirement +{ + [DataField(required: true)] + public int Min; + + [DataField(required: true)] + public int Max; + + public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + reason = FormattedMessage.FromMarkup(Loc.GetString("character-age-requirement", + ("inverted", Inverted), ("min", Min), ("max", Max))); + return profile.Age >= Min && profile.Age <= Max; + } +} + +/// +/// Requires the profile to use either a Backpack, Satchel, or Duffelbag +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterBackpackTypeRequirement : CharacterRequirement +{ + [DataField(required: true)] + public BackpackPreference Preference; + + public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + reason = FormattedMessage.FromMarkup(Loc.GetString("character-backpack-type-requirement", + ("inverted", Inverted), + ("type", Loc.GetString($"humanoid-profile-editor-preference-{Preference.ToString().ToLower()}")))); + return profile.Backpack == Preference; + } +} + +/// +/// Requires the profile to use either Jumpsuits or Jumpskirts +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterClothingPreferenceRequirement : CharacterRequirement +{ + [DataField(required: true)] + public ClothingPreference Preference; + + public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + reason = FormattedMessage.FromMarkup(Loc.GetString("character-clothing-preference-requirement", + ("inverted", Inverted), + ("preference", Loc.GetString($"humanoid-profile-editor-preference-{Preference.ToString().ToLower()}")))); + return profile.Clothing == Preference; + } +} + +/// +/// Requires the profile to be a certain species +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterSpeciesRequirement : CharacterRequirement +{ + [DataField(required: true)] + public ProtoId Species; + + public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + reason = FormattedMessage.FromMarkup(Loc.GetString("character-species-requirement", + ("inverted", Inverted), + ("species", Loc.GetString($"species-name-{Species.ToString().ToLower()}")))); + return profile.Species == Species; + } +} + +/// +/// Requires the profile to have one of the specified traits +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterTraitRequirement : CharacterRequirement +{ + [DataField(required: true)] + public List> Traits; + + public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + reason = FormattedMessage.FromMarkup(Loc.GetString("character-trait-requirement", ("inverted", Inverted), + ("traits", string.Join(", ", Traits.Select(t => Loc.GetString($"trait-name-{t}")))))); + + return Traits.Any(t => profile.TraitPreferences.Contains(t.ToString())); + } +} + +/// +/// Requires the profile to have one of the specified loadouts +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterLoadoutRequirement : CharacterRequirement +{ + [DataField(required: true)] + public List> Loadouts; + + public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, + IConfigurationManager configManager, out FormattedMessage? reason) + { + reason = FormattedMessage.FromMarkup(Loc.GetString("character-loadout-requirement", ("inverted", Inverted), + ("loadouts", string.Join(", ", Loadouts.Select(l => Loc.GetString($"loadout-{l}")))))); + + return Loadouts.Any(l => profile.LoadoutPreferences.Contains(l.ToString())); + } +} + +#endregion + +#region Jobs + +/// +/// Requires the selected job to be one of the specified jobs +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterJobRequirement : CharacterRequirement +{ + [DataField(required: true)] + public List> Jobs; + + public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + var jobs = new List(); + + // Get the job names and department colors + foreach (var j in Jobs) + { + var jobProto = prototypeManager.Index(j); + var color = Color.LightBlue; + + foreach (var dept in prototypeManager.EnumeratePrototypes() + .OrderBy(d => Loc.GetString($"department-{d.ID}"))) + { + if (!dept.Roles.Contains(j)) + continue; + + color = dept.Color; + break; + } + + jobs.Add(FormattedMessage.FromMarkup($"[color={color.ToHex()}]{Loc.GetString(jobProto.Name)}[/color]")); + } + + // Join the job names + var jobsList = string.Join(", ", jobs.Select(j => j.ToMarkup())); + var jobsString = Loc.GetString("character-job-requirement", + ("inverted", Inverted), ("jobs", jobsList)); + + reason = FormattedMessage.FromMarkup(jobsString); + return Jobs.Contains(job.ID); + } +} + +/// +/// Requires the selected job to be in one of the specified departments +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterDepartmentRequirement : CharacterRequirement +{ + [DataField(required: true)] + public List> Departments; + + public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + var departments = new List(); + + // Get the department names and colors + foreach (var d in Departments) + { + var deptProto = prototypeManager.Index(d); + var color = deptProto.Color; + + departments.Add(FormattedMessage.FromMarkup($"[color={color.ToHex()}]{Loc.GetString($"department-{deptProto.ID}")}[/color]")); + } + + // Join the department names + var departmentsList = string.Join(", ", departments.Select(d => d.ToMarkup())); + var departmentsString = Loc.GetString("character-department-requirement", + ("inverted", Inverted), ("departments", departmentsList)); + + reason = FormattedMessage.FromMarkup(departmentsString); + return Departments.Any(d => prototypeManager.Index(d).Roles.Contains(job.ID)); + } +} + +/// +/// Requires the playtime for a department to be within a certain range +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterDepartmentTimeRequirement : CharacterRequirement +{ + [DataField] + public TimeSpan Min = TimeSpan.MinValue; + + [DataField] + public TimeSpan Max = TimeSpan.MaxValue; + + [DataField(required: true)] + public ProtoId Department; + + public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + // Disable the requirement if the role timers are disabled + if (!configManager.GetCVar(CCVars.GameRoleTimers)) + { + reason = null; + return !Inverted; + } + + var department = prototypeManager.Index(Department); + + // Combine all of this department's job playtimes + var playtime = TimeSpan.Zero; + foreach (var other in department.Roles) + { + var proto = prototypeManager.Index(other).PlayTimeTracker; + + playTimes.TryGetValue(proto, out var otherTime); + playtime += otherTime; + } + + if (playtime > Max) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("character-timer-department-too-high", + ("time", playtime.Minutes - Max.Minutes), + ("department", Loc.GetString($"department-{department.ID}")), + ("departmentColor", department.Color))); + return false; + } + + if (playtime < Min) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("character-timer-department-insufficient", + ("time", Min.Minutes - playtime.Minutes), + ("department", Loc.GetString($"department-{department.ID}")), + ("departmentColor", department.Color))); + return false; + } + + reason = null; + return true; + } +} + +/// +/// Requires the player to have a certain amount of overall job time +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterOverallTimeRequirement : CharacterRequirement +{ + [DataField] + public TimeSpan Min = TimeSpan.MinValue; + + [DataField] + public TimeSpan Max = TimeSpan.MaxValue; + + public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + // Disable the requirement if the role timers are disabled + if (!configManager.GetCVar(CCVars.GameRoleTimers)) + { + reason = null; + return !Inverted; + } + + // Get the overall time + var overallTime = playTimes.GetValueOrDefault(PlayTimeTrackingShared.TrackerOverall); + + if (overallTime > Max) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("character-timer-overall-too-high", + ("time", overallTime.Minutes - Max.Minutes))); + return false; + } + + if (overallTime < Min) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("character-timer-overall-insufficient", + ("time", Min.Minutes - overallTime.Minutes))); + return false; + } + + reason = null; + return true; + } +} + +/// +/// Requires the playtime for a tracker to be within a certain range +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterPlaytimeRequirement : CharacterRequirement +{ + [DataField] + public TimeSpan Min = TimeSpan.MinValue; + + [DataField] + public TimeSpan Max = TimeSpan.MaxValue; + + [DataField(required: true)] + public ProtoId Tracker; + + public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + // Disable the requirement if the role timers are disabled + if (!configManager.GetCVar(CCVars.GameRoleTimers)) + { + reason = null; + return !Inverted; + } + + // Get SharedJobSystem + if (!entityManager.EntitySysManager.TryGetEntitySystem(out SharedJobSystem? jobSystem)) + { + DebugTools.Assert("CharacterRequirements: SharedJobSystem not found"); + reason = null; + return false; + } + + // Get the JobPrototype of the Tracker + var trackerJob = jobSystem.GetJobPrototype(Tracker); + + // Get the primary department of the Tracker + if (!jobSystem.TryGetPrimaryDepartment(trackerJob, out var department) && + !jobSystem.TryGetDepartment(trackerJob, out department)) + { + DebugTools.Assert($"CharacterRequirements: Department not found for job {trackerJob}"); + reason = null; + return false; + } + + // Get the time for the tracker + var time = playTimes.GetValueOrDefault(Tracker); + reason = null; + + if (time > Max) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("character-timer-role-too-high", + ("time", time.Minutes - Max.Minutes), + ("job", trackerJob), + ("departmentColor", department.Color))); + return false; + } + + if (time < Min) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("character-timer-role-insufficient", + ("time", Min.Minutes - time.Minutes), + ("job", trackerJob), + ("departmentColor", department.Color))); + return false; + } + + return true; + } +} + +#endregion + +#region Prototype Groups + +/// +/// Requires the profile to not have any of the specified traits +/// +/// +/// Only works if you put this prototype in the denied prototypes' requirements too. +/// Can't be inverted, use +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class TraitGroupExclusionRequirement : CharacterRequirement +{ + [DataField(required: true)] + public List> Prototypes; + + public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + var invalid = profile.TraitPreferences.Any(t => Prototypes.Contains(t)); + + reason = FormattedMessage.FromMarkup(Loc.GetString("character-trait-group-exclusion-requirement", + ("traits", string.Join(", ", Prototypes.Select(t => Loc.GetString($"trait-name-{t}")))))); + + return Inverted ? invalid : !invalid; + } +} + +/// +/// Requires the profile to not have any of the specified loadouts +/// +/// +/// Only works if you put this prototype in the denied prototypes' requirements too. +/// Can't be inverted, use +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class LoadoutGroupExclusionRequirement : CharacterRequirement +{ + [DataField(required: true)] + public List> Prototypes; + + public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + var invalid = profile.LoadoutPreferences.Any(l => Prototypes.Contains(l)); + + reason = FormattedMessage.FromMarkup(Loc.GetString("character-loadout-group-exclusion-requirement", + ("loadouts", string.Join(", ", Prototypes.Select(l => Loc.GetString($"loadout-{l}")))))); + + return Inverted ? invalid : !invalid; + } +} + +#endregion diff --git a/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs b/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs new file mode 100644 index 00000000000..e93c933a6aa --- /dev/null +++ b/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs @@ -0,0 +1,43 @@ +using Content.Shared.Preferences; +using Content.Shared.Roles; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Shared.Customization.Systems; + + +public sealed class CharacterRequirementsSystem : EntitySystem +{ + public bool CheckRequirementsValid(IPrototype prototype, List requirements, JobPrototype job, + HumanoidCharacterProfile profile, Dictionary playTimes, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out List reasons) + { + reasons = new List(); + var valid = true; + + foreach (var requirement in requirements) + { + // Set valid to false if the requirement is invalid and not inverted + // If it's inverted set valid to false when it's valid + if (!requirement.IsValid(prototype, job, profile, playTimes, + entityManager, prototypeManager, configManager, + out var reason)) + { + if (valid) + valid = requirement.Inverted; + } + else + { + if (valid) + valid = !requirement.Inverted; + } + + if (reason != null) // To appease the compiler + reasons.Add(reason); + } + + return valid; + } +} diff --git a/Content.Shared/Damage/Components/RequireProjectileTargetComponent.cs b/Content.Shared/Damage/Components/RequireProjectileTargetComponent.cs new file mode 100644 index 00000000000..5bd8292daae --- /dev/null +++ b/Content.Shared/Damage/Components/RequireProjectileTargetComponent.cs @@ -0,0 +1,14 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Damage.Components; + +/// +/// Prevent the object from getting hit by projetiles unless you target the object. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(RequireProjectileTargetSystem))] +public sealed partial class RequireProjectileTargetComponent : Component +{ + [DataField, AutoNetworkedField] + public bool Active = true; +} diff --git a/Content.Shared/Damage/Systems/RequireProjectileTargetSystem.cs b/Content.Shared/Damage/Systems/RequireProjectileTargetSystem.cs new file mode 100644 index 00000000000..79b374a60f3 --- /dev/null +++ b/Content.Shared/Damage/Systems/RequireProjectileTargetSystem.cs @@ -0,0 +1,51 @@ +using Content.Shared.Projectiles; +using Content.Shared.Weapons.Ranged.Components; +using Content.Shared.Standing; +using Robust.Shared.Physics.Events; + +namespace Content.Shared.Damage.Components; + +public sealed class RequireProjectileTargetSystem : EntitySystem +{ + public override void Initialize() + { + SubscribeLocalEvent(PreventCollide); + SubscribeLocalEvent(StandingBulletHit); + SubscribeLocalEvent(LayingBulletPass); + } + + private void PreventCollide(Entity ent, ref PreventCollideEvent args) + { + if (args.Cancelled) + return; + + if (!ent.Comp.Active) + return; + + var other = args.OtherEntity; + if (HasComp(other) && + CompOrNull(other)?.Target != ent) + { + args.Cancelled = true; + } + } + + private void SetActive(Entity ent, bool value) + { + if (ent.Comp.Active == value) + return; + + ent.Comp.Active = value; + Dirty(ent); + } + + private void StandingBulletHit(Entity ent, ref StoodEvent args) + { + SetActive(ent, false); + } + + private void LayingBulletPass(Entity ent, ref DownedEvent args) + { + SetActive(ent, true); + } +} diff --git a/Content.Shared/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUiState.cs b/Content.Shared/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUiState.cs deleted file mode 100644 index dd820f1a0b3..00000000000 --- a/Content.Shared/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUiState.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Content.Shared.CartridgeLoader; -using Robust.Shared.Serialization; - -namespace Content.Shared.DeltaV.CartridgeLoader.Cartridges; - -[Serializable, NetSerializable] -public sealed class CrimeAssistUiState : BoundUserInterfaceState -{ - public CrimeAssistUiState() - { } -} - -[Serializable, NetSerializable] -public sealed class CrimeAssistSyncMessageEvent : CartridgeMessageEvent -{ - public CrimeAssistSyncMessageEvent() - { } -} diff --git a/Content.Shared/DeltaV/CartridgeLoader/Cartridges/SecWatchUiState.cs b/Content.Shared/DeltaV/CartridgeLoader/Cartridges/SecWatchUiState.cs new file mode 100644 index 00000000000..068b54a6ffb --- /dev/null +++ b/Content.Shared/DeltaV/CartridgeLoader/Cartridges/SecWatchUiState.cs @@ -0,0 +1,24 @@ +using Content.Shared.Security; +using Robust.Shared.Serialization; + +namespace Content.Shared.CartridgeLoader.Cartridges; + +/// +/// Show a list of wanted and suspected people from criminal records. +/// +[Serializable, NetSerializable] +public sealed class SecWatchUiState : BoundUserInterfaceState +{ + public readonly List Entries; + + public SecWatchUiState(List entries) + { + Entries = entries; + } +} + +/// +/// Entry for a person who is wanted or suspected. +/// +[Serializable, NetSerializable] +public record struct SecWatchEntry(string Name, string Job, SecurityStatus Status, string? Reason); diff --git a/Content.Shared/Disposal/SharedDisposalUnitSystem.cs b/Content.Shared/Disposal/SharedDisposalUnitSystem.cs index 600036a8910..9afd683cbdc 100644 --- a/Content.Shared/Disposal/SharedDisposalUnitSystem.cs +++ b/Content.Shared/Disposal/SharedDisposalUnitSystem.cs @@ -127,9 +127,6 @@ public virtual bool CanInsert(EntityUid uid, SharedDisposalUnitComponent compone return damageState != null && (!component.MobsCanEnter || _mobState.IsDead(entity, damageState)); } - /// - /// TODO: Proper prediction - /// public abstract void DoInsertDisposalUnit(EntityUid uid, EntityUid toInsert, EntityUid user, SharedDisposalUnitComponent? disposal = null); [Serializable, NetSerializable] diff --git a/Content.Shared/Drunk/DrunkSystem.cs b/Content.Shared/Drunk/DrunkSystem.cs index 4f9429b6a6b..ed022cae31b 100644 --- a/Content.Shared/Drunk/DrunkSystem.cs +++ b/Content.Shared/Drunk/DrunkSystem.cs @@ -1,6 +1,6 @@ using Content.Shared.Speech.EntitySystems; using Content.Shared.StatusEffect; -using Content.Shared.Traits.Assorted; +using Content.Shared.Traits.Assorted.Components; namespace Content.Shared.Drunk; @@ -18,9 +18,6 @@ public void TryApplyDrunkenness(EntityUid uid, float boozePower, bool applySlur if (!Resolve(uid, ref status, false)) return; - if (TryComp(uid, out var trait)) - boozePower *= trait.BoozeStrengthMultiplier; - if (applySlur) { _slurredSystem.DoSlur(uid, TimeSpan.FromSeconds(boozePower), status); diff --git a/Content.Shared/Follower/FollowerSystem.cs b/Content.Shared/Follower/FollowerSystem.cs index 5656778a3f9..fc7cccf9bd6 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 ba4d9fc24f8..3583947ee36 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/HeightAdjust/HeightAdjustSystem.cs b/Content.Shared/HeightAdjust/HeightAdjustSystem.cs new file mode 100644 index 00000000000..46b2d9b656f --- /dev/null +++ b/Content.Shared/HeightAdjust/HeightAdjustSystem.cs @@ -0,0 +1,80 @@ +using System.Numerics; +using Content.Shared.CCVar; +using Content.Shared.Humanoid; +using Content.Shared.Movement.Components; +using Content.Shared.Movement.Systems; +using Robust.Shared.Configuration; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Systems; + +namespace Content.Shared.HeightAdjust; + +public sealed class HeightAdjustSystem : EntitySystem +{ + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly SharedContentEyeSystem _eye = default!; + [Dependency] private readonly SharedHumanoidAppearanceSystem _appearance = default!; + [Dependency] private readonly IConfigurationManager _config = default!; + + + /// + /// Changes the density of fixtures and zoom of eyes based on a provided float scale + /// + /// The entity to modify values for + /// The scale to multiply values by + /// True if all operations succeeded + public bool SetScale(EntityUid uid, float scale) + { + var succeeded = true; + if (_config.GetCVar(CCVars.HeightAdjustModifiesZoom) && EntityManager.TryGetComponent(uid, out var eye)) + _eye.SetMaxZoom(uid, eye.MaxZoom * scale); + else + succeeded = false; + + if (_config.GetCVar(CCVars.HeightAdjustModifiesHitbox) && EntityManager.TryGetComponent(uid, out var fixtures)) + foreach (var fixture in fixtures.Fixtures) + _physics.SetRadius(uid, fixture.Key, fixture.Value, fixture.Value.Shape, MathF.MinMagnitude(fixture.Value.Shape.Radius * scale, 0.49f)); + else + succeeded = false; + + if (EntityManager.HasComponent(uid)) + { + _appearance.SetHeight(uid, scale); + _appearance.SetWidth(uid, scale); + } + else + succeeded = false; + + return succeeded; + } + + /// + /// Changes the density of fixtures and zoom of eyes based on a provided Vector2 scale + /// + /// The entity to modify values for + /// The scale to multiply values by + /// True if all operations succeeded + public bool SetScale(EntityUid uid, Vector2 scale) + { + var succeeded = true; + var avg = (scale.X + scale.Y) / 2; + + if (_config.GetCVar(CCVars.HeightAdjustModifiesZoom) && EntityManager.TryGetComponent(uid, out var eye)) + _eye.SetMaxZoom(uid, eye.MaxZoom * avg); + else + succeeded = false; + + if (_config.GetCVar(CCVars.HeightAdjustModifiesHitbox) && EntityManager.TryGetComponent(uid, out var fixtures)) + foreach (var fixture in fixtures.Fixtures) + _physics.SetRadius(uid, fixture.Key, fixture.Value, fixture.Value.Shape, MathF.MinMagnitude(fixture.Value.Shape.Radius * avg, 0.49f)); + else + succeeded = false; + + if (EntityManager.HasComponent(uid)) + _appearance.SetScale(uid, scale); + else + succeeded = false; + + return succeeded; + } +} diff --git a/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs b/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs index 4785482ada4..c9292337d7d 100644 --- a/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs +++ b/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs @@ -90,6 +90,18 @@ public sealed partial class HumanoidAppearanceComponent : Component /// [ViewVariables] public HumanoidCharacterProfile? LastProfileLoaded; + + /// + /// The height of this humanoid. + /// + [DataField, AutoNetworkedField] + public float Height = 1f; + + /// + /// The width of this humanoid. + /// + [DataField, AutoNetworkedField] + public float Width = 1f; } [DataDefinition] diff --git a/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs b/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs index 8564ebe8e16..8268d0d7c74 100644 --- a/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs +++ b/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs @@ -126,6 +126,54 @@ public sealed partial class SpeciesPrototype : IPrototype /// [DataField] public string GuideBookIcon = "SpeciesInfoDefault"; + + /// + /// The minimum height for this species + /// + [DataField] + public float MinHeight = 0.75f; + + /// + /// The default height for this species + /// + [DataField] + public float DefaultHeight = 1f; + + /// + /// The maximum height for this species + /// + [DataField] + public float MaxHeight = 1.25f; + + /// + /// The minimum width for this species + /// + [DataField] + public float MinWidth = 0.7f; + + /// + /// The default width for this species + /// + [DataField] + public float DefaultWidth = 1f; + + /// + /// The maximum width for this species + /// + [DataField] + public float MaxWidth = 1.3f; + + /// + /// The average height in centimeters for this species, used to calculate player facing height values in UI elements + /// + [DataField] + public float AverageHeight = 176.1f; + + /// + /// The average shoulder-to-shoulder width in cm for this species, used to calculate player facing width values in UI elements + /// + [DataField] + public float AverageWidth = 40f; } public enum SpeciesNaming : byte diff --git a/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs b/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs index 4974e283dd5..6062bec8b05 100644 --- a/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs +++ b/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs @@ -1,8 +1,10 @@ using System.Linq; +using System.Numerics; using Content.Shared.Decals; using Content.Shared.Humanoid.Markings; using Content.Shared.Humanoid.Prototypes; using Content.Shared.Preferences; +using Content.Shared.HeightAdjust; using Robust.Shared.GameObjects.Components.Localization; using Robust.Shared.Network; using Robust.Shared.Prototypes; @@ -23,6 +25,7 @@ public abstract class SharedHumanoidAppearanceSystem : EntitySystem [Dependency] private readonly INetManager _netManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly MarkingManager _markingManager = default!; + [Dependency] private readonly HeightAdjustSystem _heightAdjust = default!; [ValidatePrototypeId] public const string DefaultSpecies = "Human"; @@ -248,6 +251,64 @@ public void SetSex(EntityUid uid, Sex sex, bool sync = true, HumanoidAppearanceC } } + /// + /// Set the height of a humanoid mob + /// + /// The humanoid mob's UID + /// The height to set the mob to + /// Whether to immediately synchronize this to the humanoid mob, or not + /// Humanoid component of the entity + public void SetHeight(EntityUid uid, float height, bool sync = true, HumanoidAppearanceComponent? humanoid = null) + { + if (!Resolve(uid, ref humanoid) || MathHelper.CloseTo(humanoid.Height, height, 0.001f)) + return; + + var species = _prototypeManager.Index(humanoid.Species); + humanoid.Height = Math.Clamp(height, species.MinHeight, species.MaxHeight); + + if (sync) + Dirty(humanoid); + } + + /// + /// Set the width of a humanoid mob + /// + /// The humanoid mob's UID + /// The width to set the mob to + /// Whether to immediately synchronize this to the humanoid mob, or not + /// Humanoid component of the entity + public void SetWidth(EntityUid uid, float width, bool sync = true, HumanoidAppearanceComponent? humanoid = null) + { + if (!Resolve(uid, ref humanoid) || MathHelper.CloseTo(humanoid.Width, width, 0.001f)) + return; + + var species = _prototypeManager.Index(humanoid.Species); + humanoid.Width = Math.Clamp(width, species.MinWidth, species.MaxWidth); + + if (sync) + Dirty(humanoid); + } + + /// + /// Set the scale of a humanoid mob + /// + /// The humanoid mob's UID + /// The scale to set the mob to + /// Whether to immediately synchronize this to the humanoid mob, or not + /// Humanoid component of the entity + public void SetScale(EntityUid uid, Vector2 scale, bool sync = true, HumanoidAppearanceComponent? humanoid = null) + { + if (!Resolve(uid, ref humanoid)) + return; + + var species = _prototypeManager.Index(humanoid.Species); + humanoid.Height = Math.Clamp(scale.Y, species.MinHeight, species.MaxHeight); + humanoid.Width = Math.Clamp(scale.X, species.MinWidth, species.MaxWidth); + + if (sync) + Dirty(humanoid); + } + /// /// Loads a humanoid character profile directly onto this humanoid mob. /// @@ -329,6 +390,8 @@ public virtual void LoadProfile(EntityUid uid, HumanoidCharacterProfile profile, humanoid.Age = profile.Age; + _heightAdjust.SetScale(uid, new Vector2(profile.Width, profile.Height)); + humanoid.LastProfileLoaded = profile; // DeltaV - let paradox anomaly be cloned Dirty(humanoid); diff --git a/Content.Shared/IdentityManagement/Components/IdentityBlockerComponent.cs b/Content.Shared/IdentityManagement/Components/IdentityBlockerComponent.cs index 3857063783d..e7a88b6ef29 100644 --- a/Content.Shared/IdentityManagement/Components/IdentityBlockerComponent.cs +++ b/Content.Shared/IdentityManagement/Components/IdentityBlockerComponent.cs @@ -6,6 +6,7 @@ namespace Content.Shared.IdentityManagement.Components; [RegisterComponent, NetworkedComponent] public sealed partial class IdentityBlockerComponent : Component { + [DataField] public bool Enabled = true; /// diff --git a/Content.Shared/Implants/Components/ImplanterComponent.cs b/Content.Shared/Implants/Components/ImplanterComponent.cs index 32a36361633..80330aa7e66 100644 --- a/Content.Shared/Implants/Components/ImplanterComponent.cs +++ b/Content.Shared/Implants/Components/ImplanterComponent.cs @@ -70,6 +70,12 @@ public sealed partial class ImplanterComponent : Component [DataField] public (string, string) ImplantData; + /// + /// Determines if the same type of implant can be implanted into an entity multiple times. + /// + [DataField] + public bool AllowMultipleImplants = false; + /// /// The for this implanter /// diff --git a/Content.Shared/Input/ContentKeyFunctions.cs b/Content.Shared/Input/ContentKeyFunctions.cs index ee4a4e9023b..323fd048238 100644 --- a/Content.Shared/Input/ContentKeyFunctions.cs +++ b/Content.Shared/Input/ContentKeyFunctions.cs @@ -25,6 +25,7 @@ public static class ContentKeyFunctions public static readonly BoundKeyFunction CycleChatChannelBackward = "CycleChatChannelBackward"; public static readonly BoundKeyFunction EscapeContext = "EscapeContext"; public static readonly BoundKeyFunction OpenCharacterMenu = "OpenCharacterMenu"; + public static readonly BoundKeyFunction OpenLanguageMenu = "OpenLanguageMenu"; public static readonly BoundKeyFunction OpenCraftingMenu = "OpenCraftingMenu"; public static readonly BoundKeyFunction OpenGuidebook = "OpenGuidebook"; public static readonly BoundKeyFunction OpenInventoryMenu = "OpenInventoryMenu"; @@ -53,6 +54,8 @@ public static class ContentKeyFunctions public static readonly BoundKeyFunction ZoomOut = "ZoomOut"; public static readonly BoundKeyFunction ZoomIn = "ZoomIn"; public static readonly BoundKeyFunction ResetZoom = "ResetZoom"; + public static readonly BoundKeyFunction OfferItem = "OfferItem"; + public static readonly BoundKeyFunction ToggleStanding = "ToggleStanding"; public static readonly BoundKeyFunction ArcadeUp = "ArcadeUp"; public static readonly BoundKeyFunction ArcadeDown = "ArcadeDown"; diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index 0e390ecea45..e4864b1f7fc 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 24006b0c9f9..7bdd17ee6fa 100644 --- a/Content.Shared/Inventory/InventorySystem.Equip.cs +++ b/Content.Shared/Inventory/InventorySystem.Equip.cs @@ -176,7 +176,7 @@ public bool TryEquip(EntityUid actor, EntityUid target, EntityUid itemUid, strin }; _doAfter.TryStartDoAfter(args); - return false; + return true; // Changed to return true even if the item wasn't equipped instantly } if (!_containerSystem.Insert(itemUid, slotContainer)) diff --git a/Content.Shared/Inventory/InventoryTemplatePrototype.cs b/Content.Shared/Inventory/InventoryTemplatePrototype.cs index a4779699629..585f80d4ce9 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/Language/Components/LanguageKnowledgeComponent.cs b/Content.Shared/Language/Components/LanguageKnowledgeComponent.cs new file mode 100644 index 00000000000..ddbdc742be4 --- /dev/null +++ b/Content.Shared/Language/Components/LanguageKnowledgeComponent.cs @@ -0,0 +1,24 @@ +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; + +namespace Content.Shared.Language.Components; + +// TODO: move to server side, it's never synchronized! + +/// +/// Stores data about entities' intrinsic language knowledge. +/// +[RegisterComponent] +public sealed partial class LanguageKnowledgeComponent : Component +{ + /// + /// List of languages this entity can speak without any external tools. + /// + [DataField("speaks", customTypeSerializer: typeof(PrototypeIdListSerializer), required: true)] + public List SpokenLanguages = new(); + + /// + /// List of languages this entity can understand without any external tools. + /// + [DataField("understands", customTypeSerializer: typeof(PrototypeIdListSerializer), required: true)] + public List UnderstoodLanguages = new(); +} diff --git a/Content.Shared/Language/Components/LanguageSpeakerComponent.cs b/Content.Shared/Language/Components/LanguageSpeakerComponent.cs new file mode 100644 index 00000000000..e8ebccb3ddf --- /dev/null +++ b/Content.Shared/Language/Components/LanguageSpeakerComponent.cs @@ -0,0 +1,32 @@ +namespace Content.Shared.Language; + +// TODO: either move all language speaker-related components to server side, or make everything else shared. +// The current approach leads to confusion, as the server never informs the client of updates in these components. + +/// +/// Stores the current state of the languages the entity can speak and understand. +/// +/// +/// All fields of this component are populated during a DetermineEntityLanguagesEvent. +/// They are not to be modified externally. +/// +[RegisterComponent] +public sealed partial class LanguageSpeakerComponent : Component +{ + /// + /// The current language the entity uses when speaking. + /// Other listeners will hear the entity speak in this language. + /// + [DataField] + public string CurrentLanguage = ""; // The language system will override it on init + + /// + /// List of languages this entity can speak at the current moment. + /// + public List SpokenLanguages = []; + + /// + /// List of languages this entity can understand at the current moment. + /// + public List UnderstoodLanguages = []; +} diff --git a/Content.Shared/Language/Components/TranslatorImplantComponent.cs b/Content.Shared/Language/Components/TranslatorImplantComponent.cs new file mode 100644 index 00000000000..cb8c666c82f --- /dev/null +++ b/Content.Shared/Language/Components/TranslatorImplantComponent.cs @@ -0,0 +1,21 @@ +using Content.Shared.Language.Components.Translators; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; + +namespace Content.Shared.Language.Components; + +/// +/// An implant that allows the implantee to speak and understand other languages. +/// +[RegisterComponent] +public sealed partial class TranslatorImplantComponent : BaseTranslatorComponent +{ + /// + /// Whether the implantee knows the languages necessary to speak using this implant. + /// + public bool SpokenRequirementSatisfied = false; + + /// + /// Whether the implantee knows the languages necessary to understand translations of this implant. + /// + public bool UnderstoodRequirementSatisfied = false; +} diff --git a/Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs new file mode 100644 index 00000000000..072480031d5 --- /dev/null +++ b/Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs @@ -0,0 +1,38 @@ +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; + +namespace Content.Shared.Language.Components.Translators; + +public abstract partial class BaseTranslatorComponent : Component +{ + /// + /// The list of additional languages this translator allows the wielder to speak. + /// + [DataField("spoken", customTypeSerializer: typeof(PrototypeIdListSerializer))] + public List SpokenLanguages = new(); + + /// + /// The list of additional languages this translator allows the wielder to understand. + /// + [DataField("understood", customTypeSerializer: typeof(PrototypeIdListSerializer))] + public List UnderstoodLanguages = new(); + + /// + /// The languages the wielding MUST know in order for this translator to have effect. + /// The field [RequiresAllLanguages] indicates whether all of them are required, or just one. + /// + [DataField("requires", customTypeSerializer: typeof(PrototypeIdListSerializer))] + public List RequiredLanguages = new(); + + /// + /// If true, the wielder must understand all languages in [RequiredLanguages] to speak [SpokenLanguages], + /// and understand all languages in [RequiredLanguages] to understand [UnderstoodLanguages]. + /// + /// Otherwise, at least one language must be known (or the list must be empty). + /// + [DataField("requiresAll")] + [ViewVariables(VVAccess.ReadWrite)] + public bool RequiresAllLanguages = false; + + [DataField("enabled"), ViewVariables(VVAccess.ReadWrite)] + public bool Enabled = true; +} diff --git a/Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs new file mode 100644 index 00000000000..7e3de0eca61 --- /dev/null +++ b/Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs @@ -0,0 +1,24 @@ +namespace Content.Shared.Language.Components.Translators; + +/// +/// A translator that must be held in a hand or a pocket of an entity in order ot have effect. +/// +[RegisterComponent] +public sealed partial class HandheldTranslatorComponent : Translators.BaseTranslatorComponent +{ + /// + /// Whether interacting with this translator toggles it on and off. + /// + [DataField] + public bool ToggleOnInteract = true; + + /// + /// If true, when this translator is turned on, the entities' current spoken language will be set + /// to the first new language added by this translator. + /// + /// + /// This should generally be used for translators that translate speech between two languages. + /// + [DataField] + public bool SetLanguageOnInteract = true; +} diff --git a/Content.Shared/Language/Components/Translators/HoldsTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/HoldsTranslatorComponent.cs new file mode 100644 index 00000000000..caea9b9a948 --- /dev/null +++ b/Content.Shared/Language/Components/Translators/HoldsTranslatorComponent.cs @@ -0,0 +1,11 @@ +namespace Content.Shared.Language.Components.Translators; + +/// +/// Applied internally to the holder of [HandheldTranslatorComponent]. +/// Do not use directly. Use [HandheldTranslatorComponent] instead. +/// +[RegisterComponent] +public sealed partial class HoldsTranslatorComponent : IntrinsicTranslatorComponent +{ + public Component? Issuer = null; +} diff --git a/Content.Shared/Language/Components/Translators/ImplantedTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/ImplantedTranslatorComponent.cs new file mode 100644 index 00000000000..d1d72e83ed7 --- /dev/null +++ b/Content.Shared/Language/Components/Translators/ImplantedTranslatorComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Shared.Language.Components.Translators; + +/// +/// Applied to entities who were injected with a translator implant. +/// +[RegisterComponent] +public sealed partial class ImplantedTranslatorComponent : IntrinsicTranslatorComponent +{ +} diff --git a/Content.Shared/Language/Components/Translators/IntrinsicTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/IntrinsicTranslatorComponent.cs new file mode 100644 index 00000000000..d8def4ac1de --- /dev/null +++ b/Content.Shared/Language/Components/Translators/IntrinsicTranslatorComponent.cs @@ -0,0 +1,10 @@ +namespace Content.Shared.Language.Components.Translators; + +/// +/// A translator attached to an entity that translates its speech. +/// An example is a translator implant that allows the speaker to speak another language. +/// +[RegisterComponent, Virtual] +public partial class IntrinsicTranslatorComponent : Translators.BaseTranslatorComponent +{ +} diff --git a/Content.Shared/Language/Components/UniversalLanguageSpeakerComponent.cs b/Content.Shared/Language/Components/UniversalLanguageSpeakerComponent.cs new file mode 100644 index 00000000000..6f5ad1178b8 --- /dev/null +++ b/Content.Shared/Language/Components/UniversalLanguageSpeakerComponent.cs @@ -0,0 +1,11 @@ +namespace Content.Shared.Language.Components; + +// +// Signifies that this entity can speak and understand any language. +// Applies to such entities as ghosts. +// +[RegisterComponent] +public sealed partial class UniversalLanguageSpeakerComponent : Component +{ + +} diff --git a/Content.Shared/Language/Events/LanguagesSetMessage.cs b/Content.Shared/Language/Events/LanguagesSetMessage.cs new file mode 100644 index 00000000000..f7a78210aaf --- /dev/null +++ b/Content.Shared/Language/Events/LanguagesSetMessage.cs @@ -0,0 +1,13 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Language.Events; + +/// +/// Sent from the client to the server when it needs to want to set his currentLangauge. +/// Yeah im using this instead of ExecuteCommand... Better right? +/// +[Serializable, NetSerializable] +public sealed class LanguagesSetMessage(string currentLanguage) : EntityEventArgs +{ + public string CurrentLanguage = currentLanguage; +} diff --git a/Content.Shared/Language/Events/LanguagesUpdatedMessage.cs b/Content.Shared/Language/Events/LanguagesUpdatedMessage.cs new file mode 100644 index 00000000000..563f036df6d --- /dev/null +++ b/Content.Shared/Language/Events/LanguagesUpdatedMessage.cs @@ -0,0 +1,15 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Language.Events; + +/// +/// Sent to the client when its list of languages changes. +/// The client should in turn update its HUD and relevant systems. +/// +[Serializable, NetSerializable] +public sealed class LanguagesUpdatedMessage(string currentLanguage, List spoken, List understood) : EntityEventArgs +{ + public string CurrentLanguage = currentLanguage; + public List Spoken = spoken; + public List Understood = understood; +} diff --git a/Content.Shared/Language/Events/RequestLanguagesMessage.cs b/Content.Shared/Language/Events/RequestLanguagesMessage.cs new file mode 100644 index 00000000000..aead1f4cd1a --- /dev/null +++ b/Content.Shared/Language/Events/RequestLanguagesMessage.cs @@ -0,0 +1,10 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Language.Events; + +/// +/// Sent from the client to the server when it needs to learn the list of languages its entity knows. +/// This event should always be followed by a , unless the client doesn't have an entity. +/// +[Serializable, NetSerializable] +public sealed class RequestLanguagesMessage : EntityEventArgs; diff --git a/Content.Shared/Language/LanguagePrototype.cs b/Content.Shared/Language/LanguagePrototype.cs new file mode 100644 index 00000000000..be54b45aa1f --- /dev/null +++ b/Content.Shared/Language/LanguagePrototype.cs @@ -0,0 +1,37 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.Language; + +[Prototype("language")] +public sealed class LanguagePrototype : IPrototype +{ + [IdDataField] + public string ID { get; private set; } = default!; + + [DataField("color")] + public Color? Color; + + [DataField("fontId")] + public string? FontId; + + [DataField("fontSize")] + public int? FontSize; + + /// + /// Obfuscation method used by this language. By default, uses + /// + [DataField("obfuscation")] + public ObfuscationMethod Obfuscation = ObfuscationMethod.Default; + + #region utility + /// + /// The in-world name of this language, localized. + /// + public string Name => Loc.GetString($"language-{ID}-name"); + + /// + /// The in-world description of this language, localized. + /// + public string Description => Loc.GetString($"language-{ID}-description"); + #endregion utility +} diff --git a/Content.Shared/Language/ObfuscationMethods.cs b/Content.Shared/Language/ObfuscationMethods.cs new file mode 100644 index 00000000000..51230c47970 --- /dev/null +++ b/Content.Shared/Language/ObfuscationMethods.cs @@ -0,0 +1,184 @@ +using System.Text; +using Content.Shared.Language.Systems; + +namespace Content.Shared.Language; + +[ImplicitDataDefinitionForInheritors] +public abstract partial class ObfuscationMethod +{ + /// + /// The fallback obfuscation method, replaces the message with the string "<?>". + /// + public static readonly ObfuscationMethod Default = new ReplacementObfuscation + { + Replacement = new List { "" } + }; + + /// + /// Obfuscates the provided message and writes the result into the provided StringBuilder. + /// Implementations should use the context's pseudo-random number generator and provide stable obfuscations. + /// + internal abstract void Obfuscate(StringBuilder builder, string message, SharedLanguageSystem context); + + /// + /// Obfuscates the provided message. This method should only be used for debugging purposes. + /// For all other purposes, use instead. + /// + public string Obfuscate(string message) + { + var builder = new StringBuilder(); + Obfuscate(builder, message, IoCManager.Resolve().GetEntitySystem()); + return builder.ToString(); + } +} + +/// +/// The most primitive method of obfuscation - replaces the entire message with one random replacement phrase. +/// Similar to ReplacementAccent. Base for all replacement-based obfuscation methods. +/// +public partial class ReplacementObfuscation : ObfuscationMethod +{ + /// + /// A list of replacement phrases used in the obfuscation process. + /// + [DataField(required: true)] + public List Replacement = []; + + internal override void Obfuscate(StringBuilder builder, string message, SharedLanguageSystem context) + { + var idx = context.PseudoRandomNumber(message.GetHashCode(), 0, Replacement.Count - 1); + builder.Append(Replacement[idx]); + } +} + +/// +/// Obfuscates the provided message by replacing each word with a random number of syllables in the range (min, max), +/// preserving the original punctuation to a resonable extent. +/// +/// +/// The words are obfuscated in a stable manner, such that every particular word will be obfuscated the same way throughout one round. +/// This means that particular words can be memorized within a round, but not across rounds. +/// +public sealed partial class SyllableObfuscation : ReplacementObfuscation +{ + [DataField] + public int MinSyllables = 1; + + [DataField] + public int MaxSyllables = 4; + + internal override void Obfuscate(StringBuilder builder, string message, SharedLanguageSystem context) + { + const char eof = (char) 0; // Special character to mark the end of the message in the code below + + var wordBeginIndex = 0; + var hashCode = 0; + + for (var i = 0; i <= message.Length; i++) + { + var ch = i < message.Length ? char.ToLower(message[i]) : eof; + var isWordEnd = char.IsWhiteSpace(ch) || IsPunctuation(ch) || ch == eof; + + // If this is a normal char, add it to the hash sum + if (!isWordEnd) + hashCode = hashCode * 31 + ch; + + // If a word ends before this character, construct a new word and append it to the new message. + if (isWordEnd) + { + var wordLength = i - wordBeginIndex; + if (wordLength > 0) + { + var newWordLength = context.PseudoRandomNumber(hashCode, MinSyllables, MaxSyllables); + + for (var j = 0; j < newWordLength; j++) + { + var index = context.PseudoRandomNumber(hashCode + j, 0, Replacement.Count - 1); + builder.Append(Replacement[index]); + } + } + + hashCode = 0; + wordBeginIndex = i + 1; + } + + // If this message concludes a word (i.e. is a whitespace or a punctuation mark), append it to the message + if (isWordEnd && ch != eof) + builder.Append(ch); + } + } + + private static bool IsPunctuation(char ch) + { + return ch is '.' or '!' or '?' or ',' or ':'; + } +} + +/// +/// Obfuscates each sentence in the message by concatenating a number of obfuscation phrases. +/// The number of phrases in the obfuscated message is proportional to the length of the original message. +/// +public sealed partial class PhraseObfuscation : ReplacementObfuscation +{ + [DataField] + public int MinPhrases = 1; + + [DataField] + public int MaxPhrases = 4; + + /// + /// A string used to separate individual phrases within one sentence. Default is a space. + /// + [DataField] + public string Separator = " "; + + /// + /// A power to which the number of characters in the original message is raised to determine the number of phrases in the result. + /// Default is 1/3, i.e. the cubic root of the original number. + /// + /// + /// Using the default proportion, you will need at least 27 characters for 2 phrases, at least 64 for 3, at least 125 for 4, etc. + /// Increasing the proportion to 1/4 will result in the numbers changing to 81, 256, 625, etc. + /// + [DataField] + public float Proportion = 1f / 3; + + internal override void Obfuscate(StringBuilder builder, string message, SharedLanguageSystem context) + { + var sentenceBeginIndex = 0; + var hashCode = 0; + + for (var i = 0; i < message.Length; i++) + { + var ch = char.ToLower(message[i]); + if (!IsPunctuation(ch) && i != message.Length - 1) + { + hashCode = hashCode * 31 + ch; + continue; + } + + var length = i - sentenceBeginIndex; + if (length > 0) + { + var newLength = (int) Math.Clamp(Math.Pow(length, Proportion) - 1, MinPhrases, MaxPhrases); + + for (var j = 0; j < newLength; j++) + { + var phraseIdx = context.PseudoRandomNumber(hashCode + j, 0, Replacement.Count - 1); + var phrase = Replacement[phraseIdx]; + builder.Append(phrase); + builder.Append(Separator); + } + } + sentenceBeginIndex = i + 1; + + if (IsPunctuation(ch)) + builder.Append(ch).Append(' '); // TODO: this will turn '...' into '. . . ' + } + } + + private static bool IsPunctuation(char ch) + { + return ch is '.' or '!' or '?'; // Doesn't include mid-sentence punctuation like the comma + } +} diff --git a/Content.Shared/Language/Systems/SharedLanguageSystem.cs b/Content.Shared/Language/Systems/SharedLanguageSystem.cs new file mode 100644 index 00000000000..0a03086ebe1 --- /dev/null +++ b/Content.Shared/Language/Systems/SharedLanguageSystem.cs @@ -0,0 +1,67 @@ +using System.Text; +using Content.Shared.GameTicking; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Language.Systems; + +public abstract class SharedLanguageSystem : EntitySystem +{ + /// + /// The language used as a fallback in cases where an entity suddenly becomes a language speaker (e.g. the usage of make-sentient) + /// + [ValidatePrototypeId] + public static readonly string FallbackLanguagePrototype = "GalacticCommon"; + + /// + /// The language whose speakers are assumed to understand and speak every language. Should never be added directly. + /// + [ValidatePrototypeId] + public static readonly string UniversalPrototype = "Universal"; + + /// + /// A cached instance of + /// + public static LanguagePrototype Universal { get; private set; } = default!; + + [Dependency] protected readonly IPrototypeManager _prototype = default!; + [Dependency] protected readonly SharedGameTicker _ticker = default!; + + public override void Initialize() + { + Universal = _prototype.Index("Universal"); + } + + public LanguagePrototype? GetLanguagePrototype(string id) + { + _prototype.TryIndex(id, out var proto); + return proto; + } + + /// + /// Obfuscate a message using the given language. + /// + public string ObfuscateSpeech(string message, LanguagePrototype language) + { + var builder = new StringBuilder(); + var method = language.Obfuscation; + method.Obfuscate(builder, message, this); + + return builder.ToString(); + } + + /// + /// Generates a stable pseudo-random number in the range (min, max) (inclusively) for the given seed. + /// One seed always corresponds to one number, however the resulting number also depends on the current round number. + /// This method is meant to be used in to provide stable obfuscation. + /// + internal int PseudoRandomNumber(int seed, int min, int max) + { + // Using RobustRandom or System.Random here is a bad idea because this method can get called hundreds of times per message. + // Each call would require us to allocate a new instance of random, which would lead to lots of unnecessary calculations. + // Instead, we use a simple but effective algorithm derived from the C language. + // It does not produce a truly random number, but for the purpose of obfuscating messages in an RP-based game it's more than alright. + seed = seed ^ (_ticker.RoundId * 127); + var random = seed * 1103515245 + 12345; + return min + Math.Abs(random) % (max - min + 1); + } +} diff --git a/Content.Shared/Language/Systems/SharedTranslatorSystem.cs b/Content.Shared/Language/Systems/SharedTranslatorSystem.cs new file mode 100644 index 00000000000..4a72de791f0 --- /dev/null +++ b/Content.Shared/Language/Systems/SharedTranslatorSystem.cs @@ -0,0 +1,44 @@ +using System.Linq; +using Content.Shared.Examine; +using Content.Shared.Toggleable; +using Content.Shared.Language.Components.Translators; + +namespace Content.Shared.Language.Systems; + +public abstract class SharedTranslatorSystem : EntitySystem +{ + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnExamined); + } + + private void OnExamined(EntityUid uid, HandheldTranslatorComponent component, ExaminedEvent args) + { + var understoodLanguageNames = component.UnderstoodLanguages + .Select(it => Loc.GetString($"language-{it}-name")); + var spokenLanguageNames = component.SpokenLanguages + .Select(it => Loc.GetString($"language-{it}-name")); + var requiredLanguageNames = component.RequiredLanguages + .Select(it => Loc.GetString($"language-{it}-name")); + + args.PushMarkup(Loc.GetString("translator-examined-langs-understood", ("languages", string.Join(", ", understoodLanguageNames)))); + args.PushMarkup(Loc.GetString("translator-examined-langs-spoken", ("languages", string.Join(", ", spokenLanguageNames)))); + + args.PushMarkup(Loc.GetString(component.RequiresAllLanguages ? "translator-examined-requires-all" : "translator-examined-requires-any", + ("languages", string.Join(", ", requiredLanguageNames)))); + + args.PushMarkup(Loc.GetString(component.Enabled ? "translator-examined-enabled" : "translator-examined-disabled")); + } + + protected void OnAppearanceChange(EntityUid translator, HandheldTranslatorComponent? comp = null) + { + if (comp == null && !TryComp(translator, out comp)) + return; + + _appearance.SetData(translator, ToggleVisuals.Toggled, comp.Enabled); + } +} diff --git a/Content.Shared/Light/Components/SharedExpendableLightComponent.cs b/Content.Shared/Light/Components/SharedExpendableLightComponent.cs index c802700b62c..e40174ab783 100644 --- a/Content.Shared/Light/Components/SharedExpendableLightComponent.cs +++ b/Content.Shared/Light/Components/SharedExpendableLightComponent.cs @@ -7,7 +7,7 @@ namespace Content.Shared.Light.Components; [NetworkedComponent] public abstract partial class SharedExpendableLightComponent : Component { - public static readonly AudioParams LoopedSoundParams = new(0, 1, "Master", 62.5f, 1, 1, true, 0.3f); + public static readonly AudioParams LoopedSoundParams = new(0, 1, 62.5f, 1, 1, true, 0.3f); [ViewVariables(VVAccess.ReadOnly)] public ExpendableLightState CurrentState { get; set; } diff --git a/Content.Shared/Maps/ContentTileDefinition.cs b/Content.Shared/Maps/ContentTileDefinition.cs index 32f5db0e821..be171559d02 100644 --- a/Content.Shared/Maps/ContentTileDefinition.cs +++ b/Content.Shared/Maps/ContentTileDefinition.cs @@ -121,5 +121,11 @@ public void AssignTileId(ushort id) { TileId = id; } + + [DataField] + public bool Reinforced = false; + + [DataField] + public float TileRipResistance = 125f; } } diff --git a/Content.Shared/Maps/TurfHelpers.cs b/Content.Shared/Maps/TurfHelpers.cs index 58a5d133b55..f1c1beef7d1 100644 --- a/Content.Shared/Maps/TurfHelpers.cs +++ b/Content.Shared/Maps/TurfHelpers.cs @@ -3,6 +3,7 @@ using System.Runtime.CompilerServices; using Content.Shared.Physics; using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Random; namespace Content.Shared.Maps @@ -11,6 +12,22 @@ namespace Content.Shared.Maps // That, or make the interface arguments non-optional so people stop failing to pass them in. public static class TurfHelpers { + /// + /// Attempts to get the turf at map indices with grid id or null if no such turf is found. + /// + public static TileRef GetTileRef(this Vector2i vector2i, EntityUid gridId, IEntityManager? entityManager = null) + { + entityManager ??= IoCManager.Resolve(); + + if (!entityManager.TryGetComponent(gridId, out var grid)) + return default; + + if (!grid.TryGetTileRef(vector2i, out var tile)) + return default; + + return tile; + } + /// /// Attempts to get the turf at a certain coordinates or null if no such turf is found. /// @@ -119,9 +136,8 @@ public static bool IsBlockedTurf(this TileRef turf, bool filterMobs, EntityLooku private static bool GetWorldTileBox(TileRef turf, out Box2Rotated res) { var entManager = IoCManager.Resolve(); - var map = IoCManager.Resolve(); - if (map.TryGetGrid(turf.GridUid, out var tileGrid)) + if (entManager.TryGetComponent(turf.GridUid, out var tileGrid)) { var gridRot = entManager.GetComponent(turf.GridUid).WorldRotation; diff --git a/Content.Shared/Maps/TurfSystem.cs b/Content.Shared/Maps/TurfSystem.cs index a344193f123..ad8b3ddea8d 100644 --- a/Content.Shared/Maps/TurfSystem.cs +++ b/Content.Shared/Maps/TurfSystem.cs @@ -13,7 +13,6 @@ public sealed class TurfSystem : EntitySystem { [Dependency] private readonly EntityLookupSystem _entityLookup = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; - [Dependency] private readonly IMapManager _mapMan = default!; /// /// Returns true if a given tile is blocked by physics-enabled entities. @@ -92,7 +91,7 @@ public bool IsTileBlocked(EntityUid gridUid, /// public EntityCoordinates GetTileCenter(TileRef turf) { - var grid = _mapMan.GetGrid(turf.GridUid); + var grid = Comp(turf.GridUid); var center = (turf.GridIndices + new Vector2(0.5f, 0.5f)) * grid.TileSize; return new EntityCoordinates(turf.GridUid, center); } diff --git a/Content.Shared/Materials/SharedMaterialReclaimerSystem.cs b/Content.Shared/Materials/SharedMaterialReclaimerSystem.cs index 5a9ada7f586..50dce3c7669 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) @@ -238,3 +243,6 @@ public override void Update(float frameTime) } } } + +[ByRefEvent] +public record struct GotReclaimedEvent(EntityCoordinates ReclaimerCoordinates); diff --git a/Content.Shared/Mobs/Systems/MobStateSystem.Subscribers.cs b/Content.Shared/Mobs/Systems/MobStateSystem.Subscribers.cs index 0c2fcc05794..08b351e61e8 100644 --- a/Content.Shared/Mobs/Systems/MobStateSystem.Subscribers.cs +++ b/Content.Shared/Mobs/Systems/MobStateSystem.Subscribers.cs @@ -10,12 +10,15 @@ using Content.Shared.Mobs.Components; using Content.Shared.Movement.Events; using Content.Shared.Pointing; +using Content.Shared.Projectiles; using Content.Shared.Pulling.Events; using Content.Shared.Speech; using Content.Shared.Standing; using Content.Shared.Strip.Components; using Content.Shared.Throwing; +using Content.Shared.Weapons.Ranged.Components; using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Events; namespace Content.Shared.Mobs.Systems; diff --git a/Content.Shared/Movement/Components/CanWalkComponent.cs b/Content.Shared/Movement/Components/CanWalkComponent.cs new file mode 100644 index 00000000000..fab851595c7 --- /dev/null +++ b/Content.Shared/Movement/Components/CanWalkComponent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Movement.Components; + +/// +/// Indicates if the entity can toggle walking or not. +/// +[NetworkedComponent, RegisterComponent] +public sealed partial class CanWalkComponent : Component +{ +} diff --git a/Content.Shared/Movement/Components/InputMoverComponent.cs b/Content.Shared/Movement/Components/InputMoverComponent.cs index f1e34c90df4..263190d46fd 100644 --- a/Content.Shared/Movement/Components/InputMoverComponent.cs +++ b/Content.Shared/Movement/Components/InputMoverComponent.cs @@ -1,9 +1,11 @@ using System.Numerics; +using Content.Shared.Alert; using Content.Shared.Movement.Systems; using Robust.Shared.GameStates; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; using Robust.Shared.Timing; +using Robust.Shared.Prototypes; namespace Content.Shared.Movement.Components { @@ -74,6 +76,9 @@ public sealed partial class InputMoverComponent : Component [ViewVariables(VVAccess.ReadWrite)] public bool CanMove = true; + + [DataField] + public ProtoId WalkingAlert = "Walking"; } [Serializable, NetSerializable] diff --git a/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs b/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs index a0feab7052c..813a18f974c 100644 --- a/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs +++ b/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs @@ -14,7 +14,7 @@ public sealed partial class MovementSpeedModifierComponent : Component // Weightless public const float DefaultMinimumFrictionSpeed = 0.005f; public const float DefaultWeightlessFriction = 1f; - public const float DefaultWeightlessFrictionNoInput = 0.2f; + public const float DefaultWeightlessFrictionNoInput = 0f; public const float DefaultWeightlessModifier = 0.7f; public const float DefaultWeightlessAcceleration = 1f; diff --git a/Content.Shared/Movement/Pulling/Components/PullableComponent.cs b/Content.Shared/Movement/Pulling/Components/PullableComponent.cs new file mode 100644 index 00000000000..db889e7e3bd --- /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 00000000000..1fc9b731bd5 --- /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 00000000000..b0101c46996 --- /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 00000000000..cd7edc5f623 --- /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 00000000000..a427e448d5c --- /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 00000000000..29460e1dfc1 --- /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 00000000000..47aa34562fb --- /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 00000000000..b347c6da164 --- /dev/null +++ b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs @@ -0,0 +1,494 @@ +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); + } + } + + var oldPuller = pullableComp.Puller; + pullableComp.PullJointId = null; + pullableComp.Puller = null; + Dirty(pullableUid, pullableComp); + + // No more joints with puller -> force stop pull. + if (TryComp(oldPuller, out var pullerComp)) + { + var pullerUid = oldPuller.Value; + _alertsSystem.ClearAlert(pullerUid, AlertType.Pulling); + pullerComp.Pulling = null; + Dirty(oldPuller.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); + } + + + _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/SharedContentEyeSystem.cs b/Content.Shared/Movement/Systems/SharedContentEyeSystem.cs index 207f14a258a..6dc7fdfd899 100644 --- a/Content.Shared/Movement/Systems/SharedContentEyeSystem.cs +++ b/Content.Shared/Movement/Systems/SharedContentEyeSystem.cs @@ -1,9 +1,11 @@ using System.Numerics; using Content.Shared.Administration; using Content.Shared.Administration.Managers; +using Content.Shared.CCVar; using Content.Shared.Ghost; using Content.Shared.Input; using Content.Shared.Movement.Components; +using Robust.Shared.Configuration; using Robust.Shared.Input.Binding; using Robust.Shared.Player; using Robust.Shared.Serialization; @@ -16,10 +18,13 @@ namespace Content.Shared.Movement.Systems; public abstract class SharedContentEyeSystem : EntitySystem { [Dependency] private readonly ISharedAdminManager _admin = default!; + [Dependency] private readonly IConfigurationManager _config = default!; - public const float ZoomMod = 1.5f; - public static readonly Vector2 DefaultZoom = Vector2.One; - public static readonly Vector2 MinZoom = DefaultZoom * (float)Math.Pow(ZoomMod, -3); + // Will be overridden according to config. + public readonly Vector2 DefaultZoom = Vector2.One; + public float ZoomMod { get; private set; } = 1f; + public int ZoomLevels { get; private set; } = 1; + public Vector2 MinZoom { get; private set; } = Vector2.One; [Dependency] private readonly SharedEyeSystem _eye = default!; @@ -38,6 +43,17 @@ public override void Initialize() Log.Level = LogLevel.Info; UpdatesOutsidePrediction = true; + + Subs.CVar(_config, CCVars.ZoomLevelStep, value => + { + ZoomMod = value; + RecalculateZoomLevels(); + }, true); + Subs.CVar(_config, CCVars.ZoomLevels, value => + { + ZoomLevels = value; + RecalculateZoomLevels(); + }, true); } public override void Shutdown() @@ -46,6 +62,11 @@ public override void Shutdown() CommandBinds.Unregister(); } + private void RecalculateZoomLevels() + { + MinZoom = DefaultZoom * (float) Math.Pow(ZoomMod, -ZoomLevels); + } + private void ResetZoom(ICommonSession? session) { if (TryComp(session?.AttachedEntity, out ContentEyeComponent? eye)) diff --git a/Content.Shared/Movement/Systems/SharedMoverController.Input.cs b/Content.Shared/Movement/Systems/SharedMoverController.Input.cs index bce3aeff527..891bd518b1c 100644 --- a/Content.Shared/Movement/Systems/SharedMoverController.Input.cs +++ b/Content.Shared/Movement/Systems/SharedMoverController.Input.cs @@ -1,4 +1,5 @@ using System.Numerics; +using Content.Shared.Alert; using Content.Shared.CCVar; using Content.Shared.Follower.Components; using Content.Shared.Input; @@ -333,6 +334,7 @@ private void OnInputInit(EntityUid uid, InputMoverComponent component, Component component.RelativeEntity = xform.GridUid ?? xform.MapUid; component.TargetRelativeRotation = Angle.Zero; + WalkingAlert(uid, !component.Sprinting); } private void HandleRunChange(EntityUid uid, ushort subTick, bool walking) @@ -344,6 +346,7 @@ private void HandleRunChange(EntityUid uid, ushort subTick, bool walking) // if we swap to relay then stop our existing input if we ever change back. if (moverComp != null) { + WalkingAlert(uid, walking); SetMoveInput(moverComp, MoveButtons.None); } @@ -460,10 +463,11 @@ private void ResetSubtick(InputMoverComponent component) component.LastInputSubTick = 0; } + public void SetSprinting(EntityUid entity, InputMoverComponent component, ushort subTick, bool walking) { // Logger.Info($"[{_gameTiming.CurTick}/{subTick}] Sprint: {enabled}"); - + WalkingAlert(entity, walking); SetMoveInput(entity, component, subTick, walking, MoveButtons.Walk); } diff --git a/Content.Shared/Movement/Systems/SharedMoverController.cs b/Content.Shared/Movement/Systems/SharedMoverController.cs index 4d9eedbf7c4..4c2c91db6a1 100644 --- a/Content.Shared/Movement/Systems/SharedMoverController.cs +++ b/Content.Shared/Movement/Systems/SharedMoverController.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using System.Numerics; +using Content.Shared.Alert; using Content.Shared.Bed.Sleep; using Content.Shared.CCVar; using Content.Shared.Friction; @@ -9,7 +10,7 @@ using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Components; using Content.Shared.Movement.Events; -using Content.Shared.Pulling.Components; +using Content.Shared.StepTrigger.Components; using Content.Shared.Tag; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; @@ -23,7 +24,8 @@ using Robust.Shared.Physics.Systems; using Robust.Shared.Timing; using Robust.Shared.Utility; -using Content.Shared.StepTrigger.Components; // Delta V-NoShoesSilentFootstepsComponent +using PullableComponent = Content.Shared.Movement.Pulling.Components.PullableComponent; + namespace Content.Shared.Movement.Systems { @@ -33,6 +35,7 @@ namespace Content.Shared.Movement.Systems /// public abstract partial class SharedMoverController : VirtualController { + [Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly IConfigurationManager _configManager = default!; [Dependency] protected readonly IGameTiming Timing = default!; [Dependency] private readonly IMapManager _mapManager = default!; @@ -55,7 +58,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; @@ -87,7 +90,7 @@ public override void Initialize() RelayTargetQuery = GetEntityQuery(); PhysicsQuery = GetEntityQuery(); RelayQuery = GetEntityQuery(); - PullableQuery = GetEntityQuery(); + PullableQuery = GetEntityQuery(); XformQuery = GetEntityQuery(); NoRotateQuery = GetEntityQuery(); CanMoveInAirQuery = GetEntityQuery(); @@ -165,6 +168,7 @@ protected void HandleMobMovement( var (walkDir, sprintDir) = GetVelocityInput(mover); var touching = false; + // Handle wall-pushes. if (weightless) { @@ -285,6 +289,14 @@ protected void HandleMobMovement( PhysicsSystem.SetAngularVelocity(physicsUid, 0, body: physicsComponent); } + public void WalkingAlert(EntityUid player, bool walking) + { + if (HasComp(player)) + { + _alerts.ShowAlert(player, AlertType.Walking, walking ? (short) 0 : (short) 1); + } + } + public void LerpRotation(EntityUid uid, InputMoverComponent mover, float frameTime) { var angleDiff = Angle.ShortestDistance(mover.RelativeRotation, mover.TargetRelativeRotation); @@ -378,7 +390,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; } @@ -440,7 +452,7 @@ private bool TryGetSound( sound = moverModifier.FootstepSoundCollection; return true; } - + // If got the component in yml and no shoes = no sound. Delta V if (_entities.TryGetComponent(uid, out NoShoesSilentFootstepsComponent? _) & !_inventory.TryGetSlotEntity(uid, "shoes", out var _)) @@ -469,7 +481,7 @@ private bool TryGetFootstepSound( sound = null; // Fallback to the map? - if (!_mapManager.TryGetGrid(xform.GridUid, out var grid)) + if (!TryComp(xform.GridUid, out var grid)) { if (TryComp(xform.MapUid, out var modifier)) { diff --git a/Content.Shared/Nutrition/Events.cs b/Content.Shared/Nutrition/Events.cs index e27603763fa..f2936d603d9 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/Nyanotrasen/Item/PseudoItem/AllowsSleepInsideComponent.cs b/Content.Shared/Nyanotrasen/Item/PseudoItem/AllowsSleepInsideComponent.cs new file mode 100644 index 00000000000..a28c7698fcd --- /dev/null +++ b/Content.Shared/Nyanotrasen/Item/PseudoItem/AllowsSleepInsideComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Shared.Nyanotrasen.Item.PseudoItem; + +/// +/// Signifies that pseudo-item creatures can sleep inside the container to which this component is applied. +/// +[RegisterComponent] +public sealed partial class AllowsSleepInsideComponent : Component +{ +} diff --git a/Content.Shared/Nyanotrasen/Item/PseudoItem/PseudoItemComponent.cs b/Content.Shared/Nyanotrasen/Item/PseudoItem/PseudoItemComponent.cs index d3774439d36..458b514b969 100644 --- a/Content.Shared/Nyanotrasen/Item/PseudoItem/PseudoItemComponent.cs +++ b/Content.Shared/Nyanotrasen/Item/PseudoItem/PseudoItemComponent.cs @@ -3,10 +3,10 @@ namespace Content.Shared.Nyanotrasen.Item.PseudoItem; - /// - /// For entities that behave like an item under certain conditions, - /// but not under most conditions. - /// +/// +/// For entities that behave like an item under certain conditions, +/// but not under most conditions. +/// [RegisterComponent, AutoGenerateComponentState] public sealed partial class PseudoItemComponent : Component { @@ -24,4 +24,10 @@ public sealed partial class PseudoItemComponent : Component public Vector2i StoredOffset; public bool Active = false; + + /// + /// Action for sleeping while inside a container with . + /// + [DataField] + public EntityUid? SleepAction; } diff --git a/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.Checks.cs b/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.Checks.cs index 7000c654048..906503b3707 100644 --- a/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.Checks.cs +++ b/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.Checks.cs @@ -3,163 +3,33 @@ namespace Content.Shared.Nyanotrasen.Item.PseudoItem; -/// -/// Almost all of this is code taken from other systems, but adapted to use PseudoItem. -/// I couldn't use the original functions because the resolve would fuck shit up, even if I passed a constructed itemcomp -/// -/// This is horrible, and I hate it. But such is life -/// public partial class SharedPseudoItemSystem { - protected bool CheckItemFits(Entity itemEnt, Entity storageEnt) + /// + /// Checks if the pseudo-item can be inserted into the specified storage entity. + /// + /// + /// This function creates and uses a fake item component if the entity doesn't have one. + /// + public bool CheckItemFits(Entity itemEnt, Entity storageEnt) { if (!Resolve(itemEnt, ref itemEnt.Comp) || !Resolve(storageEnt, ref storageEnt.Comp)) return false; - if (Transform(itemEnt).Anchored) + if (!TryComp(itemEnt, out var metadata)) return false; - if (storageEnt.Comp.Whitelist?.IsValid(itemEnt, EntityManager) == false) - return false; - - if (storageEnt.Comp.Blacklist?.IsValid(itemEnt, EntityManager) == true) - return false; - - var maxSize = _storage.GetMaxItemSize(storageEnt); - if (_item.GetSizePrototype(itemEnt.Comp.Size) > maxSize) - return false; - - // The following is shitfucked together straight from TryGetAvailableGridSpace, but eh, it works - - var itemComp = new ItemComponent - { Size = itemEnt.Comp.Size, Shape = itemEnt.Comp.Shape, StoredOffset = itemEnt.Comp.StoredOffset }; - - var storageBounding = storageEnt.Comp.Grid.GetBoundingBox(); - - Angle startAngle; - if (storageEnt.Comp.DefaultStorageOrientation == null) - startAngle = Angle.FromDegrees(-itemComp.StoredRotation); // PseudoItem doesn't support this - else - { - if (storageBounding.Width < storageBounding.Height) - { - startAngle = storageEnt.Comp.DefaultStorageOrientation == StorageDefaultOrientation.Horizontal - ? Angle.Zero - : Angle.FromDegrees(90); - } - else - { - startAngle = storageEnt.Comp.DefaultStorageOrientation == StorageDefaultOrientation.Vertical - ? Angle.Zero - : Angle.FromDegrees(90); - } - } - - for (var y = storageBounding.Bottom; y <= storageBounding.Top; y++) - { - for (var x = storageBounding.Left; x <= storageBounding.Right; x++) - { - for (var angle = startAngle; angle <= Angle.FromDegrees(360 - startAngle); angle += Math.PI / 2f) - { - var location = new ItemStorageLocation(angle, (x, y)); - if (ItemFitsInGridLocation(itemEnt, storageEnt, location.Position, location.Rotation)) - return true; - } - } - } - - return false; - } - - private bool ItemFitsInGridLocation( - Entity itemEnt, - Entity storageEnt, - Vector2i position, - Angle rotation) - { - if (!Resolve(itemEnt, ref itemEnt.Comp) || !Resolve(storageEnt, ref storageEnt.Comp)) - return false; - - var gridBounds = storageEnt.Comp.Grid.GetBoundingBox(); - if (!gridBounds.Contains(position)) - return false; - - var itemShape = GetAdjustedItemShape(itemEnt, rotation, position); - - foreach (var box in itemShape) + TryComp(itemEnt, out var item); + // If the entity doesn't have an item comp, create a fake one + // The fake component is never actually added to the entity + item ??= new ItemComponent { - for (var offsetY = box.Bottom; offsetY <= box.Top; offsetY++) - { - for (var offsetX = box.Left; offsetX <= box.Right; offsetX++) - { - var pos = (offsetX, offsetY); - - if (!IsGridSpaceEmpty(itemEnt, storageEnt, pos, itemShape)) - return false; - } - } - } - - return true; - } - - private IReadOnlyList GetAdjustedItemShape(Entity entity, Angle rotation, - Vector2i position) - { - if (!Resolve(entity, ref entity.Comp)) - return new Box2i[] { }; - - var shapes = entity.Comp.Shape ?? _item.GetSizePrototype(entity.Comp.Size).DefaultShape; - var boundingShape = shapes.GetBoundingBox(); - var boundingCenter = ((Box2) boundingShape).Center; - var matty = Matrix3.CreateTransform(boundingCenter, rotation); - var drift = boundingShape.BottomLeft - matty.TransformBox(boundingShape).BottomLeft; - - var adjustedShapes = new List(); - foreach (var shape in shapes) - { - var transformed = matty.TransformBox(shape).Translated(drift); - var floored = new Box2i(transformed.BottomLeft.Floored(), transformed.TopRight.Floored()); - var translated = floored.Translated(position); - - adjustedShapes.Add(translated); - } - - return adjustedShapes; - } - - private bool IsGridSpaceEmpty(Entity itemEnt, Entity storageEnt, - Vector2i location, IReadOnlyList shape) - { - if (!Resolve(storageEnt, ref storageEnt.Comp)) - return false; - - var validGrid = false; - foreach (var grid in storageEnt.Comp.Grid) - { - if (grid.Contains(location)) - { - validGrid = true; - break; - } - } - - if (!validGrid) - return false; - - foreach (var (ent, storedItem) in storageEnt.Comp.StoredItems) - { - if (ent == itemEnt.Owner) - continue; - - var adjustedShape = shape; - foreach (var box in adjustedShape) - { - if (box.Contains(location)) - return false; - } - } + Owner = itemEnt, + Shape = itemEnt.Comp.Shape, + Size = itemEnt.Comp.Size, + StoredOffset = itemEnt.Comp.StoredOffset + }; - return true; + return _storage.CanInsert(storageEnt, itemEnt, out _, storageEnt.Comp, item, ignoreStacks: true); } } diff --git a/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.cs b/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.cs index 4b7910746f1..5f4e6184346 100644 --- a/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.cs +++ b/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.cs @@ -1,14 +1,18 @@ +using Content.Shared.Actions; +using Content.Shared.Bed.Sleep; using Content.Shared.DoAfter; using Content.Shared.Hands; using Content.Shared.IdentityManagement; using Content.Shared.Interaction.Events; using Content.Shared.Item; using Content.Shared.Item.PseudoItem; +using Content.Shared.Popups; using Content.Shared.Storage; using Content.Shared.Storage.EntitySystems; using Content.Shared.Tag; using Content.Shared.Verbs; using Robust.Shared.Containers; +using Robust.Shared.Prototypes; namespace Content.Shared.Nyanotrasen.Item.PseudoItem; @@ -18,9 +22,13 @@ public abstract partial class SharedPseudoItemSystem : EntitySystem [Dependency] private readonly SharedItemSystem _item = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly TagSystem _tag = default!; + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; [ValidatePrototypeId] private const string PreventTag = "PreventLabel"; + [ValidatePrototypeId] + private const string SleepActionId = "ActionSleep"; // The action used for sleeping inside bags. Currently uses the default sleep action (same as beds) public override void Initialize() { @@ -64,7 +72,7 @@ private void AddInsertVerb(EntityUid uid, PseudoItemComponent component, GetVerb args.Verbs.Add(verb); } - private bool TryInsert(EntityUid storageUid, EntityUid toInsert, PseudoItemComponent component, + public bool TryInsert(EntityUid storageUid, EntityUid toInsert, PseudoItemComponent component, StorageComponent? storage = null) { if (!Resolve(storageUid, ref storage)) @@ -87,6 +95,10 @@ private bool TryInsert(EntityUid storageUid, EntityUid toInsert, PseudoItemCompo return false; } + // If the storage allows sleeping inside, add the respective action + if (HasComp(storageUid)) + _actions.AddAction(toInsert, ref component.SleepAction, SleepActionId, toInsert); + component.Active = true; return true; } @@ -98,9 +110,11 @@ private void OnEntRemoved(EntityUid uid, PseudoItemComponent component, EntGotRe RemComp(uid); component.Active = false; + + _actions.RemoveAction(uid, component.SleepAction); // Remove sleep action if it was added } - private void OnGettingPickedUpAttempt(EntityUid uid, PseudoItemComponent component, + protected virtual void OnGettingPickedUpAttempt(EntityUid uid, PseudoItemComponent component, GettingPickedUpAttemptEvent args) { if (args.User == args.Item) @@ -154,7 +168,11 @@ protected void StartInsertDoAfter(EntityUid inserter, EntityUid toInsert, Entity NeedHand = true }; - _doAfter.TryStartDoAfter(args); + if (_doAfter.TryStartDoAfter(args)) + { + // Show a popup to the person getting picked up + _popupSystem.PopupEntity(Loc.GetString("carry-started", ("carrier", inserter)), toInsert, toInsert); + } } private void OnAttackAttempt(EntityUid uid, PseudoItemComponent component, AttackAttemptEvent args) diff --git a/Content.Shared/OfferItem/OfferItemComponent.cs b/Content.Shared/OfferItem/OfferItemComponent.cs new file mode 100644 index 00000000000..eb4d84932e5 --- /dev/null +++ b/Content.Shared/OfferItem/OfferItemComponent.cs @@ -0,0 +1,26 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.OfferItem; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] +[Access(typeof(SharedOfferItemSystem))] +public sealed partial class OfferItemComponent : Component +{ + [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] + public bool IsInOfferMode; + + [DataField, AutoNetworkedField] + public bool IsInReceiveMode; + + [DataField, AutoNetworkedField] + public string? Hand; + + [DataField, AutoNetworkedField] + public EntityUid? Item; + + [DataField, AutoNetworkedField] + public EntityUid? Target; + + [DataField] + public float MaxOfferDistance = 2f; +} diff --git a/Content.Shared/OfferItem/SharedOfferItemSystem.Interactions.cs b/Content.Shared/OfferItem/SharedOfferItemSystem.Interactions.cs new file mode 100644 index 00000000000..230f59a380c --- /dev/null +++ b/Content.Shared/OfferItem/SharedOfferItemSystem.Interactions.cs @@ -0,0 +1,74 @@ +using Content.Shared.Popups; +using Content.Shared.ActionBlocker; +using Content.Shared.Input; +using Content.Shared.Hands.Components; +using Robust.Shared.Input.Binding; +using Robust.Shared.Player; + +namespace Content.Shared.OfferItem; + +public abstract partial class SharedOfferItemSystem +{ + [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + + private void InitializeInteractions() + { + CommandBinds.Builder + .Bind(ContentKeyFunctions.OfferItem, InputCmdHandler.FromDelegate(SetInOfferMode, handle: false, outsidePrediction: false)) + .Register(); + } + + public override void Shutdown() + { + base.Shutdown(); + + CommandBinds.Unregister(); + } + + private void SetInOfferMode(ICommonSession? session) + { + if (session is not { } playerSession) + return; + + if ((playerSession.AttachedEntity is not { Valid: true } uid || !Exists(uid)) || + !_actionBlocker.CanInteract(uid, null)) + return; + + if (!TryComp(uid, out var offerItem)) + return; + + if (!TryComp(uid, out var hands) || hands.ActiveHand == null) + return; + + offerItem.Item = hands.ActiveHand.HeldEntity; + + if (offerItem.IsInOfferMode == false) + { + if (offerItem.Item == null) + { + _popup.PopupEntity(Loc.GetString("offer-item-empty-hand"), uid, uid); + return; + } + + if (offerItem.Hand == null || offerItem.Target == null) + { + offerItem.IsInOfferMode = true; + offerItem.Hand = hands.ActiveHand.Name; + + Dirty(uid, offerItem); + return; + } + } + + if (offerItem.Target != null) + { + UnReceive(offerItem.Target.Value, offerItem: offerItem); + offerItem.IsInOfferMode = false; + Dirty(uid, offerItem); + return; + } + + UnOffer(uid, offerItem); + } +} diff --git a/Content.Shared/OfferItem/SharedOfferItemSystem.cs b/Content.Shared/OfferItem/SharedOfferItemSystem.cs new file mode 100644 index 00000000000..ffea2a67c0e --- /dev/null +++ b/Content.Shared/OfferItem/SharedOfferItemSystem.cs @@ -0,0 +1,157 @@ +using Content.Shared.Interaction; +using Content.Shared.IdentityManagement; +using Content.Shared.Hands.Components; + +namespace Content.Shared.OfferItem; + +public abstract partial class SharedOfferItemSystem : EntitySystem +{ + [Dependency] private readonly SharedTransformSystem _transform = default!; + + public override void Initialize() + { + SubscribeLocalEvent(SetInReceiveMode); + SubscribeLocalEvent(OnMove); + + InitializeInteractions(); + } + + private void SetInReceiveMode(EntityUid uid, OfferItemComponent component, InteractUsingEvent args) + { + if (!TryComp(args.User, out var offerItem)) + return; + + if (args.User == uid || component.IsInReceiveMode || !offerItem.IsInOfferMode || + (offerItem.IsInReceiveMode && offerItem.Target != uid)) + return; + + component.IsInReceiveMode = true; + component.Target = args.User; + + Dirty(uid, component); + + offerItem.Target = uid; + offerItem.IsInOfferMode = false; + + Dirty(args.User, offerItem); + + if (offerItem.Item == null) + return; + + _popup.PopupEntity(Loc.GetString("offer-item-try-give", + ("item", Identity.Entity(offerItem.Item.Value, EntityManager)), + ("target", Identity.Entity(uid, EntityManager))), component.Target.Value, component.Target.Value); + _popup.PopupEntity(Loc.GetString("offer-item-try-give-target", + ("user", Identity.Entity(component.Target.Value, EntityManager)), + ("item", Identity.Entity(offerItem.Item.Value, EntityManager))), component.Target.Value, uid); + + args.Handled = true; + } + + private void OnMove(EntityUid uid, OfferItemComponent component, MoveEvent args) + { + if (component.Target == null || + args.NewPosition.InRange(EntityManager, _transform, + Transform(component.Target.Value).Coordinates, component.MaxOfferDistance)) + return; + + UnOffer(uid, component); + } + + /// + /// Resets the of the user and the target + /// + protected void UnOffer(EntityUid uid, OfferItemComponent component) + { + if (!TryComp(uid, out var hands) || hands.ActiveHand == null) + return; + + + if (TryComp(component.Target, out var offerItem) && component.Target != null) + { + + if (component.Item != null) + { + _popup.PopupEntity(Loc.GetString("offer-item-no-give", + ("item", Identity.Entity(component.Item.Value, EntityManager)), + ("target", Identity.Entity(component.Target.Value, EntityManager))), uid, uid); + _popup.PopupEntity(Loc.GetString("offer-item-no-give-target", + ("user", Identity.Entity(uid, EntityManager)), + ("item", Identity.Entity(component.Item.Value, EntityManager))), uid, component.Target.Value); + } + + else if (offerItem.Item != null) + { + _popup.PopupEntity(Loc.GetString("offer-item-no-give", + ("item", Identity.Entity(offerItem.Item.Value, EntityManager)), + ("target", Identity.Entity(uid, EntityManager))), component.Target.Value, component.Target.Value); + _popup.PopupEntity(Loc.GetString("offer-item-no-give-target", + ("user", Identity.Entity(component.Target.Value, EntityManager)), + ("item", Identity.Entity(offerItem.Item.Value, EntityManager))), component.Target.Value, uid); + } + + offerItem.IsInOfferMode = false; + offerItem.IsInReceiveMode = false; + offerItem.Hand = null; + offerItem.Target = null; + offerItem.Item = null; + + Dirty(component.Target.Value, offerItem); + } + + component.IsInOfferMode = false; + component.IsInReceiveMode = false; + component.Hand = null; + component.Target = null; + component.Item = null; + + Dirty(uid, component); + } + + + /// + /// Cancels the transfer of the item + /// + protected void UnReceive(EntityUid uid, OfferItemComponent? component = null, OfferItemComponent? offerItem = null) + { + if (component == null && !TryComp(uid, out component)) + return; + + if (offerItem == null && !TryComp(component.Target, out offerItem)) + return; + + if (!TryComp(uid, out var hands) || hands.ActiveHand == null || + component.Target == null) + return; + + if (offerItem.Item != null) + { + _popup.PopupEntity(Loc.GetString("offer-item-no-give", + ("item", Identity.Entity(offerItem.Item.Value, EntityManager)), + ("target", Identity.Entity(uid, EntityManager))), component.Target.Value, component.Target.Value); + _popup.PopupEntity(Loc.GetString("offer-item-no-give-target", + ("user", Identity.Entity(component.Target.Value, EntityManager)), + ("item", Identity.Entity(offerItem.Item.Value, EntityManager))), component.Target.Value, uid); + } + + if (!offerItem.IsInReceiveMode) + { + offerItem.Target = null; + component.Target = null; + } + + offerItem.Item = null; + offerItem.Hand = null; + component.IsInReceiveMode = false; + + Dirty(uid, component); + } + + /// + /// Returns true if = true + /// + protected bool IsInOfferMode(EntityUid? entity, OfferItemComponent? component = null) + { + return entity != null && Resolve(entity.Value, ref component, false) && component.IsInOfferMode; + } +} diff --git a/Content.Shared/Physics/Controllers/SharedConveyorController.cs b/Content.Shared/Physics/Controllers/SharedConveyorController.cs index ec17df7a24f..c9ec77ba1c9 100644 --- a/Content.Shared/Physics/Controllers/SharedConveyorController.cs +++ b/Content.Shared/Physics/Controllers/SharedConveyorController.cs @@ -3,6 +3,7 @@ using Content.Shared.Gravity; using Content.Shared.Movement.Systems; using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Controllers; @@ -146,7 +147,7 @@ private static Vector2 Convey(Vector2 direction, float speed, float frameTime, V EntityQuery bodyQuery) { // Check if the thing's centre overlaps the grid tile. - var grid = MapManager.GetGrid(xform.GridUid!.Value); + var grid = Comp(xform.GridUid!.Value); var tile = grid.GetTileRef(xform.Coordinates); var conveyorBounds = Lookup.GetLocalBounds(tile, grid.TileSize); diff --git a/Content.Shared/Physics/FrictionRemoverSystem.cs b/Content.Shared/Physics/FrictionRemoverSystem.cs new file mode 100644 index 00000000000..c8d7521eb01 --- /dev/null +++ b/Content.Shared/Physics/FrictionRemoverSystem.cs @@ -0,0 +1,34 @@ +using Robust.Shared.Map.Components; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Systems; + +namespace Content.Shared.Physics; + +public sealed class FrictionRemoverSystem : EntitySystem +{ + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(RemoveDampening); + } + + + private void RemoveDampening(EntityUid uid, PhysicsComponent component, PhysicsSleepEvent args) + { + var linear = 0f; + var angular = 0f; + if (TryComp(uid, out var dampening) && dampening.Enabled) + { + linear = dampening.LinearDampening; + angular = dampening.AngularDampening; + } + + _physics.SetAngularDamping(uid, component, angular, false); + _physics.SetLinearDamping(uid, component, linear); + } +} diff --git a/Content.Shared/Physics/PassiveDampeningComponent.cs b/Content.Shared/Physics/PassiveDampeningComponent.cs new file mode 100644 index 00000000000..834569195ee --- /dev/null +++ b/Content.Shared/Physics/PassiveDampeningComponent.cs @@ -0,0 +1,18 @@ +namespace Content.Shared.Physics; + +/// +/// A component that allows an entity to have friction (linear and angular dampening) +/// even when not being affected by gravity. +/// +[RegisterComponent] +public sealed partial class PassiveDampeningComponent : Component +{ + [DataField] + public bool Enabled = true; + + [DataField] + public float LinearDampening = 0.2f; + + [DataField] + public float AngularDampening = 0.2f; +} diff --git a/Content.Shared/Players/ContentPlayerData.cs b/Content.Shared/Players/ContentPlayerData.cs index e2074479871..cc7a7e9780f 100644 --- a/Content.Shared/Players/ContentPlayerData.cs +++ b/Content.Shared/Players/ContentPlayerData.cs @@ -1,4 +1,5 @@ -using Content.Shared.GameTicking; +using Content.Shared.Administration; +using Content.Shared.GameTicking; using Content.Shared.Mind; using Robust.Shared.Network; @@ -38,7 +39,12 @@ public sealed class ContentPlayerData public bool ExplicitlyDeadminned { get; set; } /// - /// Nyanotrasen - Are they whitelisted? Lets us avoid async. + /// If true, the admin will not show up in adminwho except to admins with the flag. + /// + public bool Stealthed { get; set; } + + /// + /// Nyanotrasen - Are they whitelisted? Lets us avoid async. /// [ViewVariables] public bool Whitelisted { get; set; } diff --git a/Content.Shared/Preferences/HumanoidCharacterProfile.cs b/Content.Shared/Preferences/HumanoidCharacterProfile.cs index ece9a82bb24..601a62da894 100644 --- a/Content.Shared/Preferences/HumanoidCharacterProfile.cs +++ b/Content.Shared/Preferences/HumanoidCharacterProfile.cs @@ -35,6 +35,8 @@ private HumanoidCharacterProfile( string name, string flavortext, string species, + float height, + float width, int age, Sex sex, Gender gender, @@ -51,6 +53,8 @@ private HumanoidCharacterProfile( Name = name; FlavorText = flavortext; Species = species; + Height = height; + Width = width; Age = age; Sex = sex; Gender = gender; @@ -72,7 +76,7 @@ private HumanoidCharacterProfile( List antagPreferences, List traitPreferences, List loadoutPreferences) - : this(other.Name, other.FlavorText, other.Species, other.Age, other.Sex, other.Gender, other.Appearance, + : this(other.Name, other.FlavorText, other.Species, other.Height, other.Width, other.Age, other.Sex, other.Gender, other.Appearance, other.Clothing, other.Backpack, other.SpawnPriority, jobPriorities, other.PreferenceUnavailable, antagPreferences, traitPreferences, loadoutPreferences) { @@ -90,6 +94,8 @@ public HumanoidCharacterProfile( string name, string flavortext, string species, + float height, + float width, int age, Sex sex, Gender gender, @@ -102,7 +108,7 @@ public HumanoidCharacterProfile( IReadOnlyList antagPreferences, IReadOnlyList traitPreferences, IReadOnlyList loadoutPreferences) - : this(name, flavortext, species, age, sex, gender, appearance, clothing, backpack, spawnPriority, + : this(name, flavortext, species, height, width, age, sex, gender, appearance, clothing, backpack, spawnPriority, new Dictionary(jobPriorities), preferenceUnavailable, new List(antagPreferences), new List(traitPreferences), new List(loadoutPreferences)) @@ -118,6 +124,8 @@ public HumanoidCharacterProfile() : this( "John Doe", "", SharedHumanoidAppearanceSystem.DefaultSpecies, + 1f, + 1f, 18, Sex.Male, Gender.Male, @@ -147,6 +155,8 @@ public static HumanoidCharacterProfile DefaultWithSpecies(string species = Share "John Doe", "", species, + 1f, + 1f, 18, Sex.Male, Gender.Male, @@ -186,10 +196,14 @@ public static HumanoidCharacterProfile RandomWithSpecies(string species = Shared var sex = Sex.Unsexed; var age = 18; + var height = 1f; + var width = 1f; if (prototypeManager.TryIndex(species, out var speciesPrototype)) { sex = random.Pick(speciesPrototype.Sexes); age = random.Next(speciesPrototype.MinAge, speciesPrototype.OldAge); // people don't look and keep making 119 year old characters with zero rp, cap it at middle aged + height = random.NextFloat(speciesPrototype.MinHeight, speciesPrototype.MaxHeight); + width = random.NextFloat(speciesPrototype.MinWidth, speciesPrototype.MaxWidth); } var gender = Gender.Epicene; @@ -206,7 +220,7 @@ public static HumanoidCharacterProfile RandomWithSpecies(string species = Shared var name = GetName(species, gender); - return new HumanoidCharacterProfile(name, "", species, age, sex, gender, + return new HumanoidCharacterProfile(name, "", species, height, width, age, sex, gender, HumanoidCharacterAppearance.Random(species, sex), ClothingPreference.Jumpsuit, BackpackPreference.Backpack, SpawnPriorityPreference.None, new Dictionary @@ -217,8 +231,15 @@ public static HumanoidCharacterProfile RandomWithSpecies(string species = Shared public string Name { get; private set; } public string FlavorText { get; private set; } + [DataField("species")] public string Species { get; private set; } + [DataField("height")] + public float Height { get; private set; } + + [DataField("width")] + public float Width { get; private set; } + [DataField("age")] public int Age { get; private set; } @@ -271,6 +292,15 @@ public HumanoidCharacterProfile WithSpecies(string species) return new(this) { Species = species }; } + public HumanoidCharacterProfile WithHeight(float height) + { + return new(this) { Height = height }; + } + + public HumanoidCharacterProfile WithWidth(float width) + { + return new(this) { Width = width }; + } public HumanoidCharacterProfile WithCharacterAppearance(HumanoidCharacterAppearance appearance) { @@ -393,21 +423,22 @@ public HumanoidCharacterProfile WithLoadoutPreference(string loadoutId, bool pre public bool MemberwiseEquals(ICharacterProfile maybeOther) { - if (maybeOther is not HumanoidCharacterProfile other || - Name != other.Name || - Age != other.Age || - Sex != other.Sex || - Gender != other.Gender || - PreferenceUnavailable != other.PreferenceUnavailable || - Clothing != other.Clothing || - Backpack != other.Backpack || - SpawnPriority != other.SpawnPriority || - !_jobPriorities.SequenceEqual(other._jobPriorities) || - !_antagPreferences.SequenceEqual(other._antagPreferences) || - !_traitPreferences.SequenceEqual(other._traitPreferences) || - !_loadoutPreferences.SequenceEqual(other._loadoutPreferences)) + if (maybeOther is not HumanoidCharacterProfile other + || Name != other.Name + || Age != other.Age + || Height != other.Height + || Width != other.Width + || Sex != other.Sex + || Gender != other.Gender + || PreferenceUnavailable != other.PreferenceUnavailable + || Clothing != other.Clothing + || Backpack != other.Backpack + || SpawnPriority != other.SpawnPriority + || !_jobPriorities.SequenceEqual(other._jobPriorities) + || !_antagPreferences.SequenceEqual(other._antagPreferences) + || !_traitPreferences.SequenceEqual(other._traitPreferences) + || !_loadoutPreferences.SequenceEqual(other._loadoutPreferences)) return false; - return Appearance.MemberwiseEquals(other.Appearance); } @@ -495,6 +526,14 @@ public void EnsureValid(IConfigurationManager configManager, IPrototypeManager p flavortext = FormattedMessage.RemoveMarkup(FlavorText); } + var height = Height; + if (speciesPrototype != null) + height = Math.Clamp(Height, speciesPrototype.MinHeight, speciesPrototype.MaxHeight); + + var width = Width; + if (speciesPrototype != null) + width = Math.Clamp(Width, speciesPrototype.MinWidth, speciesPrototype.MaxWidth); + var appearance = HumanoidCharacterAppearance.EnsureValid(Appearance, Species, Sex); var prefsUnavailableMode = PreferenceUnavailable switch @@ -545,26 +584,47 @@ public void EnsureValid(IConfigurationManager configManager, IPrototypeManager p .Where(prototypeManager.HasIndex) .ToList(); + var maxTraits = configManager.GetCVar(CCVars.GameTraitsMax); + var currentTraits = 0; + var traitPoints = configManager.GetCVar(CCVars.GameTraitsDefaultPoints); + + foreach (var trait in traits.OrderBy(t => -prototypeManager.Index(t).Points).ToList()) + { + var proto = prototypeManager.Index(trait); + + if (traitPoints + proto.Points < 0 || currentTraits + 1 > maxTraits) + traits.Remove(trait); + else + { + traitPoints += proto.Points; + currentTraits++; + } + } + + var loadouts = LoadoutPreferences .Where(prototypeManager.HasIndex) .ToList(); - var maxLoadouts = configManager.GetCVar(CCVars.GameLoadoutsPoints); - var currentLoadouts = 0; + var loadoutPoints = configManager.GetCVar(CCVars.GameLoadoutsPoints); + var currentPoints = 0; foreach (var loadout in loadouts.ToList()) { var proto = prototypeManager.Index(loadout); - if (currentLoadouts + proto.Cost > maxLoadouts) + if (currentPoints + proto.Cost > loadoutPoints) loadouts.Remove(loadout); else - currentLoadouts += proto.Cost; + currentPoints += proto.Cost; } + Name = name; FlavorText = flavortext; Age = age; + Height = height; + Width = width; Sex = sex; Gender = gender; Appearance = appearance; @@ -624,12 +684,16 @@ public override int GetHashCode() Clothing, Backpack ), - SpawnPriority, - PreferenceUnavailable, - _jobPriorities, - _antagPreferences, - _traitPreferences, - _loadoutPreferences + HashCode.Combine( + SpawnPriority, + Height, + Width, + PreferenceUnavailable, + _jobPriorities, + _antagPreferences, + _traitPreferences, + _loadoutPreferences + ) ); } } diff --git a/Content.Shared/Pulling/Components/PullableComponent.cs b/Content.Shared/Pulling/Components/PullableComponent.cs deleted file mode 100644 index c5c30688699..00000000000 --- 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 57a86e7f7a8..00000000000 --- 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 6296dc2f14f..00000000000 --- 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 b11de7c1702..00000000000 --- 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 0ede284bb0c..00000000000 --- 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 afcbcb70740..00000000000 --- 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 46c6b1291d6..00000000000 --- 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 0233e32f2b4..00000000000 --- 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 3dab476337b..00000000000 --- 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 e388d7a57c6..00000000000 --- 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 38ed8998898..00000000000 --- 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 1e2bb90c61e..00000000000 --- 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 0c139ee9e35..00000000000 --- 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 187c8d8a9d8..9e784512076 100644 --- a/Content.Shared/RCD/Systems/RCDSystem.cs +++ b/Content.Shared/RCD/Systems/RCDSystem.cs @@ -25,7 +25,6 @@ namespace Content.Shared.RCD.Systems; public sealed class RCDSystem : EntitySystem { [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly IMapManager _mapMan = default!; [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly ITileDefinitionManager _tileDefMan = default!; @@ -39,7 +38,7 @@ public sealed class RCDSystem : EntitySystem [Dependency] private readonly TurfSystem _turf = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; - private readonly int RcdModeCount = Enum.GetValues(typeof(RcdMode)).Length; + private readonly int _rcdModeCount = Enum.GetValues(typeof(RcdMode)).Length; public override void Initialize() { @@ -133,7 +132,7 @@ private void OnDoAfterAttempt(EntityUid uid, RCDComponent comp, DoAfterAttemptEv return; } - var mapGrid = _mapMan.GetGrid(gridId.Value); + var mapGrid = Comp(gridId.Value); var tile = mapGrid.GetTileRef(location); if (!IsRCDStillValid(uid, comp, args.Event.User, args.Event.Target, mapGrid, tile, args.Event.StartingMode)) @@ -158,7 +157,7 @@ private void OnDoAfter(EntityUid uid, RCDComponent comp, RCDDoAfterEvent args) return; } - var mapGrid = _mapMan.GetGrid(gridId.Value); + var mapGrid = Comp(gridId.Value); var tile = mapGrid.GetTileRef(location); var snapPos = mapGrid.TileIndicesFor(location); @@ -311,7 +310,7 @@ private void NextMode(EntityUid uid, RCDComponent comp, EntityUid user) _audio.PlayPredicted(comp.SwapModeSound, uid, user); var mode = (int) comp.Mode; - mode = ++mode % RcdModeCount; + mode = ++mode % _rcdModeCount; comp.Mode = (RcdMode) mode; Dirty(comp); diff --git a/Content.Shared/Remotes/Components/DoorRemoteComponent.cs b/Content.Shared/Remotes/Components/DoorRemoteComponent.cs new file mode 100644 index 00000000000..b157596e3b9 --- /dev/null +++ b/Content.Shared/Remotes/Components/DoorRemoteComponent.cs @@ -0,0 +1,19 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Remotes.Components; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class DoorRemoteComponent : Component +{ + [AutoNetworkedField] + [DataField] + public OperatingMode Mode = OperatingMode.OpenClose; +} + +public enum OperatingMode : byte +{ + OpenClose, + ToggleBolts, + ToggleEmergencyAccess, + placeholderForUiUpdates +} diff --git a/Content.Shared/Remotes/EntitySystems/SharedDoorRemoteSystem.cs b/Content.Shared/Remotes/EntitySystems/SharedDoorRemoteSystem.cs new file mode 100644 index 00000000000..e9bbd27ada4 --- /dev/null +++ b/Content.Shared/Remotes/EntitySystems/SharedDoorRemoteSystem.cs @@ -0,0 +1,44 @@ +using Content.Shared.Popups; +using Content.Shared.Interaction.Events; +using Content.Shared.Remotes.Components; + +namespace Content.Shared.Remotes.EntitySystems; + +public abstract class SharedDoorRemoteSystem : EntitySystem +{ + [Dependency] protected readonly SharedPopupSystem Popup = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnInHandActivation); + } + + private void OnInHandActivation(Entity entity, ref UseInHandEvent args) + { + string switchMessageId; + switch (entity.Comp.Mode) + { + case OperatingMode.OpenClose: + entity.Comp.Mode = OperatingMode.ToggleBolts; + switchMessageId = "door-remote-switch-state-toggle-bolts"; + break; + + // Skip toggle bolts mode and move on from there (to emergency access) + case OperatingMode.ToggleBolts: + entity.Comp.Mode = OperatingMode.ToggleEmergencyAccess; + switchMessageId = "door-remote-switch-state-toggle-emergency-access"; + break; + + // Skip ToggleEmergencyAccess mode and move on from there (to door toggle) + case OperatingMode.ToggleEmergencyAccess: + entity.Comp.Mode = OperatingMode.OpenClose; + switchMessageId = "door-remote-switch-state-open-close"; + break; + default: + throw new InvalidOperationException( + $"{nameof(DoorRemoteComponent)} had invalid mode {entity.Comp.Mode}"); + } + Dirty(entity); + Popup.PopupClient(Loc.GetString(switchMessageId), entity, args.User); + } +} diff --git a/Content.Shared/Research/Components/ResearchStealerComponent.cs b/Content.Shared/Research/Components/ResearchStealerComponent.cs index e0331fad1bb..df8878e6516 100644 --- a/Content.Shared/Research/Components/ResearchStealerComponent.cs +++ b/Content.Shared/Research/Components/ResearchStealerComponent.cs @@ -14,4 +14,16 @@ public sealed partial class ResearchStealerComponent : Component /// [DataField("delay"), ViewVariables(VVAccess.ReadWrite)] public TimeSpan Delay = TimeSpan.FromSeconds(20); + + /// + /// The minimum number of technologies that will be stolen + /// + [DataField] + public int MinToSteal = 4; + + /// + /// The maximum number of technologies that will be stolen + /// + [DataField] + public int MaxToSteal = 8; } diff --git a/Content.Shared/Research/Systems/SharedResearchSystem.cs b/Content.Shared/Research/Systems/SharedResearchSystem.cs index 12f27d0b9c9..9819e949b8b 100644 --- a/Content.Shared/Research/Systems/SharedResearchSystem.cs +++ b/Content.Shared/Research/Systems/SharedResearchSystem.cs @@ -1,6 +1,7 @@ using System.Linq; using Content.Shared.Research.Components; using Content.Shared.Research.Prototypes; +using JetBrains.Annotations; using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Utility; @@ -219,16 +220,58 @@ public void TrySetMainDiscipline(TechnologyPrototype prototype, EntityUid uid, T if (!Resolve(uid, ref component)) return; - var discipline = PrototypeManager.Index(prototype.Discipline); + var discipline = PrototypeManager.Index(prototype.Discipline); if (prototype.Tier < discipline.LockoutTier) return; component.MainDiscipline = prototype.Discipline; Dirty(uid, component); } + /// + /// Removes a technology and its recipes from a technology database. + /// + public bool TryRemoveTechnology(Entity entity, ProtoId tech) + { + return TryRemoveTechnology(entity, PrototypeManager.Index(tech)); + } + + /// + /// Removes a technology and its recipes from a technology database. + /// + [PublicAPI] + public bool TryRemoveTechnology(Entity entity, TechnologyPrototype tech) + { + if (!entity.Comp.UnlockedTechnologies.Remove(tech.ID)) + return false; + + // check to make sure we didn't somehow get the recipe from another tech. + // unlikely, but whatever + var recipes = tech.RecipeUnlocks; + foreach (var recipe in recipes) + { + var hasTechElsewhere = false; + foreach (var unlockedTech in entity.Comp.UnlockedTechnologies) + { + var unlockedTechProto = PrototypeManager.Index(unlockedTech); + + if (!unlockedTechProto.RecipeUnlocks.Contains(recipe)) + continue; + hasTechElsewhere = true; + break; + } + + if (!hasTechElsewhere) + entity.Comp.UnlockedRecipes.Remove(recipe); + } + Dirty(entity, entity.Comp); + UpdateTechnologyCards(entity, entity); + return true; + } + /// /// Clear all unlocked technologies from the database. /// + [PublicAPI] public void ClearTechs(EntityUid uid, TechnologyDatabaseComponent? comp = null) { if (!Resolve(uid, ref comp) || comp.UnlockedTechnologies.Count == 0) diff --git a/Content.Shared/Resist/EscapeInventoryCancelEvent.cs b/Content.Shared/Resist/EscapeInventoryCancelEvent.cs new file mode 100644 index 00000000000..75ee09ff045 --- /dev/null +++ b/Content.Shared/Resist/EscapeInventoryCancelEvent.cs @@ -0,0 +1,5 @@ +using Content.Shared.Actions; + +namespace Content.Shared.Resist; + +public sealed partial class EscapeInventoryCancelActionEvent : InstantActionEvent; diff --git a/Content.Shared/Security/Systems/DeployableBarrierSystem.cs b/Content.Shared/Security/Systems/DeployableBarrierSystem.cs index 7b9ce841a99..622edc4b62e 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/Shuttles/Components/IFFComponent.cs b/Content.Shared/Shuttles/Components/IFFComponent.cs index a7e6ac1152b..6bacbd2b5b1 100644 --- a/Content.Shared/Shuttles/Components/IFFComponent.cs +++ b/Content.Shared/Shuttles/Components/IFFComponent.cs @@ -10,11 +10,6 @@ namespace Content.Shared.Shuttles.Components; [Access(typeof(SharedShuttleSystem))] public sealed partial class IFFComponent : Component { - /// - /// Should we show IFF by default? - /// - public const bool ShowIFFDefault = true; - public static readonly Color SelfColor = Color.MediumSpringGreen; /// diff --git a/Content.Shared/Shuttles/Systems/SharedShuttleSystem.IFF.cs b/Content.Shared/Shuttles/Systems/SharedShuttleSystem.IFF.cs index ed687d48f4b..8231e48e2db 100644 --- a/Content.Shared/Shuttles/Systems/SharedShuttleSystem.IFF.cs +++ b/Content.Shared/Shuttles/Systems/SharedShuttleSystem.IFF.cs @@ -28,11 +28,6 @@ public Color GetIFFColor(EntityUid gridUid, bool self = false, IFFComponent? com public string? GetIFFLabel(EntityUid gridUid, bool self = false, IFFComponent? component = null) { - if (!IFFComponent.ShowIFFDefault) - { - return null; - } - var entName = MetaData(gridUid).EntityName; if (self) diff --git a/Content.Shared/Shuttles/Systems/SharedShuttleSystem.cs b/Content.Shared/Shuttles/Systems/SharedShuttleSystem.cs index 324fd65c860..ca25a49b23f 100644 --- a/Content.Shared/Shuttles/Systems/SharedShuttleSystem.cs +++ b/Content.Shared/Shuttles/Systems/SharedShuttleSystem.cs @@ -146,7 +146,6 @@ public bool FTLFree(EntityUid shuttleUid, EntityCoordinates coordinates, Angle a // Just checks if any grids inside of a buffer range at the target position. _grids.Clear(); - var ftlRange = FTLRange; var mapCoordinates = coordinates.ToMap(EntityManager, XformSystem); var ourPos = Maps.GetGridPosition((shuttleUid, shuttlePhysics, shuttleXform)); diff --git a/Content.Shared/Slippery/SlipperySystem.cs b/Content.Shared/Slippery/SlipperySystem.cs index d20495cfa6c..ff8b597a0d5 100644 --- a/Content.Shared/Slippery/SlipperySystem.cs +++ b/Content.Shared/Slippery/SlipperySystem.cs @@ -31,14 +31,14 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(HandleAttemptCollide); - SubscribeLocalEvent(HandleStepTrigger); + SubscribeLocalEvent(HandleStepTrigger); SubscribeLocalEvent(OnNoSlipAttempt); SubscribeLocalEvent(OnThrownSlipAttempt); // as long as slip-resistant mice are never added, this should be fine (otherwise a mouse-hat will transfer it's power to the wearer). SubscribeLocalEvent>((e, c, ev) => OnNoSlipAttempt(e, c, ev.Args)); } - private void HandleStepTrigger(EntityUid uid, SlipperyComponent component, ref StepTriggeredEvent args) + private void HandleStepTrigger(EntityUid uid, SlipperyComponent component, ref StepTriggeredOffEvent args) { TrySlip(uid, component, args.Tripper); } diff --git a/Content.Shared/Sound/SharedEmitSoundSystem.cs b/Content.Shared/Sound/SharedEmitSoundSystem.cs index 22ba8e0e3ee..56a51744acf 100644 --- a/Content.Shared/Sound/SharedEmitSoundSystem.cs +++ b/Content.Shared/Sound/SharedEmitSoundSystem.cs @@ -9,6 +9,7 @@ using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Network; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; @@ -25,7 +26,6 @@ public abstract class SharedEmitSoundSystem : EntitySystem { [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly INetManager _netMan = default!; - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly ITileDefinitionManager _tileDefMan = default!; [Dependency] protected readonly IRobustRandom Random = default!; [Dependency] private readonly SharedAudioSystem _audioSystem = default!; @@ -54,7 +54,7 @@ private void OnEmitSoundOnLand(EntityUid uid, BaseEmitSoundComponent component, { if (!args.PlaySound || !TryComp(uid, out var xform) || - !_mapManager.TryGetGrid(xform.GridUid, out var grid)) + !TryComp(xform.GridUid, out var grid)) { return; } diff --git a/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs b/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs index f4731bf46ab..b8483d021a4 100644 --- a/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs +++ b/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs @@ -49,8 +49,14 @@ public sealed partial class StepTriggerComponent : Component /// If this is true, steptrigger will still occur on entities that are in air / weightless. They do not /// by default. /// - [DataField] + [DataField, AutoNetworkedField] public bool IgnoreWeightless; + + /// + /// Does this have separate "StepOn" and "StepOff" triggers. + /// + [DataField, AutoNetworkedField] + public bool StepOn = false; } [RegisterComponent] diff --git a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs index ede39b2aa97..b4ac2cde756 100644 --- a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs +++ b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs @@ -11,6 +11,7 @@ public sealed class StepTriggerSystem : EntitySystem { [Dependency] private readonly EntityLookupSystem _entityLookup = default!; [Dependency] private readonly SharedGravitySystem _gravity = default!; + [Dependency] private readonly SharedMapSystem _map = default!; public override void Initialize() { @@ -40,7 +41,9 @@ public override void Update(float frameTime) while (enumerator.MoveNext(out var uid, out var active, out var trigger, out var transform)) { if (!Update(uid, trigger, transform, query)) + { continue; + } RemCompDeferred(uid, active); } @@ -56,7 +59,8 @@ private bool Update(EntityUid uid, StepTriggerComponent component, TransformComp if (component.Blacklist != null && TryComp(transform.GridUid, out var grid)) { - var anch = grid.GetAnchoredEntitiesEnumerator(grid.LocalToTile(transform.Coordinates)); + var positon = _map.LocalToTile(uid, grid, transform.Coordinates); + var anch = _map.GetAnchoredEntitiesEnumerator(uid, grid, positon); while (anch.MoveNext(out var ent)) { @@ -109,8 +113,16 @@ private void UpdateColliding(EntityUid uid, StepTriggerComponent component, Tran return; } - var ev = new StepTriggeredEvent { Source = uid, Tripper = otherUid }; - RaiseLocalEvent(uid, ref ev, true); + if (component.StepOn) + { + var evStep = new StepTriggeredOnEvent(uid, otherUid); + RaiseLocalEvent(uid, ref evStep); + } + else + { + var evStep = new StepTriggeredOffEvent(uid, otherUid); + RaiseLocalEvent(uid, ref evStep); + } component.CurrentlySteppedOn.Add(otherUid); Dirty(uid, component); @@ -130,7 +142,7 @@ private bool CanTrigger(EntityUid uid, EntityUid otherUid, StepTriggerComponent var msg = new StepTriggerAttemptEvent { Source = uid, Tripper = otherUid }; - RaiseLocalEvent(uid, ref msg, true); + RaiseLocalEvent(uid, ref msg); return msg.Continue && !msg.Cancelled; } @@ -163,6 +175,12 @@ private void OnEndCollide(EntityUid uid, StepTriggerComponent component, ref End component.CurrentlySteppedOn.Remove(otherUid); Dirty(uid, component); + if (component.StepOn) + { + var evStepOff = new StepTriggeredOffEvent(uid, otherUid); + RaiseLocalEvent(uid, ref evStepOff); + } + if (component.Colliding.Count == 0) { RemCompDeferred(uid); @@ -230,9 +248,14 @@ public struct StepTriggerAttemptEvent public bool Cancelled; } +/// +/// Raised when an entity stands on a steptrigger initially (assuming it has both on and off states). +/// [ByRefEvent] -public struct StepTriggeredEvent -{ - public EntityUid Source; - public EntityUid Tripper; -} +public readonly record struct StepTriggeredOnEvent(EntityUid Source, EntityUid Tripper); + +/// +/// Raised when an entity leaves a steptrigger if it has on and off states OR when an entity intersects a steptrigger. +/// +[ByRefEvent] +public readonly record struct StepTriggeredOffEvent(EntityUid Source, EntityUid Tripper); diff --git a/Content.Shared/Storage/EntitySystems/DumpableSystem.cs b/Content.Shared/Storage/EntitySystems/DumpableSystem.cs index 04f7231416f..568d9dab3bd 100644 --- a/Content.Shared/Storage/EntitySystems/DumpableSystem.cs +++ b/Content.Shared/Storage/EntitySystems/DumpableSystem.cs @@ -19,17 +19,16 @@ public sealed class DumpableSystem : EntitySystem [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly SharedDisposalUnitSystem _disposalUnitSystem = default!; [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; [Dependency] private readonly SharedTransformSystem _transformSystem = default!; - private EntityQuery _xformQuery; + private EntityQuery _itemQuery; public override void Initialize() { base.Initialize(); - _xformQuery = GetEntityQuery(); + _itemQuery = GetEntityQuery(); SubscribeLocalEvent(OnAfterInteract, after: new[]{ typeof(SharedEntityStorageSystem) }); SubscribeLocalEvent>(AddDumpVerb); SubscribeLocalEvent>(AddUtilityVerbs); @@ -111,7 +110,7 @@ private void AddUtilityVerbs(EntityUid uid, DumpableComponent dumpable, GetVerbs } } - private void StartDoAfter(EntityUid storageUid, EntityUid? targetUid, EntityUid userUid, DumpableComponent dumpable) + private void StartDoAfter(EntityUid storageUid, EntityUid targetUid, EntityUid userUid, DumpableComponent dumpable) { if (!TryComp(storageUid, out var storage)) return; @@ -120,7 +119,7 @@ private void StartDoAfter(EntityUid storageUid, EntityUid? targetUid, EntityUid foreach (var entity in storage.Container.ContainedEntities) { - if (!TryComp(entity, out var itemComp) || + if (!_itemQuery.TryGetComponent(entity, out var itemComp) || !_prototypeManager.TryIndex(itemComp.Size, out var itemSize)) { continue; @@ -139,33 +138,16 @@ private void StartDoAfter(EntityUid storageUid, EntityUid? targetUid, EntityUid }); } - private void OnDoAfter(EntityUid uid, DumpableComponent component, DoAfterEvent args) + private void OnDoAfter(EntityUid uid, DumpableComponent component, DumpableDoAfterEvent args) { - if (args.Handled || args.Cancelled || !TryComp(uid, out var storage)) + if (args.Handled || args.Cancelled || !TryComp(uid, out var storage) || storage.Container.ContainedEntities.Count == 0) return; - Queue dumpQueue = new(); - foreach (var entity in storage.Container.ContainedEntities) - { - dumpQueue.Enqueue(entity); - } - - if (dumpQueue.Count == 0) - return; - - foreach (var entity in dumpQueue) - { - var transform = Transform(entity); - _container.AttachParentToContainerOrGrid((entity, transform)); - _transformSystem.SetLocalPositionRotation(entity, transform.LocalPosition + _random.NextVector2Box() / 2, _random.NextAngle(), transform); - } - - if (args.Args.Target == null) - return; + var dumpQueue = new Queue(storage.Container.ContainedEntities); var dumped = false; - if (_disposalUnitSystem.HasDisposals(args.Args.Target.Value)) + if (_disposalUnitSystem.HasDisposals(args.Args.Target)) { dumped = true; @@ -174,22 +156,31 @@ private void OnDoAfter(EntityUid uid, DumpableComponent component, DoAfterEvent _disposalUnitSystem.DoInsertDisposalUnit(args.Args.Target.Value, entity, args.Args.User); } } - else if (HasComp(args.Args.Target.Value)) + else if (HasComp(args.Args.Target)) { dumped = true; - var targetPos = _xformQuery.GetComponent(args.Args.Target.Value).LocalPosition; + var targetPos = _transformSystem.GetWorldPosition(args.Args.Target.Value); + + foreach (var entity in dumpQueue) + { + _transformSystem.SetWorldPosition(entity, targetPos + _random.NextVector2Box() / 4); + } + } + else + { + var targetPos = _transformSystem.GetWorldPosition(uid); foreach (var entity in dumpQueue) { - _transformSystem.SetLocalPosition(entity, targetPos + _random.NextVector2Box() / 4); + var transform = Transform(entity); + _transformSystem.SetWorldPositionRotation(entity, targetPos + _random.NextVector2Box() / 4, _random.NextAngle(), transform); } } if (dumped) { - // TODO: Predicted when above predicted - _audio.PlayPvs(component.DumpSound, uid); + _audio.PlayPredicted(component.DumpSound, uid, args.User); } } } diff --git a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs index 11075b4a4c7..799fb7e33e9 100644 --- a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs @@ -3,6 +3,7 @@ using System.Linq; using Content.Shared.ActionBlocker; using Content.Shared.Containers.ItemSlots; +using Content.Shared.Coordinates; using Content.Shared.Destructible; using Content.Shared.DoAfter; using Content.Shared.Hands.Components; @@ -12,6 +13,7 @@ using Content.Shared.Item; using Content.Shared.Lock; using Content.Shared.Nyanotrasen.Item.PseudoItem; +using Content.Shared.Materials; using Content.Shared.Placeable; using Content.Shared.Popups; using Content.Shared.Stacks; @@ -96,6 +98,9 @@ public override void Initialize() SubscribeAllEvent(OnSetItemLocation); SubscribeAllEvent(OnInsertItemIntoLocation); SubscribeAllEvent(OnRemoveItem); + + SubscribeLocalEvent(OnReclaimed); + UpdatePrototypeCache(); } @@ -389,6 +394,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 = TransformSystem.GetMoverCoordinates(uid); diff --git a/Content.Shared/Strip/Components/StrippableComponent.cs b/Content.Shared/Strip/Components/StrippableComponent.cs index fbf99992e3c..00725808297 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, ThievingStealth stealth = ThievingStealth.Obvious) : 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 ThievingStealth 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, ThievingStealth stealth = ThievingStealth.Obvious) : 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, ThievingStealth stealth = ThievingStealth.Obvious) : 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 83679f132c4..bc66c7d8328 100644 --- a/Content.Shared/Strip/Components/ThievingComponent.cs +++ b/Content.Shared/Strip/Components/ThievingComponent.cs @@ -1,22 +1,34 @@ +using Robust.Shared.GameStates; + namespace Content.Shared.Strip.Components; /// /// Give this to an entity when you want to decrease stripping times /// -[RegisterComponent] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class ThievingComponent : Component { /// /// How much the strip time should be shortened by /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("stripTimeReduction")] - public float StripTimeReduction = 0.5f; + [DataField] + public TimeSpan StripTimeReduction = TimeSpan.FromSeconds(0.5f); + + /// + /// A multiplier coefficient for strip time + /// + [DataField] + public float StripTimeMultiplier = 1f; /// /// Should it notify the user if they're stripping a pocket? /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("stealthy")] - public bool Stealthy; + [DataField] + public ThievingStealth Stealth = ThievingStealth.Hidden; + + /// + /// Should the user be able to see hidden items? (i.e pockets) + /// + [DataField, AutoNetworkedField] + public bool IgnoreStripHidden; } diff --git a/Content.Shared/Strip/SharedStrippableSystem.cs b/Content.Shared/Strip/SharedStrippableSystem.cs index a698ae5035a..64dd6a81f3a 100644 --- a/Content.Shared/Strip/SharedStrippableSystem.cs +++ b/Content.Shared/Strip/SharedStrippableSystem.cs @@ -1,11 +1,14 @@ using Content.Shared.DragDrop; using Content.Shared.Hands.Components; +using Content.Shared.Popups; using Content.Shared.Strip.Components; namespace Content.Shared.Strip; public abstract class SharedStrippableSystem : EntitySystem { + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly ThievingSystem _thieving = default!; public override void Initialize() { base.Initialize(); @@ -14,12 +17,12 @@ public override void Initialize() SubscribeLocalEvent(OnDragDrop); } - public (float Time, bool Stealth) GetStripTimeModifiers(EntityUid user, EntityUid target, float initialTime) + public (TimeSpan Time, ThievingStealth 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); } @@ -55,4 +58,17 @@ private void OnCanDrop(EntityUid uid, StrippableComponent component, ref CanDrop if (args.CanDrop) args.Handled = true; } + + public void StripPopup(string messageId, ThievingStealth stealth, EntityUid target, EntityUid? user = null, EntityUid? item = null, string slot = "") + { + bool subtle = stealth == ThievingStealth.Subtle; + PopupType? popupSize = _thieving.GetPopupTypeFromStealth(stealth); + + if (popupSize.HasValue) // We should always have a value if we're not hidden + _popup.PopupEntity(Loc.GetString(messageId, + ("user", subtle ? Loc.GetString("thieving-component-user") : user ?? EntityUid.Invalid), + ("item", subtle ? Loc.GetString("thieving-component-item") : item ?? EntityUid.Invalid), + ("slot", slot)), + target, target, popupSize.Value); + } } diff --git a/Content.Shared/Strip/ThievingSystem.cs b/Content.Shared/Strip/ThievingSystem.cs index 0ef4b66571f..8f523accfea 100644 --- a/Content.Shared/Strip/ThievingSystem.cs +++ b/Content.Shared/Strip/ThievingSystem.cs @@ -1,5 +1,7 @@ using Content.Shared.Inventory; +using Content.Shared.Popups; using Content.Shared.Strip.Components; +using Robust.Shared.Serialization; namespace Content.Shared.Strip; @@ -16,7 +18,41 @@ public override void Initialize() private void OnBeforeStrip(EntityUid uid, ThievingComponent component, BeforeStripEvent args) { - args.Stealth |= component.Stealthy; + args.Stealth = (ThievingStealth) Math.Max((sbyte) args.Stealth, (sbyte) component.Stealth); args.Additive -= component.StripTimeReduction; + args.Multiplier *= component.StripTimeMultiplier; } + + public PopupType? GetPopupTypeFromStealth(ThievingStealth stealth) + { + switch (stealth) + { + case ThievingStealth.Hidden: + return null; + + case ThievingStealth.Subtle: + return PopupType.Small; + + default: + return PopupType.Large; + } + } +} +[Serializable, NetSerializable] +public enum ThievingStealth : sbyte +{ + /// + /// Target sees a large popup indicating that an item is being stolen by who + /// + Obvious = 0, + + /// + /// Target sees a small popup indicating that an item is being stolen + /// + Subtle = 1, + + /// + /// Target does not see any popup regarding the stealing of an item + /// + Hidden = 2 } diff --git a/Content.Shared/SubFloor/SharedSubFloorHideSystem.cs b/Content.Shared/SubFloor/SharedSubFloorHideSystem.cs index 02b4e617901..ba78ff651f5 100644 --- a/Content.Shared/SubFloor/SharedSubFloorHideSystem.cs +++ b/Content.Shared/SubFloor/SharedSubFloorHideSystem.cs @@ -15,7 +15,6 @@ namespace Content.Shared.SubFloor [UsedImplicitly] public abstract class SharedSubFloorHideSystem : EntitySystem { - [Dependency] protected readonly IMapManager MapManager = default!; [Dependency] private readonly ITileDefinitionManager _tileDefinitionManager = default!; [Dependency] private readonly SharedAmbientSoundSystem _ambientSoundSystem = default!; [Dependency] protected readonly SharedAppearanceSystem Appearance = default!; @@ -93,7 +92,7 @@ private void OnTileChanged(ref TileChangedEvent args) if (args.NewTile.Tile.IsEmpty) return; // Anything that was here will be unanchored anyways. - UpdateTile(MapManager.GetGrid(args.NewTile.GridUid), args.NewTile.GridIndices); + UpdateTile(Comp(args.NewTile.GridUid), args.NewTile.GridIndices); } /// @@ -104,7 +103,7 @@ private void UpdateFloorCover(EntityUid uid, SubFloorHideComponent? component = if (!Resolve(uid, ref component, ref xform)) return; - if (xform.Anchored && MapManager.TryGetGrid(xform.GridUid, out var grid)) + if (xform.Anchored && TryComp(xform.GridUid, out var grid)) component.IsUnderCover = HasFloorCover(grid, grid.TileIndicesFor(xform.Coordinates)); else component.IsUnderCover = false; diff --git a/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs b/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs index ebd83624114..8d67aec518a 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 01682863389..38772eaf340 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 16c9b13254c..f7defaa4aab 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 cc50094e3dd..ef28db26727 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/Tiles/FloorTileSystem.cs b/Content.Shared/Tiles/FloorTileSystem.cs index 1f8408319d3..0d368495f18 100644 --- a/Content.Shared/Tiles/FloorTileSystem.cs +++ b/Content.Shared/Tiles/FloorTileSystem.cs @@ -116,7 +116,7 @@ private void OnAfterInteract(EntityUid uid, FloorTileComponent component, AfterI } } } - _mapManager.TryGetGrid(location.EntityId, out var mapGrid); + TryComp(location.EntityId, out var mapGrid); foreach (var currentTile in component.OutputTiles) { diff --git a/Content.Shared/Traits/Assorted/AccentlessSystem.cs b/Content.Shared/Traits/Assorted/AccentlessSystem.cs deleted file mode 100644 index 2242bc6e52b..00000000000 --- a/Content.Shared/Traits/Assorted/AccentlessSystem.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Robust.Shared.Serialization.Manager; - -namespace Content.Shared.Traits.Assorted; - -/// -/// This handles removing accents when using the accentless trait. -/// -public sealed class AccentlessSystem : EntitySystem -{ - /// - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(RemoveAccents); - } - - private void RemoveAccents(EntityUid uid, AccentlessComponent component, ComponentStartup args) - { - foreach (var accent in component.RemovedAccents.Values) - { - var accentComponent = accent.Component; - RemComp(uid, accentComponent.GetType()); - } - } -} diff --git a/Content.Shared/Traits/Assorted/AccentlessComponent.cs b/Content.Shared/Traits/Assorted/Components/AccentlessComponent.cs similarity index 89% rename from Content.Shared/Traits/Assorted/AccentlessComponent.cs rename to Content.Shared/Traits/Assorted/Components/AccentlessComponent.cs index 96ebf4d83f6..084a1e1d925 100644 --- a/Content.Shared/Traits/Assorted/AccentlessComponent.cs +++ b/Content.Shared/Traits/Assorted/Components/AccentlessComponent.cs @@ -1,7 +1,7 @@ using Robust.Shared.GameStates; using Robust.Shared.Prototypes; -namespace Content.Shared.Traits.Assorted; +namespace Content.Shared.Traits.Assorted.Components; /// /// This is used for the accentless trait diff --git a/Content.Shared/Traits/Assorted/Components/LegsParalyzedComponent.cs b/Content.Shared/Traits/Assorted/Components/LegsParalyzedComponent.cs new file mode 100644 index 00000000000..d0639e59339 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/LegsParalyzedComponent.cs @@ -0,0 +1,12 @@ +using Content.Shared.Traits.Assorted.Systems; +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// Set player speed to zero and standing state to down, simulating leg paralysis. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(LegsParalyzedSystem))] +public sealed partial class LegsParalyzedComponent : Component +{ +} diff --git a/Content.Shared/Traits/Assorted/Components/NormalVisionComponent.cs b/Content.Shared/Traits/Assorted/Components/NormalVisionComponent.cs new file mode 100644 index 00000000000..442bb6f0084 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/NormalVisionComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// This is used for removing species specific vision traits +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class NormalVisionComponent : Component +{ +} + diff --git a/Content.Shared/Traits/Assorted/ParacusiaComponent.cs b/Content.Shared/Traits/Assorted/Components/ParacusiaComponent.cs similarity index 93% rename from Content.Shared/Traits/Assorted/ParacusiaComponent.cs rename to Content.Shared/Traits/Assorted/Components/ParacusiaComponent.cs index 1db698359bd..ff62e55c2aa 100644 --- a/Content.Shared/Traits/Assorted/ParacusiaComponent.cs +++ b/Content.Shared/Traits/Assorted/Components/ParacusiaComponent.cs @@ -1,8 +1,9 @@ +using Content.Shared.Traits.Assorted.Systems; using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; -namespace Content.Shared.Traits.Assorted; +namespace Content.Shared.Traits.Assorted.Components; /// /// This component is used for paracusia, which causes auditory hallucinations. diff --git a/Content.Shared/Traits/Assorted/PermanentBlindnessComponent.cs b/Content.Shared/Traits/Assorted/Components/PermanentBlindnessComponent.cs similarity index 81% rename from Content.Shared/Traits/Assorted/PermanentBlindnessComponent.cs rename to Content.Shared/Traits/Assorted/Components/PermanentBlindnessComponent.cs index 76ff3e1005e..c1bf7e1639e 100644 --- a/Content.Shared/Traits/Assorted/PermanentBlindnessComponent.cs +++ b/Content.Shared/Traits/Assorted/Components/PermanentBlindnessComponent.cs @@ -1,6 +1,6 @@ using Robust.Shared.GameStates; -namespace Content.Shared.Traits.Assorted; +namespace Content.Shared.Traits.Assorted.Components; /// /// This is used for making something blind forever. diff --git a/Content.Shared/Traits/Assorted/LegsParalyzedComponent.cs b/Content.Shared/Traits/Assorted/LegsParalyzedComponent.cs deleted file mode 100644 index 59f9ca758bc..00000000000 --- a/Content.Shared/Traits/Assorted/LegsParalyzedComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Robust.Shared.GameStates; - -namespace Content.Shared.Traits.Assorted; - -/// -/// Set player speed to zero and standing state to down, simulating leg paralysis. -/// -[RegisterComponent, NetworkedComponent, Access(typeof(LegsParalyzedSystem))] -public sealed partial class LegsParalyzedComponent : Component -{ -} diff --git a/Content.Shared/Traits/Assorted/LegsParalyzedSystem.cs b/Content.Shared/Traits/Assorted/LegsParalyzedSystem.cs deleted file mode 100644 index 7c91366937c..00000000000 --- a/Content.Shared/Traits/Assorted/LegsParalyzedSystem.cs +++ /dev/null @@ -1,58 +0,0 @@ -using Content.Shared.Body.Systems; -using Content.Shared.Buckle.Components; -using Content.Shared.Movement.Events; -using Content.Shared.Movement.Systems; -using Content.Shared.Standing; -using Content.Shared.Throwing; - -namespace Content.Shared.Traits.Assorted; - -public sealed class LegsParalyzedSystem : EntitySystem -{ - [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifierSystem = default!; - [Dependency] private readonly StandingStateSystem _standingSystem = default!; - [Dependency] private readonly SharedBodySystem _bodySystem = default!; - - public override void Initialize() - { - SubscribeLocalEvent(OnStartup); - SubscribeLocalEvent(OnShutdown); - SubscribeLocalEvent(OnBuckleChange); - SubscribeLocalEvent(OnThrowPushbackAttempt); - SubscribeLocalEvent(OnUpdateCanMoveEvent); - } - - private void OnStartup(EntityUid uid, LegsParalyzedComponent component, ComponentStartup args) - { - // TODO: In future probably must be surgery related wound - _movementSpeedModifierSystem.ChangeBaseSpeed(uid, 0, 0, 20); - } - - private void OnShutdown(EntityUid uid, LegsParalyzedComponent component, ComponentShutdown args) - { - _standingSystem.Stand(uid); - _bodySystem.UpdateMovementSpeed(uid); - } - - private void OnBuckleChange(EntityUid uid, LegsParalyzedComponent component, ref BuckleChangeEvent args) - { - if (args.Buckling) - { - _standingSystem.Stand(args.BuckledEntity); - } - else - { - _standingSystem.Down(args.BuckledEntity); - } - } - - private void OnUpdateCanMoveEvent(EntityUid uid, LegsParalyzedComponent component, UpdateCanMoveEvent args) - { - args.Cancel(); - } - - private void OnThrowPushbackAttempt(EntityUid uid, LegsParalyzedComponent component, ThrowPushbackAttemptEvent args) - { - args.Cancel(); - } -} diff --git a/Content.Shared/Traits/Assorted/LightweightDrunkComponent.cs b/Content.Shared/Traits/Assorted/LightweightDrunkComponent.cs deleted file mode 100644 index 5d353ac9637..00000000000 --- a/Content.Shared/Traits/Assorted/LightweightDrunkComponent.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Robust.Shared.GameStates; -using Content.Shared.Drunk; - -namespace Content.Shared.Traits.Assorted; - -/// -/// Used for the lightweight trait. DrunkSystem will check for this component and modify the boozePower accordingly if it finds it. -/// -[RegisterComponent, NetworkedComponent] -[Access(typeof(SharedDrunkSystem))] -public sealed partial class LightweightDrunkComponent : Component -{ - [DataField("boozeStrengthMultiplier"), ViewVariables(VVAccess.ReadWrite)] - public float BoozeStrengthMultiplier = 4f; -} diff --git a/Content.Shared/Traits/Assorted/PermanentBlindnessSystem.cs b/Content.Shared/Traits/Assorted/PermanentBlindnessSystem.cs deleted file mode 100644 index 9fd5db84972..00000000000 --- a/Content.Shared/Traits/Assorted/PermanentBlindnessSystem.cs +++ /dev/null @@ -1,64 +0,0 @@ -using Content.Shared.Examine; -using Content.Shared.Eye.Blinding.Components; -using Content.Shared.Eye.Blinding.Systems; -using Content.Shared.IdentityManagement; -using Robust.Shared.Network; - -namespace Content.Shared.Traits.Assorted; - -/// -/// This handles permanent blindness, both the examine and the actual effect. -/// -public sealed class PermanentBlindnessSystem : EntitySystem -{ - [Dependency] private readonly INetManager _net = default!; - [Dependency] private readonly IEntityManager _entityManager = default!; - [Dependency] private readonly BlindableSystem _blinding = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnStartup); - SubscribeLocalEvent(OnShutdown); - SubscribeLocalEvent(OnDamageChanged); - SubscribeLocalEvent(OnExamined); - } - - private void OnExamined(Entity blindness, ref ExaminedEvent args) - { - if (args.IsInDetailsRange && !_net.IsClient) - { - args.PushMarkup(Loc.GetString("permanent-blindness-trait-examined", ("target", Identity.Entity(blindness, EntityManager)))); - } - } - - private void OnShutdown(Entity blindness, ref ComponentShutdown args) - { - _blinding.UpdateIsBlind(blindness.Owner); - } - - private void OnStartup(Entity blindness, ref ComponentStartup args) - { - if (!_entityManager.TryGetComponent(blindness, out var blindable)) - return; - - var damageToDeal = (int) BlurryVisionComponent.MaxMagnitude - blindable.EyeDamage; - - if (damageToDeal <= 0) - return; - - _blinding.AdjustEyeDamage(blindness.Owner, damageToDeal); - } - - private void OnDamageChanged(Entity blindness, ref EyeDamageChangedEvent args) - { - if (args.Damage >= BlurryVisionComponent.MaxMagnitude) - return; - - if (!_entityManager.TryGetComponent(blindness, out var blindable)) - return; - - var damageRestoration = (int) BlurryVisionComponent.MaxMagnitude - args.Damage; - _blinding.AdjustEyeDamage(blindness.Owner, damageRestoration); - } -} diff --git a/Content.Shared/Traits/Assorted/SharedParacusiaSystem.cs b/Content.Shared/Traits/Assorted/SharedParacusiaSystem.cs deleted file mode 100644 index 2bfb0da1f54..00000000000 --- a/Content.Shared/Traits/Assorted/SharedParacusiaSystem.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace Content.Shared.Traits.Assorted; - -public abstract class SharedParacusiaSystem : EntitySystem -{ -} diff --git a/Content.Shared/Traits/Assorted/Systems/AccentlessSystem.cs b/Content.Shared/Traits/Assorted/Systems/AccentlessSystem.cs new file mode 100644 index 00000000000..f4e077bc1af --- /dev/null +++ b/Content.Shared/Traits/Assorted/Systems/AccentlessSystem.cs @@ -0,0 +1,24 @@ +namespace Content.Shared.Traits.Assorted.Systems; + +/// +/// This handles removing accents when using the accentless trait. +/// +public sealed class AccentlessSystem : EntitySystem +{ + /// + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(RemoveAccents); + } + + private void RemoveAccents(EntityUid uid, Components.AccentlessComponent component, ComponentStartup args) + { + foreach (var accent in component.RemovedAccents.Values) + { + var accentComponent = accent.Component; + RemComp(uid, accentComponent.GetType()); + } + } +} diff --git a/Content.Shared/Traits/Assorted/Systems/LegsParalyzedSystem.cs b/Content.Shared/Traits/Assorted/Systems/LegsParalyzedSystem.cs new file mode 100644 index 00000000000..8ae0f251b86 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Systems/LegsParalyzedSystem.cs @@ -0,0 +1,58 @@ +using Content.Shared.Body.Systems; +using Content.Shared.Buckle.Components; +using Content.Shared.Movement.Events; +using Content.Shared.Movement.Systems; +using Content.Shared.Standing; +using Content.Shared.Throwing; + +namespace Content.Shared.Traits.Assorted.Systems; + +public sealed class LegsParalyzedSystem : EntitySystem +{ + [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifierSystem = default!; + [Dependency] private readonly StandingStateSystem _standingSystem = default!; + [Dependency] private readonly SharedBodySystem _bodySystem = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnBuckleChange); + SubscribeLocalEvent(OnThrowPushbackAttempt); + SubscribeLocalEvent(OnUpdateCanMoveEvent); + } + + private void OnStartup(EntityUid uid, Components.LegsParalyzedComponent component, ComponentStartup args) + { + // TODO: In future probably must be surgery related wound + _movementSpeedModifierSystem.ChangeBaseSpeed(uid, 0, 0, 20); + } + + private void OnShutdown(EntityUid uid, Components.LegsParalyzedComponent component, ComponentShutdown args) + { + _standingSystem.Stand(uid); + _bodySystem.UpdateMovementSpeed(uid); + } + + private void OnBuckleChange(EntityUid uid, Components.LegsParalyzedComponent component, ref BuckleChangeEvent args) + { + if (args.Buckling) + { + _standingSystem.Stand(args.BuckledEntity); + } + else + { + _standingSystem.Down(args.BuckledEntity); + } + } + + private void OnUpdateCanMoveEvent(EntityUid uid, Components.LegsParalyzedComponent component, UpdateCanMoveEvent args) + { + args.Cancel(); + } + + private void OnThrowPushbackAttempt(EntityUid uid, Components.LegsParalyzedComponent component, ThrowPushbackAttemptEvent args) + { + args.Cancel(); + } +} diff --git a/Content.Shared/Traits/Assorted/Systems/NormalVisionSystem.cs b/Content.Shared/Traits/Assorted/Systems/NormalVisionSystem.cs new file mode 100644 index 00000000000..ee25bf364b9 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Systems/NormalVisionSystem.cs @@ -0,0 +1,23 @@ +using Content.Shared.Abilities; +using Content.Shared.Traits.Assorted.Components; + +namespace Content.Shared.Traits.Assorted.Systems; + +/// +/// This handles removing species-specific vision traits. +/// +public sealed class NormalVisionSystem : EntitySystem +{ + /// + public override void Initialize() + { + SubscribeLocalEvent(OnStartup); + } + + + private void OnStartup(EntityUid uid, NormalVisionComponent component, ComponentInit args) + { + RemComp(uid); + RemComp(uid); + } +} diff --git a/Content.Shared/Traits/Assorted/Systems/PermanentBlindnessSystem.cs b/Content.Shared/Traits/Assorted/Systems/PermanentBlindnessSystem.cs new file mode 100644 index 00000000000..113939f66b7 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Systems/PermanentBlindnessSystem.cs @@ -0,0 +1,64 @@ +using Content.Shared.Examine; +using Content.Shared.Eye.Blinding.Components; +using Content.Shared.Eye.Blinding.Systems; +using Content.Shared.IdentityManagement; +using Robust.Shared.Network; + +namespace Content.Shared.Traits.Assorted.Systems; + +/// +/// This handles permanent blindness, both the examine and the actual effect. +/// +public sealed class PermanentBlindnessSystem : EntitySystem +{ + [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly BlindableSystem _blinding = default!; + + /// + public override void Initialize() + { + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnDamageChanged); + SubscribeLocalEvent(OnExamined); + } + + private void OnExamined(Entity blindness, ref ExaminedEvent args) + { + if (args.IsInDetailsRange && !_net.IsClient) + { + args.PushMarkup(Loc.GetString("trait-examined-Blindness", ("target", Identity.Entity(blindness, EntityManager)))); + } + } + + private void OnShutdown(Entity blindness, ref ComponentShutdown args) + { + _blinding.UpdateIsBlind(blindness.Owner); + } + + private void OnStartup(Entity blindness, ref ComponentStartup args) + { + if (!_entityManager.TryGetComponent(blindness, out var blindable)) + return; + + var damageToDeal = (int) BlurryVisionComponent.MaxMagnitude - blindable.EyeDamage; + + if (damageToDeal <= 0) + return; + + _blinding.AdjustEyeDamage(blindness.Owner, damageToDeal); + } + + private void OnDamageChanged(Entity blindness, ref EyeDamageChangedEvent args) + { + if (args.Damage >= BlurryVisionComponent.MaxMagnitude) + return; + + if (!_entityManager.TryGetComponent(blindness, out var blindable)) + return; + + var damageRestoration = (int) BlurryVisionComponent.MaxMagnitude - args.Damage; + _blinding.AdjustEyeDamage(blindness.Owner, damageRestoration); + } +} diff --git a/Content.Shared/Traits/Assorted/Systems/SharedParacusiaSystem.cs b/Content.Shared/Traits/Assorted/Systems/SharedParacusiaSystem.cs new file mode 100644 index 00000000000..151e748445f --- /dev/null +++ b/Content.Shared/Traits/Assorted/Systems/SharedParacusiaSystem.cs @@ -0,0 +1,5 @@ +namespace Content.Shared.Traits.Assorted.Systems; + +public abstract class SharedParacusiaSystem : EntitySystem +{ +} diff --git a/Content.Shared/Traits/Prototypes/TraitCategoryPrototype.cs b/Content.Shared/Traits/Prototypes/TraitCategoryPrototype.cs new file mode 100644 index 00000000000..efbac1ca7d0 --- /dev/null +++ b/Content.Shared/Traits/Prototypes/TraitCategoryPrototype.cs @@ -0,0 +1,14 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.Traits; + + +/// +/// A prototype defining a valid category for s to go into. +/// +[Prototype("traitCategory")] +public sealed partial class TraitCategoryPrototype : IPrototype +{ + [IdDataField] + public string ID { get; } = default!; +} diff --git a/Content.Shared/Traits/Prototypes/TraitPrototype.cs b/Content.Shared/Traits/Prototypes/TraitPrototype.cs new file mode 100644 index 00000000000..2e6b7cc0666 --- /dev/null +++ b/Content.Shared/Traits/Prototypes/TraitPrototype.cs @@ -0,0 +1,39 @@ +using Content.Shared.Customization.Systems; +using Content.Shared.Whitelist; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Traits; + + +/// +/// Describes a trait. +/// +[Prototype("trait")] +public sealed partial class TraitPrototype : IPrototype +{ + [ViewVariables] + [IdDataField] + public string ID { get; private set; } = default!; + + /// + /// Which customization tab to place this entry in + /// + [DataField(required: true), ValidatePrototypeId] + public string Category = "Uncategorized"; + + /// + /// How many points this will give the character + /// + [DataField] + public int Points = 0; + + + [DataField] + public List Requirements = new(); + + /// + /// The components that get added to the player when they pick this trait. + /// + [DataField(required: true)] + public ComponentRegistry Components { get; private set; } = default!; +} diff --git a/Content.Shared/Traits/TraitPrototype.cs b/Content.Shared/Traits/TraitPrototype.cs deleted file mode 100644 index 34feb8da22c..00000000000 --- a/Content.Shared/Traits/TraitPrototype.cs +++ /dev/null @@ -1,55 +0,0 @@ -using Content.Shared.Whitelist; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - -// don't worry about it - -namespace Content.Shared.Traits -{ - /// - /// Describes a trait. - /// - [Prototype("trait")] - public sealed partial class TraitPrototype : IPrototype - { - [ViewVariables] - [IdDataField] - public string ID { get; private set; } = default!; - - /// - /// The name of this trait. - /// - [DataField("name")] - public string Name { get; private set; } = ""; - - /// - /// The description of this trait. - /// - [DataField("description")] - public string? Description { get; private set; } - - /// - /// Don't apply this trait to entities this whitelist IS NOT valid for. - /// - [DataField("whitelist")] - public EntityWhitelist? Whitelist; - - /// - /// Don't apply this trait to entities this whitelist IS valid for. (hence, a blacklist) - /// - [DataField("blacklist")] - public EntityWhitelist? Blacklist; - - /// - /// The components that get added to the player, when they pick this trait. - /// - [DataField("components")] - public ComponentRegistry Components { get; private set; } = default!; - - /// - /// Gear that is given to the player, when they pick this trait. - /// - [DataField("traitGear", required: false, customTypeSerializer:typeof(PrototypeIdSerializer))] - public string? TraitGear; - } -} diff --git a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs index 0183a30a73b..ada99801f01 100644 --- a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs @@ -140,6 +140,12 @@ public sealed partial class GunComponent : Component [ViewVariables] public EntityCoordinates? ShootCoordinates = null; + /// + /// Who the gun is being requested to shoot at directly. + /// + [ViewVariables] + public EntityUid? Target = null; + /// /// The base value for how many shots to fire per burst. /// @@ -229,6 +235,12 @@ public sealed partial class GunComponent : Component /// [DataField] public bool ClumsyProof = false; + + /// + /// The percentage chance of a given gun to accidentally discharge if violently thrown into a wall or person + /// + [DataField] + public float FireOnDropChance = 0.1f; } [Flags] diff --git a/Content.Shared/Weapons/Ranged/Components/TargetedProjectileComponent.cs b/Content.Shared/Weapons/Ranged/Components/TargetedProjectileComponent.cs new file mode 100644 index 00000000000..b804176497d --- /dev/null +++ b/Content.Shared/Weapons/Ranged/Components/TargetedProjectileComponent.cs @@ -0,0 +1,12 @@ +using Content.Shared.Weapons.Ranged.Systems; +using Robust.Shared.GameStates; + +namespace Content.Shared.Weapons.Ranged.Components; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(SharedGunSystem))] +public sealed partial class TargetedProjectileComponent : Component +{ + [DataField, AutoNetworkedField] + public EntityUid Target; +} diff --git a/Content.Shared/Weapons/Ranged/Events/RequestShootEvent.cs b/Content.Shared/Weapons/Ranged/Events/RequestShootEvent.cs index 21e90b2108b..f5c4dd72b4f 100644 --- a/Content.Shared/Weapons/Ranged/Events/RequestShootEvent.cs +++ b/Content.Shared/Weapons/Ranged/Events/RequestShootEvent.cs @@ -11,4 +11,5 @@ public sealed class RequestShootEvent : EntityEventArgs { public NetEntity Gun; public NetCoordinates Coordinates; + public NetEntity? Target; } diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs index d47d024de5e..274828a2086 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs @@ -102,7 +102,7 @@ public void CycleFire(EntityUid uid, GunComponent component, EntityUid? user = n // TODO: Actions need doing for guns anyway. private sealed partial class CycleModeEvent : InstantActionEvent { - public SelectiveFire Mode; + public SelectiveFire Mode = default; } private void OnCycleMode(EntityUid uid, GunComponent component, CycleModeEvent args) diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index d3aee5a48e9..1dfdede1afa 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -139,6 +139,7 @@ private void OnShootRequest(RequestShootEvent msg, EntitySessionEventArgs args) gun.ShootCoordinates = GetCoordinates(msg.Coordinates); Log.Debug($"Set shoot coordinates to {gun.ShootCoordinates}"); + gun.Target = GetEntity(msg.Target); AttemptShoot(user.Value, ent, gun); } @@ -200,9 +201,18 @@ private void StopShooting(EntityUid uid, GunComponent gun) Log.Debug($"Stopped shooting {ToPrettyString(uid)}"); gun.ShotCounter = 0; gun.ShootCoordinates = null; + gun.Target = null; Dirty(uid, gun); } + /// + /// Sets the targeted entity of the gun. Should be called before attempting to shoot to avoid shooting over the target. + /// + public void SetTarget(GunComponent gun, EntityUid target) + { + gun.Target = target; + } + /// /// Attempts to shoot at the target coordinates. Resets the shot counter after every shot. /// @@ -441,7 +451,7 @@ protected void EjectCartridge( { Angle ejectAngle = angle.Value; ejectAngle += 3.7f; // 212 degrees; casings should eject slightly to the right and behind of a gun - ThrowingSystem.TryThrow(entity, ejectAngle.ToVec().Normalized() / 100, 5f); + ThrowingSystem.TryThrow(entity, ejectAngle.ToVec(), 625f); } if (playSound && TryComp(entity, out var cartridge)) { diff --git a/Content.Tests/Shared/Chat/V2/Moderation/SimpleCensor.cs b/Content.Tests/Shared/Chat/V2/Moderation/SimpleCensor.cs new file mode 100644 index 00000000000..09870af317c --- /dev/null +++ b/Content.Tests/Shared/Chat/V2/Moderation/SimpleCensor.cs @@ -0,0 +1,162 @@ +using System.Text.Unicode; +using Content.Shared.Chat.V2.Moderation; +using NUnit.Framework; + +namespace Content.Tests.Shared.Chat.V2.Moderation; + +public sealed class SimpleCensorTests +{ + [Test] + public void CanCensorASingleWord() + { + var sut = new SimpleCensor().WithCustomDictionary(["amogus"]); + var output = sut.Censor("hello amogus"); + + Assert.That(output, Is.EqualTo("hello ******")); + } + + // Basics - use custom dictionary + + [Test] + public void CanCensorMultipleWordInstances() + { + var sut= new SimpleCensor().WithCustomDictionary(["amogus"]); + var output = sut.Censor("amogus hello amogus"); + + Assert.That(output, Is.EqualTo("****** hello ******")); + } + + [Test] + public void CanCensorMultipleWords() + { + var sut= new SimpleCensor().WithCustomDictionary(["amogus", "sus"]); + var output = sut.Censor("amogus hello sus"); + + Assert.That(output, Is.EqualTo("****** hello ***")); + } + + [Test] + public void CanUseDifferentCensorSymbols() + { + var sut= new SimpleCensor().WithCustomDictionary(["amogus", "sus"]); + var output = sut.Censor("amogus hello sus", '#'); + + Assert.That(output, Is.EqualTo("###### hello ###")); + } + + [Test] + public void CanCatchCapitalizedWords() + { + var sut= new SimpleCensor().WithCustomDictionary(["amogus", "sus"]); + var output = sut.Censor("AMOGUS hello SUS"); + + Assert.That(output, Is.EqualTo("****** hello ***")); + } + + [Test] + public void CanCatchWordsWithSomeCaptialsInThem() + { + var sut= new SimpleCensor().WithCustomDictionary(["amogus", "sus"]); + var output = sut.Censor("AmoGuS hello SuS"); + + Assert.That(output, Is.EqualTo("****** hello ***")); + } + + [Test] + public void CanCatchWordsHiddenInsideOtherWords() + { + var sut= new SimpleCensor().WithCustomDictionary(["amogus", "sus"]); + var output = sut.Censor("helamoguslo suspicious"); + + Assert.That(output, Is.EqualTo("hel******lo ***picious")); + } + + // Sanitizing Leetspeak + + [Test] + public void CanSanitizeLeetspeak() + { + var sut = new SimpleCensor().WithCustomDictionary(["amogus", "sus"]).WithSanitizeLeetSpeak(); + var output = sut.Censor("am0gu5 hello 5u5"); + + Assert.That(output, Is.EqualTo("****** hello ***")); + } + + [Test] + public void SanitizingLeetspeakOnlyOccursWhenTheWordIsBlocked() + { + var sut = new SimpleCensor().WithCustomDictionary(["amogus", "sus"]).WithSanitizeLeetSpeak(); + var output = sut.Censor("he110"); + + Assert.That(output, Is.EqualTo("he110")); + } + + [Test] + public void CanCatchLeetspeakReplacementsWithMoreThanOneLetter() + { + var sut = new SimpleCensor().WithCustomDictionary(["amogus", "sus"]).WithSanitizeLeetSpeak(); + var output = sut.Censor("am()gu5 hello 5u5"); + + Assert.That(output, Is.EqualTo("******* hello ***")); + } + + // Sanitizing special characters + + [Test] + public void DoesNotSanitizeOutUncensoredSpecialCharacters() + { + var sut = new SimpleCensor().WithCustomDictionary(["amogus", "sus"]).WithSanitizeSpecialCharacters(); + var output = sut.Censor("amogus!hello!sus"); + + Assert.That(output, Is.EqualTo("******!hello!***")); + } + + [Test] + public void DoesSanitizeOutCensoredSpecialCharacters() + { + var sut = new SimpleCensor().WithCustomDictionary(["amogus", "sus"]).WithSanitizeSpecialCharacters(); + var output = sut.Censor("amo!gus hello s?us"); + + Assert.That(output, Is.EqualTo("***!*** hello *?**")); + } + + // Unicode ranges + + [Test] + public void SanitizesOutNonLatinCharaters() + { + var sut = new SimpleCensor().WithRanges([UnicodeRanges.BasicLatin, UnicodeRanges.Latin1Supplement]); + var output = sut.Censor("amogus Україна sus 日本"); + + Assert.That(output, Is.EqualTo("amogus sus ")); + } + + [Test] + public void SanitizesOutNonLatinOrCyrillicCharaters() + { + var sut = new SimpleCensor().WithRanges([UnicodeRanges.BasicLatin, UnicodeRanges.Latin1Supplement, UnicodeRanges.Cyrillic]); + var output = sut.Censor("amogus Україна sus 日本"); + + Assert.That(output, Is.EqualTo("amogus Україна sus ")); + } + + // False positives + [Test] + public void CanHandleFalsePositives() + { + var sut = new SimpleCensor().WithCustomDictionary(["amogus", "sus"]).WithFalsePositives(["amogusus"]); + var output = sut.Censor("amogusus hello amogus hello sus"); + + Assert.That(output, Is.EqualTo("amogusus hello ****** hello ***")); + } + + // False negatives + [Test] + public void CanHandleFalseNegatives() + { + var sut = new SimpleCensor().WithCustomDictionary(["amogus", "sus"]).WithFalsePositives(["amogusus"]).WithFalseNegatives(["susamogusus"]); + var output = sut.Censor("susamogusus hello amogus hello sus amogusus"); + + Assert.That(output, Is.EqualTo("*********** hello ****** hello *** ********")); + } +} diff --git a/Content.YAMLLinter/Program.cs b/Content.YAMLLinter/Program.cs index b7b70bd1188..78867fcb8ab 100644 --- a/Content.YAMLLinter/Program.cs +++ b/Content.YAMLLinter/Program.cs @@ -97,7 +97,7 @@ await instance.WaitPost(() => yamlErrors[kind] = set; } - fieldErrors = protoMan.ValidateFields(prototypes); + fieldErrors = protoMan.ValidateStaticFields(prototypes); }); return (yamlErrors, fieldErrors); diff --git a/LEGAL.md b/LEGAL.md index 2df3c39add1..34cd4009d53 100644 --- a/LEGAL.md +++ b/LEGAL.md @@ -6,9 +6,9 @@ The Authors retain all copyright to their respective work submitted here. ## Code license -Content contributed to this repository after commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 is licensed under the GNU Affero General Public License version 3.0 unless otherwise stated. See [LICENSE-AGPLv3](https://github.com/Simple-Station/Einstein-Engines/blob/master/LICENSE-AGPLv3.txt). +Content contributed to this repository after commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 is licensed under the GNU Affero General Public License version 3.0 unless otherwise stated. See [LICENSE-AGPLv3](./LICENSE-AGPLv3.txt). -Content contributed to this repository before commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 is licensed under the MIT license unless otherwise stated. See [LICENSE-MIT](https://github.com/Simple-Station/Einstein-Engines/blob/master/LICENSE-MIT.txt). +Content contributed to this repository before commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 is licensed under the MIT license unless otherwise stated. See [LICENSE-MIT](./LICENSE-MIT.txt). [87c70a89a67d0521a56388e6b1c3f2cb947943e4](https://github.com/Simple-Station/Einstein-Engines/commit/87c70a89a67d0521a56388e6b1c3f2cb947943e4) was pushed on February 17th 2024 at 21:48 UTC diff --git a/README.md b/README.md index 3dbe1910e29..f102318611f 100644 --- a/README.md +++ b/README.md @@ -41,27 +41,24 @@ We provide some scripts shown below to make the job easier. ### Build dependencies > - Git -> - DOTNET SDK 7.0 or higher -> - python 3.7 or higher +> - .NET SDK 8.0.100 ### Windows > 1. Clone this repository -> 2. Run `RUN_THIS.py` to init submodules and download the engine, or run `git submodule update --init --recursive` in a terminal -> 3. Run the `Scripts/bat/run1buildDebug.bat` -> 4. Run the `Scripts/bat/run2configDev.bat` if you need other configurations run other config scripts -> 5. Run both the `Scripts/bat/run3server.bat` and `Scripts/bat/run4client.bat` -> 6. Connect to localhost and play +> 2. Run `git submodule update --init --recursive` in a terminal to download the engine +> 3. Run `Scripts/bat/buildAllDebug.bat` after making any changes to the source +> 4. Run `Scripts/bat/runQuickAll.bat` to launch the client and the server +> 5. Connect to localhost in the client and play ### Linux > 1. Clone this repository -> 2. Run `RUN_THIS.py` to init submodules and download the engine, or run `git submodule update --init --recursive` in a terminal -> 3. Run the `Scripts/sh/run1buildDebug.sh` -> 4. Run the `Scripts/sh/run2configDev.sh` if you need other configurations run other config scripts -> 5. Run both the `Scripts/sh/run3server.bat` and `scripts/sh/run4client.sh` -> 6. Connect to localhost and play +> 2. Run `git submodule update --init --recursive` in a terminal to download the engine +> 3. Run `Scripts/bat/buildAllDebug.sh` after making any changes to the source +> 4. Run `Scripts/bat/runQuickAll.sh` to launch the client and the server +> 5. Connect to localhost in the client and play ### MacOS @@ -70,12 +67,12 @@ We provide some scripts shown below to make the job easier. ## License Content contributed to this repository after commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 (`17 February 2024 23:00:00 UTC`) is licensed under the GNU Affero General Public License version 3.0 unless otherwise stated. -See [LICENSE-AGPLv3](https://github.com/Simple-Station/Einstein-Engines/blob/master/LICENSE-AGPLv3.txt). +See [LICENSE-AGPLv3](./LICENSE-AGPLv3.txt). Content contributed to this repository before commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 (`17 February 2024 23:00:00 UTC`) is licensed under the MIT license unless otherwise stated. -See [LICENSE-MIT](https://github.com/Simple-Station/Einstein-Engines/blob/master/LICENSE-MIT.txt). +See [LICENSE-MIT](./LICENSE-MIT.txt). Most assets are licensed under [CC-BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/) unless stated otherwise. Assets have their license and the copyright in the metadata file. -[Example](https://github.com/Simple-Station/Einstein-Engines/blob/master/Resources/Textures/Objects/Tools/crowbar.rsi/meta.json). +[Example](./Resources/Textures/Objects/Tools/crowbar.rsi/meta.json). Note that some assets are licensed under the non-commercial [CC-BY-NC-SA 3.0](https://creativecommons.org/licenses/by-nc-sa/3.0/) or similar non-commercial licenses and will need to be removed if you wish to use this project commercially. diff --git a/RUN_THIS.py b/RUN_THIS.py deleted file mode 100755 index 6ea9f8e707d..00000000000 --- a/RUN_THIS.py +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env python3 - -# Import future so people on py2 still get the clear error that they need to upgrade. -from __future__ import print_function -import sys -import subprocess - -version = sys.version_info -if version.major < 3 or (version.major == 3 and version.minor < 5): - print("ERROR: You need at least Python 3.5 to build SS14.") - sys.exit(1) - -subprocess.run([sys.executable, "git_helper.py"], cwd="BuildChecker") diff --git a/Resources/Audio/Admin/Smites/bookify.ogg b/Resources/Audio/Admin/Smites/bookify.ogg new file mode 100644 index 00000000000..522225e3ac4 Binary files /dev/null and b/Resources/Audio/Admin/Smites/bookify.ogg differ diff --git a/Resources/Audio/Admin/Smites/manup.ogg b/Resources/Audio/Admin/Smites/manup.ogg new file mode 100644 index 00000000000..cdfa76fbf7e Binary files /dev/null and b/Resources/Audio/Admin/Smites/manup.ogg differ diff --git a/Resources/Audio/Admin/Smites/pleaseroleplay.ogg b/Resources/Audio/Admin/Smites/pleaseroleplay.ogg new file mode 100644 index 00000000000..3d2c301229e Binary files /dev/null and b/Resources/Audio/Admin/Smites/pleaseroleplay.ogg differ diff --git a/Resources/Audio/Admin/Smites/smite.ogg b/Resources/Audio/Admin/Smites/smite.ogg new file mode 100644 index 00000000000..2f62cfb3691 Binary files /dev/null and b/Resources/Audio/Admin/Smites/smite.ogg differ diff --git a/Resources/Audio/Announcements/Intern/aliens.ogg b/Resources/Audio/Announcements/Intern/aliens.ogg new file mode 100644 index 00000000000..9dd3c076978 Binary files /dev/null and b/Resources/Audio/Announcements/Intern/aliens.ogg differ diff --git a/Resources/Audio/Announcements/Intern/animes.ogg b/Resources/Audio/Announcements/Intern/animes.ogg new file mode 100644 index 00000000000..36102c3e60e Binary files /dev/null and b/Resources/Audio/Announcements/Intern/animes.ogg differ diff --git a/Resources/Audio/Announcements/Intern/announce.ogg b/Resources/Audio/Announcements/Intern/announce.ogg new file mode 100644 index 00000000000..0ee0f36d56f Binary files /dev/null and b/Resources/Audio/Announcements/Intern/announce.ogg differ diff --git a/Resources/Audio/Announcements/Intern/announce/1.ogg b/Resources/Audio/Announcements/Intern/announce/1.ogg new file mode 100644 index 00000000000..c4d182bc8c9 Binary files /dev/null and b/Resources/Audio/Announcements/Intern/announce/1.ogg differ diff --git a/Resources/Audio/Announcements/Intern/announce/10.ogg b/Resources/Audio/Announcements/Intern/announce/10.ogg new file mode 100644 index 00000000000..7380ccdeefd Binary files /dev/null and b/Resources/Audio/Announcements/Intern/announce/10.ogg differ diff --git a/Resources/Audio/Announcements/Intern/announce/11.ogg b/Resources/Audio/Announcements/Intern/announce/11.ogg new file mode 100644 index 00000000000..ca548dcc20a Binary files /dev/null and b/Resources/Audio/Announcements/Intern/announce/11.ogg differ diff --git a/Resources/Audio/Announcements/Intern/announce/12.ogg b/Resources/Audio/Announcements/Intern/announce/12.ogg new file mode 100644 index 00000000000..8d71419798f Binary files /dev/null and b/Resources/Audio/Announcements/Intern/announce/12.ogg differ diff --git a/Resources/Audio/Announcements/Intern/announce/13.ogg b/Resources/Audio/Announcements/Intern/announce/13.ogg new file mode 100644 index 00000000000..128c7aa424d Binary files /dev/null and b/Resources/Audio/Announcements/Intern/announce/13.ogg differ diff --git a/Resources/Audio/Announcements/Intern/announce/14.ogg b/Resources/Audio/Announcements/Intern/announce/14.ogg new file mode 100644 index 00000000000..81d54101be5 Binary files /dev/null and b/Resources/Audio/Announcements/Intern/announce/14.ogg differ diff --git a/Resources/Audio/Announcements/Intern/announce/2.ogg b/Resources/Audio/Announcements/Intern/announce/2.ogg new file mode 100644 index 00000000000..a2ef615d56c Binary files /dev/null and b/Resources/Audio/Announcements/Intern/announce/2.ogg differ diff --git a/Resources/Audio/Announcements/Intern/announce/3.ogg b/Resources/Audio/Announcements/Intern/announce/3.ogg new file mode 100644 index 00000000000..51613ff0367 Binary files /dev/null and b/Resources/Audio/Announcements/Intern/announce/3.ogg differ diff --git a/Resources/Audio/Announcements/Intern/announce/4.ogg b/Resources/Audio/Announcements/Intern/announce/4.ogg new file mode 100644 index 00000000000..874536ca72f Binary files /dev/null and b/Resources/Audio/Announcements/Intern/announce/4.ogg differ diff --git a/Resources/Audio/Announcements/Intern/announce/5.ogg b/Resources/Audio/Announcements/Intern/announce/5.ogg new file mode 100644 index 00000000000..0af0d28ce18 Binary files /dev/null and b/Resources/Audio/Announcements/Intern/announce/5.ogg differ diff --git a/Resources/Audio/Announcements/Intern/announce/6.ogg b/Resources/Audio/Announcements/Intern/announce/6.ogg new file mode 100644 index 00000000000..a65006a8c01 Binary files /dev/null and b/Resources/Audio/Announcements/Intern/announce/6.ogg differ diff --git a/Resources/Audio/Announcements/Intern/announce/7.ogg b/Resources/Audio/Announcements/Intern/announce/7.ogg new file mode 100644 index 00000000000..4a1d3f013ae Binary files /dev/null and b/Resources/Audio/Announcements/Intern/announce/7.ogg differ diff --git a/Resources/Audio/Announcements/Intern/announce/8.ogg b/Resources/Audio/Announcements/Intern/announce/8.ogg new file mode 100644 index 00000000000..83ca80f4939 Binary files /dev/null and b/Resources/Audio/Announcements/Intern/announce/8.ogg differ diff --git a/Resources/Audio/Announcements/Intern/announce/9.ogg b/Resources/Audio/Announcements/Intern/announce/9.ogg new file mode 100644 index 00000000000..3c0c45b25d0 Binary files /dev/null and b/Resources/Audio/Announcements/Intern/announce/9.ogg differ diff --git a/Resources/Audio/Announcements/Intern/anomaly.ogg b/Resources/Audio/Announcements/Intern/anomaly.ogg new file mode 100644 index 00000000000..9bed8eae3aa Binary files /dev/null and b/Resources/Audio/Announcements/Intern/anomaly.ogg differ diff --git a/Resources/Audio/Announcements/Intern/commandreport/1.ogg b/Resources/Audio/Announcements/Intern/commandreport/1.ogg new file mode 100644 index 00000000000..e3108b13d17 Binary files /dev/null and b/Resources/Audio/Announcements/Intern/commandreport/1.ogg differ diff --git a/Resources/Audio/Announcements/Intern/commandreport/2.ogg b/Resources/Audio/Announcements/Intern/commandreport/2.ogg new file mode 100644 index 00000000000..cd67500426c Binary files /dev/null and b/Resources/Audio/Announcements/Intern/commandreport/2.ogg differ diff --git a/Resources/Audio/Announcements/Intern/commandreport/3.ogg b/Resources/Audio/Announcements/Intern/commandreport/3.ogg new file mode 100644 index 00000000000..94241c5ba52 Binary files /dev/null and b/Resources/Audio/Announcements/Intern/commandreport/3.ogg differ diff --git a/Resources/Audio/Announcements/Intern/intercept.ogg b/Resources/Audio/Announcements/Intern/intercept.ogg new file mode 100644 index 00000000000..a87274abd97 Binary files /dev/null and b/Resources/Audio/Announcements/Intern/intercept.ogg differ diff --git a/Resources/Audio/Announcements/Intern/ionstorm.ogg b/Resources/Audio/Announcements/Intern/ionstorm.ogg new file mode 100644 index 00000000000..9e7b5c6b23e Binary files /dev/null and b/Resources/Audio/Announcements/Intern/ionstorm.ogg differ diff --git a/Resources/Audio/Announcements/Intern/meteors.ogg b/Resources/Audio/Announcements/Intern/meteors.ogg new file mode 100644 index 00000000000..c68c4bd8cc4 Binary files /dev/null and b/Resources/Audio/Announcements/Intern/meteors.ogg differ diff --git a/Resources/Audio/Announcements/Intern/newai.ogg b/Resources/Audio/Announcements/Intern/newai.ogg new file mode 100644 index 00000000000..c40b0990206 Binary files /dev/null and b/Resources/Audio/Announcements/Intern/newai.ogg differ diff --git a/Resources/Audio/Announcements/Intern/outbreak7.ogg b/Resources/Audio/Announcements/Intern/outbreak7.ogg new file mode 100644 index 00000000000..297a1bbe8db Binary files /dev/null and b/Resources/Audio/Announcements/Intern/outbreak7.ogg differ diff --git a/Resources/Audio/Announcements/Intern/poweroff.ogg b/Resources/Audio/Announcements/Intern/poweroff.ogg new file mode 100644 index 00000000000..4b71053653f Binary files /dev/null and b/Resources/Audio/Announcements/Intern/poweroff.ogg differ diff --git a/Resources/Audio/Announcements/Intern/poweron.ogg b/Resources/Audio/Announcements/Intern/poweron.ogg new file mode 100644 index 00000000000..509cd398e6e Binary files /dev/null and b/Resources/Audio/Announcements/Intern/poweron.ogg differ diff --git a/Resources/Audio/Announcements/Intern/radiation.ogg b/Resources/Audio/Announcements/Intern/radiation.ogg new file mode 100644 index 00000000000..08db53ebfd2 Binary files /dev/null and b/Resources/Audio/Announcements/Intern/radiation.ogg differ diff --git a/Resources/Audio/Announcements/Intern/shuttlecalled.ogg b/Resources/Audio/Announcements/Intern/shuttlecalled.ogg new file mode 100644 index 00000000000..c903367cdff Binary files /dev/null and b/Resources/Audio/Announcements/Intern/shuttlecalled.ogg differ diff --git a/Resources/Audio/Announcements/Intern/shuttledock.ogg b/Resources/Audio/Announcements/Intern/shuttledock.ogg new file mode 100644 index 00000000000..9f6ccd1a937 Binary files /dev/null and b/Resources/Audio/Announcements/Intern/shuttledock.ogg differ diff --git a/Resources/Audio/Announcements/Intern/shuttlerecalled.ogg b/Resources/Audio/Announcements/Intern/shuttlerecalled.ogg new file mode 100644 index 00000000000..e259a79f35e Binary files /dev/null and b/Resources/Audio/Announcements/Intern/shuttlerecalled.ogg differ diff --git a/Resources/Audio/Announcements/Intern/welcome/1.ogg b/Resources/Audio/Announcements/Intern/welcome/1.ogg new file mode 100644 index 00000000000..758f1967e09 Binary files /dev/null and b/Resources/Audio/Announcements/Intern/welcome/1.ogg differ diff --git a/Resources/Audio/Announcements/Intern/welcome/2.ogg b/Resources/Audio/Announcements/Intern/welcome/2.ogg new file mode 100644 index 00000000000..c2e72be510e Binary files /dev/null and b/Resources/Audio/Announcements/Intern/welcome/2.ogg differ diff --git a/Resources/Audio/Announcements/Intern/welcome/3.ogg b/Resources/Audio/Announcements/Intern/welcome/3.ogg new file mode 100644 index 00000000000..004f57371de Binary files /dev/null and b/Resources/Audio/Announcements/Intern/welcome/3.ogg differ diff --git a/Resources/Audio/Announcements/Intern/welcome/4.ogg b/Resources/Audio/Announcements/Intern/welcome/4.ogg new file mode 100644 index 00000000000..c4e1f7667cd Binary files /dev/null and b/Resources/Audio/Announcements/Intern/welcome/4.ogg differ diff --git a/Resources/Audio/Announcements/Intern/welcome/5.ogg b/Resources/Audio/Announcements/Intern/welcome/5.ogg new file mode 100644 index 00000000000..641b8208a4e Binary files /dev/null and b/Resources/Audio/Announcements/Intern/welcome/5.ogg differ diff --git a/Resources/Audio/Announcements/Intern/welcome/6.ogg b/Resources/Audio/Announcements/Intern/welcome/6.ogg new file mode 100644 index 00000000000..b0fc38237f8 Binary files /dev/null and b/Resources/Audio/Announcements/Intern/welcome/6.ogg differ diff --git a/Resources/Audio/Announcements/MedBot/aliens.ogg b/Resources/Audio/Announcements/MedBot/aliens.ogg new file mode 100644 index 00000000000..57fa70c3cae Binary files /dev/null and b/Resources/Audio/Announcements/MedBot/aliens.ogg differ diff --git a/Resources/Audio/Announcements/MedBot/animes.ogg b/Resources/Audio/Announcements/MedBot/animes.ogg new file mode 100644 index 00000000000..7615a744a66 Binary files /dev/null and b/Resources/Audio/Announcements/MedBot/animes.ogg differ diff --git a/Resources/Audio/Announcements/MedBot/announce.ogg b/Resources/Audio/Announcements/MedBot/announce.ogg new file mode 100644 index 00000000000..0ee0f36d56f Binary files /dev/null and b/Resources/Audio/Announcements/MedBot/announce.ogg differ diff --git a/Resources/Audio/Announcements/MedBot/anomaly.ogg b/Resources/Audio/Announcements/MedBot/anomaly.ogg new file mode 100644 index 00000000000..d710999e1e1 Binary files /dev/null and b/Resources/Audio/Announcements/MedBot/anomaly.ogg differ diff --git a/Resources/Audio/Announcements/MedBot/attention.ogg b/Resources/Audio/Announcements/MedBot/attention.ogg new file mode 100644 index 00000000000..d4d5a270852 Binary files /dev/null and b/Resources/Audio/Announcements/MedBot/attention.ogg differ diff --git a/Resources/Audio/Announcements/MedBot/commandreport.ogg b/Resources/Audio/Announcements/MedBot/commandreport.ogg new file mode 100644 index 00000000000..4e5c2e1d1ff Binary files /dev/null and b/Resources/Audio/Announcements/MedBot/commandreport.ogg differ diff --git a/Resources/Audio/Announcements/MedBot/fallback.ogg b/Resources/Audio/Announcements/MedBot/fallback.ogg new file mode 100644 index 00000000000..d4d5a270852 Binary files /dev/null and b/Resources/Audio/Announcements/MedBot/fallback.ogg differ diff --git a/Resources/Audio/Announcements/MedBot/intercept.ogg b/Resources/Audio/Announcements/MedBot/intercept.ogg new file mode 100644 index 00000000000..c59d0455c1c Binary files /dev/null and b/Resources/Audio/Announcements/MedBot/intercept.ogg differ diff --git a/Resources/Audio/Announcements/MedBot/ionstorm.ogg b/Resources/Audio/Announcements/MedBot/ionstorm.ogg new file mode 100644 index 00000000000..15aeac9f7ff Binary files /dev/null and b/Resources/Audio/Announcements/MedBot/ionstorm.ogg differ diff --git a/Resources/Audio/Announcements/MedBot/meteors.ogg b/Resources/Audio/Announcements/MedBot/meteors.ogg new file mode 100644 index 00000000000..91208cae122 Binary files /dev/null and b/Resources/Audio/Announcements/MedBot/meteors.ogg differ diff --git a/Resources/Audio/Announcements/MedBot/newai.ogg b/Resources/Audio/Announcements/MedBot/newai.ogg new file mode 100644 index 00000000000..c40b0990206 Binary files /dev/null and b/Resources/Audio/Announcements/MedBot/newai.ogg differ diff --git a/Resources/Audio/Announcements/MedBot/outbreak7.ogg b/Resources/Audio/Announcements/MedBot/outbreak7.ogg new file mode 100644 index 00000000000..1fc542534db Binary files /dev/null and b/Resources/Audio/Announcements/MedBot/outbreak7.ogg differ diff --git a/Resources/Audio/Announcements/MedBot/poweroff.ogg b/Resources/Audio/Announcements/MedBot/poweroff.ogg new file mode 100644 index 00000000000..875df350025 Binary files /dev/null and b/Resources/Audio/Announcements/MedBot/poweroff.ogg differ diff --git a/Resources/Audio/Announcements/MedBot/poweron.ogg b/Resources/Audio/Announcements/MedBot/poweron.ogg new file mode 100644 index 00000000000..4b1605b1c74 Binary files /dev/null and b/Resources/Audio/Announcements/MedBot/poweron.ogg differ diff --git a/Resources/Audio/Announcements/MedBot/radiation.ogg b/Resources/Audio/Announcements/MedBot/radiation.ogg new file mode 100644 index 00000000000..5c48830b5f2 Binary files /dev/null and b/Resources/Audio/Announcements/MedBot/radiation.ogg differ diff --git a/Resources/Audio/Announcements/MedBot/shuttlecalled.ogg b/Resources/Audio/Announcements/MedBot/shuttlecalled.ogg new file mode 100644 index 00000000000..a775567abed Binary files /dev/null and b/Resources/Audio/Announcements/MedBot/shuttlecalled.ogg differ diff --git a/Resources/Audio/Announcements/MedBot/shuttledock.ogg b/Resources/Audio/Announcements/MedBot/shuttledock.ogg new file mode 100644 index 00000000000..933928db067 Binary files /dev/null and b/Resources/Audio/Announcements/MedBot/shuttledock.ogg differ diff --git a/Resources/Audio/Announcements/MedBot/shuttlerecalled.ogg b/Resources/Audio/Announcements/MedBot/shuttlerecalled.ogg new file mode 100644 index 00000000000..53b622576d4 Binary files /dev/null and b/Resources/Audio/Announcements/MedBot/shuttlerecalled.ogg differ diff --git a/Resources/Audio/Announcements/MedBot/welcome.ogg b/Resources/Audio/Announcements/MedBot/welcome.ogg new file mode 100644 index 00000000000..f9a698fd080 Binary files /dev/null and b/Resources/Audio/Announcements/MedBot/welcome.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/announce.ogg b/Resources/Audio/Announcements/NEIL/announce.ogg new file mode 100644 index 00000000000..0ee0f36d56f Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/announce.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/attention.ogg b/Resources/Audio/Announcements/NEIL/attention.ogg new file mode 100644 index 00000000000..310fad3ef63 Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/attention.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/bureaucraticerror.ogg b/Resources/Audio/Announcements/NEIL/bureaucraticerror.ogg new file mode 100644 index 00000000000..0cbafcf6276 Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/bureaucraticerror.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/code_blue.ogg b/Resources/Audio/Announcements/NEIL/code_blue.ogg new file mode 100644 index 00000000000..48d9c6548b6 Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/code_blue.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/code_delta.ogg b/Resources/Audio/Announcements/NEIL/code_delta.ogg new file mode 100644 index 00000000000..70826719156 Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/code_delta.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/code_epsilon.ogg b/Resources/Audio/Announcements/NEIL/code_epsilon.ogg new file mode 100644 index 00000000000..a8db858b1af Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/code_epsilon.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/code_gamma.ogg b/Resources/Audio/Announcements/NEIL/code_gamma.ogg new file mode 100644 index 00000000000..3351acc2e0d Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/code_gamma.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/code_green.ogg b/Resources/Audio/Announcements/NEIL/code_green.ogg new file mode 100644 index 00000000000..3c0031833be Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/code_green.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/code_red.ogg b/Resources/Audio/Announcements/NEIL/code_red.ogg new file mode 100644 index 00000000000..209eb36ba11 Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/code_red.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/code_violet.ogg b/Resources/Audio/Announcements/NEIL/code_violet.ogg new file mode 100644 index 00000000000..c1681c1edb8 Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/code_violet.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/code_white.ogg b/Resources/Audio/Announcements/NEIL/code_white.ogg new file mode 100644 index 00000000000..24c942dfcb2 Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/code_white.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/code_yellow.ogg b/Resources/Audio/Announcements/NEIL/code_yellow.ogg new file mode 100644 index 00000000000..9139446d2b6 Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/code_yellow.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/fallback.ogg b/Resources/Audio/Announcements/NEIL/fallback.ogg new file mode 100644 index 00000000000..310fad3ef63 Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/fallback.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/gasleak.ogg b/Resources/Audio/Announcements/NEIL/gasleak.ogg new file mode 100644 index 00000000000..8efffd02c45 Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/gasleak.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/kudzu.ogg b/Resources/Audio/Announcements/NEIL/kudzu.ogg new file mode 100644 index 00000000000..4ddd2f636bc Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/kudzu.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/meteors.ogg b/Resources/Audio/Announcements/NEIL/meteors.ogg new file mode 100644 index 00000000000..cf525441745 Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/meteors.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/newai.ogg b/Resources/Audio/Announcements/NEIL/newai.ogg new file mode 100644 index 00000000000..35aba34564f Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/newai.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/noosphericstorm.ogg b/Resources/Audio/Announcements/NEIL/noosphericstorm.ogg new file mode 100644 index 00000000000..47b52f7cb47 Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/noosphericstorm.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/outbreak7.ogg b/Resources/Audio/Announcements/NEIL/outbreak7.ogg new file mode 100644 index 00000000000..91067960125 Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/outbreak7.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/poweroff.ogg b/Resources/Audio/Announcements/NEIL/poweroff.ogg new file mode 100644 index 00000000000..7d7a43825fe Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/poweroff.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/poweron.ogg b/Resources/Audio/Announcements/NEIL/poweron.ogg new file mode 100644 index 00000000000..961b50a5031 Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/poweron.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/radiation.ogg b/Resources/Audio/Announcements/NEIL/radiation.ogg new file mode 100644 index 00000000000..3ea2928c1d9 Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/radiation.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/shuttlecalled.ogg b/Resources/Audio/Announcements/NEIL/shuttlecalled.ogg new file mode 100644 index 00000000000..482bf133193 Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/shuttlecalled.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/shuttledock.ogg b/Resources/Audio/Announcements/NEIL/shuttledock.ogg new file mode 100644 index 00000000000..0615536555b Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/shuttledock.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/shuttlerecalled.ogg b/Resources/Audio/Announcements/NEIL/shuttlerecalled.ogg new file mode 100644 index 00000000000..5a198ca5fe4 Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/shuttlerecalled.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/ventclog.ogg b/Resources/Audio/Announcements/NEIL/ventclog.ogg new file mode 100644 index 00000000000..90350f0e359 Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/ventclog.ogg differ diff --git a/Resources/Audio/Announcements/NEIL/welcome.ogg b/Resources/Audio/Announcements/NEIL/welcome.ogg new file mode 100644 index 00000000000..00c8991276c Binary files /dev/null and b/Resources/Audio/Announcements/NEIL/welcome.ogg differ diff --git a/Resources/Audio/Announcements/VoxFem/aliens.ogg b/Resources/Audio/Announcements/VoxFem/aliens.ogg new file mode 100644 index 00000000000..f7d1746247f Binary files /dev/null and b/Resources/Audio/Announcements/VoxFem/aliens.ogg differ diff --git a/Resources/Audio/Announcements/VoxFem/announce.ogg b/Resources/Audio/Announcements/VoxFem/announce.ogg new file mode 100644 index 00000000000..0ee0f36d56f Binary files /dev/null and b/Resources/Audio/Announcements/VoxFem/announce.ogg differ diff --git a/Resources/Audio/Announcements/VoxFem/anomaly.ogg b/Resources/Audio/Announcements/VoxFem/anomaly.ogg new file mode 100644 index 00000000000..7680726f153 Binary files /dev/null and b/Resources/Audio/Announcements/VoxFem/anomaly.ogg differ diff --git a/Resources/Audio/Announcements/VoxFem/attention.ogg b/Resources/Audio/Announcements/VoxFem/attention.ogg new file mode 100644 index 00000000000..912be4425eb Binary files /dev/null and b/Resources/Audio/Announcements/VoxFem/attention.ogg differ diff --git a/Resources/Audio/Announcements/VoxFem/commandreport.ogg b/Resources/Audio/Announcements/VoxFem/commandreport.ogg new file mode 100644 index 00000000000..82e4ca425de Binary files /dev/null and b/Resources/Audio/Announcements/VoxFem/commandreport.ogg differ diff --git a/Resources/Audio/Announcements/VoxFem/fallback.ogg b/Resources/Audio/Announcements/VoxFem/fallback.ogg new file mode 100644 index 00000000000..912be4425eb Binary files /dev/null and b/Resources/Audio/Announcements/VoxFem/fallback.ogg differ diff --git a/Resources/Audio/Announcements/VoxFem/ionstorm.ogg b/Resources/Audio/Announcements/VoxFem/ionstorm.ogg new file mode 100644 index 00000000000..9f39713de6e Binary files /dev/null and b/Resources/Audio/Announcements/VoxFem/ionstorm.ogg differ diff --git a/Resources/Audio/Announcements/VoxFem/meteors.ogg b/Resources/Audio/Announcements/VoxFem/meteors.ogg new file mode 100644 index 00000000000..8f1c3aeacbb Binary files /dev/null and b/Resources/Audio/Announcements/VoxFem/meteors.ogg differ diff --git a/Resources/Audio/Announcements/VoxFem/newai.ogg b/Resources/Audio/Announcements/VoxFem/newai.ogg new file mode 100644 index 00000000000..35aba34564f Binary files /dev/null and b/Resources/Audio/Announcements/VoxFem/newai.ogg differ diff --git a/Resources/Audio/Announcements/VoxFem/outbreak7.ogg b/Resources/Audio/Announcements/VoxFem/outbreak7.ogg new file mode 100644 index 00000000000..f21d4fca443 Binary files /dev/null and b/Resources/Audio/Announcements/VoxFem/outbreak7.ogg differ diff --git a/Resources/Audio/Announcements/VoxFem/poweroff.ogg b/Resources/Audio/Announcements/VoxFem/poweroff.ogg new file mode 100644 index 00000000000..1c6377c9d8d Binary files /dev/null and b/Resources/Audio/Announcements/VoxFem/poweroff.ogg differ diff --git a/Resources/Audio/Announcements/VoxFem/poweron.ogg b/Resources/Audio/Announcements/VoxFem/poweron.ogg new file mode 100644 index 00000000000..9d18797d6ea Binary files /dev/null and b/Resources/Audio/Announcements/VoxFem/poweron.ogg differ diff --git a/Resources/Audio/Announcements/VoxFem/radiation.ogg b/Resources/Audio/Announcements/VoxFem/radiation.ogg new file mode 100644 index 00000000000..ef395af3101 Binary files /dev/null and b/Resources/Audio/Announcements/VoxFem/radiation.ogg differ diff --git a/Resources/Audio/Announcements/VoxFem/shuttlecalled.ogg b/Resources/Audio/Announcements/VoxFem/shuttlecalled.ogg new file mode 100644 index 00000000000..716bf824654 Binary files /dev/null and b/Resources/Audio/Announcements/VoxFem/shuttlecalled.ogg differ diff --git a/Resources/Audio/Announcements/VoxFem/shuttledock.ogg b/Resources/Audio/Announcements/VoxFem/shuttledock.ogg new file mode 100644 index 00000000000..0f70bebc751 Binary files /dev/null and b/Resources/Audio/Announcements/VoxFem/shuttledock.ogg differ diff --git a/Resources/Audio/Announcements/VoxFem/shuttlerecalled.ogg b/Resources/Audio/Announcements/VoxFem/shuttlerecalled.ogg new file mode 100644 index 00000000000..5f6db404b87 Binary files /dev/null and b/Resources/Audio/Announcements/VoxFem/shuttlerecalled.ogg differ diff --git a/Resources/Audio/Announcements/VoxFem/welcome.ogg b/Resources/Audio/Announcements/VoxFem/welcome.ogg new file mode 100644 index 00000000000..c7013dcbd5f Binary files /dev/null and b/Resources/Audio/Announcements/VoxFem/welcome.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/announce.ogg b/Resources/Audio/Announcers/Intern/comms/announce.ogg new file mode 100644 index 00000000000..0ee0f36d56f Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/announce.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/announce/1.ogg b/Resources/Audio/Announcers/Intern/comms/announce/1.ogg new file mode 100644 index 00000000000..c4d182bc8c9 Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/announce/1.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/announce/10.ogg b/Resources/Audio/Announcers/Intern/comms/announce/10.ogg new file mode 100644 index 00000000000..7380ccdeefd Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/announce/10.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/announce/11.ogg b/Resources/Audio/Announcers/Intern/comms/announce/11.ogg new file mode 100644 index 00000000000..ca548dcc20a Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/announce/11.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/announce/12.ogg b/Resources/Audio/Announcers/Intern/comms/announce/12.ogg new file mode 100644 index 00000000000..8d71419798f Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/announce/12.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/announce/13.ogg b/Resources/Audio/Announcers/Intern/comms/announce/13.ogg new file mode 100644 index 00000000000..128c7aa424d Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/announce/13.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/announce/14.ogg b/Resources/Audio/Announcers/Intern/comms/announce/14.ogg new file mode 100644 index 00000000000..81d54101be5 Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/announce/14.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/announce/2.ogg b/Resources/Audio/Announcers/Intern/comms/announce/2.ogg new file mode 100644 index 00000000000..a2ef615d56c Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/announce/2.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/announce/3.ogg b/Resources/Audio/Announcers/Intern/comms/announce/3.ogg new file mode 100644 index 00000000000..51613ff0367 Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/announce/3.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/announce/4.ogg b/Resources/Audio/Announcers/Intern/comms/announce/4.ogg new file mode 100644 index 00000000000..874536ca72f Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/announce/4.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/announce/5.ogg b/Resources/Audio/Announcers/Intern/comms/announce/5.ogg new file mode 100644 index 00000000000..0af0d28ce18 Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/announce/5.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/announce/6.ogg b/Resources/Audio/Announcers/Intern/comms/announce/6.ogg new file mode 100644 index 00000000000..a65006a8c01 Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/announce/6.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/announce/7.ogg b/Resources/Audio/Announcers/Intern/comms/announce/7.ogg new file mode 100644 index 00000000000..4a1d3f013ae Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/announce/7.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/announce/8.ogg b/Resources/Audio/Announcers/Intern/comms/announce/8.ogg new file mode 100644 index 00000000000..83ca80f4939 Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/announce/8.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/announce/9.ogg b/Resources/Audio/Announcers/Intern/comms/announce/9.ogg new file mode 100644 index 00000000000..3c0c45b25d0 Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/announce/9.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/commandReport/1.ogg b/Resources/Audio/Announcers/Intern/comms/commandReport/1.ogg new file mode 100644 index 00000000000..e3108b13d17 Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/commandReport/1.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/commandReport/2.ogg b/Resources/Audio/Announcers/Intern/comms/commandReport/2.ogg new file mode 100644 index 00000000000..cd67500426c Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/commandReport/2.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/commandReport/3.ogg b/Resources/Audio/Announcers/Intern/comms/commandReport/3.ogg new file mode 100644 index 00000000000..94241c5ba52 Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/commandReport/3.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/welcome/1.ogg b/Resources/Audio/Announcers/Intern/comms/welcome/1.ogg new file mode 100644 index 00000000000..758f1967e09 Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/welcome/1.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/welcome/2.ogg b/Resources/Audio/Announcers/Intern/comms/welcome/2.ogg new file mode 100644 index 00000000000..c2e72be510e Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/welcome/2.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/welcome/3.ogg b/Resources/Audio/Announcers/Intern/comms/welcome/3.ogg new file mode 100644 index 00000000000..004f57371de Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/welcome/3.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/welcome/4.ogg b/Resources/Audio/Announcers/Intern/comms/welcome/4.ogg new file mode 100644 index 00000000000..c4e1f7667cd Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/welcome/4.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/welcome/5.ogg b/Resources/Audio/Announcers/Intern/comms/welcome/5.ogg new file mode 100644 index 00000000000..641b8208a4e Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/welcome/5.ogg differ diff --git a/Resources/Audio/Announcers/Intern/comms/welcome/6.ogg b/Resources/Audio/Announcers/Intern/comms/welcome/6.ogg new file mode 100644 index 00000000000..b0fc38237f8 Binary files /dev/null and b/Resources/Audio/Announcers/Intern/comms/welcome/6.ogg differ diff --git a/Resources/Audio/Announcers/Intern/events/aliens.ogg b/Resources/Audio/Announcers/Intern/events/aliens.ogg new file mode 100644 index 00000000000..9dd3c076978 Binary files /dev/null and b/Resources/Audio/Announcers/Intern/events/aliens.ogg differ diff --git a/Resources/Audio/Announcers/Intern/events/anomaly.ogg b/Resources/Audio/Announcers/Intern/events/anomaly.ogg new file mode 100644 index 00000000000..9bed8eae3aa Binary files /dev/null and b/Resources/Audio/Announcers/Intern/events/anomaly.ogg differ diff --git a/Resources/Audio/Announcers/Intern/events/ion_storm.ogg b/Resources/Audio/Announcers/Intern/events/ion_storm.ogg new file mode 100644 index 00000000000..9e7b5c6b23e Binary files /dev/null and b/Resources/Audio/Announcers/Intern/events/ion_storm.ogg differ diff --git a/Resources/Audio/Announcers/Intern/events/meteors.ogg b/Resources/Audio/Announcers/Intern/events/meteors.ogg new file mode 100644 index 00000000000..c68c4bd8cc4 Binary files /dev/null and b/Resources/Audio/Announcers/Intern/events/meteors.ogg differ diff --git a/Resources/Audio/Announcers/Intern/events/power_grid_check-complete.ogg b/Resources/Audio/Announcers/Intern/events/power_grid_check-complete.ogg new file mode 100644 index 00000000000..509cd398e6e Binary files /dev/null and b/Resources/Audio/Announcers/Intern/events/power_grid_check-complete.ogg differ diff --git a/Resources/Audio/Announcers/Intern/events/power_grid_check.ogg b/Resources/Audio/Announcers/Intern/events/power_grid_check.ogg new file mode 100644 index 00000000000..4b71053653f Binary files /dev/null and b/Resources/Audio/Announcers/Intern/events/power_grid_check.ogg differ diff --git a/Resources/Audio/Announcers/Intern/shuttle/shuttlecalled.ogg b/Resources/Audio/Announcers/Intern/shuttle/shuttlecalled.ogg new file mode 100644 index 00000000000..c903367cdff Binary files /dev/null and b/Resources/Audio/Announcers/Intern/shuttle/shuttlecalled.ogg differ diff --git a/Resources/Audio/Announcers/Intern/shuttle/shuttledock.ogg b/Resources/Audio/Announcers/Intern/shuttle/shuttledock.ogg new file mode 100644 index 00000000000..9f6ccd1a937 Binary files /dev/null and b/Resources/Audio/Announcers/Intern/shuttle/shuttledock.ogg differ diff --git a/Resources/Audio/Announcers/Intern/shuttle/shuttlerecalled.ogg b/Resources/Audio/Announcers/Intern/shuttle/shuttlerecalled.ogg new file mode 100644 index 00000000000..e259a79f35e Binary files /dev/null and b/Resources/Audio/Announcers/Intern/shuttle/shuttlerecalled.ogg differ diff --git a/Resources/Audio/Announcers/Intern/unused/animes.ogg b/Resources/Audio/Announcers/Intern/unused/animes.ogg new file mode 100644 index 00000000000..36102c3e60e Binary files /dev/null and b/Resources/Audio/Announcers/Intern/unused/animes.ogg differ diff --git a/Resources/Audio/Announcers/Intern/unused/intercept.ogg b/Resources/Audio/Announcers/Intern/unused/intercept.ogg new file mode 100644 index 00000000000..a87274abd97 Binary files /dev/null and b/Resources/Audio/Announcers/Intern/unused/intercept.ogg differ diff --git a/Resources/Audio/Announcers/Intern/unused/newai.ogg b/Resources/Audio/Announcers/Intern/unused/newai.ogg new file mode 100644 index 00000000000..c40b0990206 Binary files /dev/null and b/Resources/Audio/Announcers/Intern/unused/newai.ogg differ diff --git a/Resources/Audio/Announcers/Intern/unused/outbreak7.ogg b/Resources/Audio/Announcers/Intern/unused/outbreak7.ogg new file mode 100644 index 00000000000..297a1bbe8db Binary files /dev/null and b/Resources/Audio/Announcers/Intern/unused/outbreak7.ogg differ diff --git a/Resources/Audio/Announcers/Intern/unused/radiation.ogg b/Resources/Audio/Announcers/Intern/unused/radiation.ogg new file mode 100644 index 00000000000..08db53ebfd2 Binary files /dev/null and b/Resources/Audio/Announcers/Intern/unused/radiation.ogg differ diff --git a/Resources/Audio/Announcers/MedBot/comms/announce.ogg b/Resources/Audio/Announcers/MedBot/comms/announce.ogg new file mode 100644 index 00000000000..0ee0f36d56f Binary files /dev/null and b/Resources/Audio/Announcers/MedBot/comms/announce.ogg differ diff --git a/Resources/Audio/Announcers/MedBot/comms/attention.ogg b/Resources/Audio/Announcers/MedBot/comms/attention.ogg new file mode 100644 index 00000000000..d4d5a270852 Binary files /dev/null and b/Resources/Audio/Announcers/MedBot/comms/attention.ogg differ diff --git a/Resources/Audio/Announcers/MedBot/comms/command_report.ogg b/Resources/Audio/Announcers/MedBot/comms/command_report.ogg new file mode 100644 index 00000000000..4e5c2e1d1ff Binary files /dev/null and b/Resources/Audio/Announcers/MedBot/comms/command_report.ogg differ diff --git a/Resources/Audio/Announcers/MedBot/comms/welcome.ogg b/Resources/Audio/Announcers/MedBot/comms/welcome.ogg new file mode 100644 index 00000000000..f9a698fd080 Binary files /dev/null and b/Resources/Audio/Announcers/MedBot/comms/welcome.ogg differ diff --git a/Resources/Audio/Announcers/MedBot/events/aliens.ogg b/Resources/Audio/Announcers/MedBot/events/aliens.ogg new file mode 100644 index 00000000000..57fa70c3cae Binary files /dev/null and b/Resources/Audio/Announcers/MedBot/events/aliens.ogg differ diff --git a/Resources/Audio/Announcers/MedBot/events/anomaly.ogg b/Resources/Audio/Announcers/MedBot/events/anomaly.ogg new file mode 100644 index 00000000000..d710999e1e1 Binary files /dev/null and b/Resources/Audio/Announcers/MedBot/events/anomaly.ogg differ diff --git a/Resources/Audio/Announcers/MedBot/events/ion_storm.ogg b/Resources/Audio/Announcers/MedBot/events/ion_storm.ogg new file mode 100644 index 00000000000..15aeac9f7ff Binary files /dev/null and b/Resources/Audio/Announcers/MedBot/events/ion_storm.ogg differ diff --git a/Resources/Audio/Announcers/MedBot/events/meteors.ogg b/Resources/Audio/Announcers/MedBot/events/meteors.ogg new file mode 100644 index 00000000000..91208cae122 Binary files /dev/null and b/Resources/Audio/Announcers/MedBot/events/meteors.ogg differ diff --git a/Resources/Audio/Announcers/MedBot/events/power_grid_check-complete.ogg b/Resources/Audio/Announcers/MedBot/events/power_grid_check-complete.ogg new file mode 100644 index 00000000000..4b1605b1c74 Binary files /dev/null and b/Resources/Audio/Announcers/MedBot/events/power_grid_check-complete.ogg differ diff --git a/Resources/Audio/Announcers/MedBot/events/power_grid_check.ogg b/Resources/Audio/Announcers/MedBot/events/power_grid_check.ogg new file mode 100644 index 00000000000..875df350025 Binary files /dev/null and b/Resources/Audio/Announcers/MedBot/events/power_grid_check.ogg differ diff --git a/Resources/Audio/Announcers/MedBot/fallback.ogg b/Resources/Audio/Announcers/MedBot/fallback.ogg new file mode 100644 index 00000000000..d4d5a270852 Binary files /dev/null and b/Resources/Audio/Announcers/MedBot/fallback.ogg differ diff --git a/Resources/Audio/Announcers/MedBot/shuttle/shuttlecalled.ogg b/Resources/Audio/Announcers/MedBot/shuttle/shuttlecalled.ogg new file mode 100644 index 00000000000..a775567abed Binary files /dev/null and b/Resources/Audio/Announcers/MedBot/shuttle/shuttlecalled.ogg differ diff --git a/Resources/Audio/Announcers/MedBot/shuttle/shuttledock.ogg b/Resources/Audio/Announcers/MedBot/shuttle/shuttledock.ogg new file mode 100644 index 00000000000..933928db067 Binary files /dev/null and b/Resources/Audio/Announcers/MedBot/shuttle/shuttledock.ogg differ diff --git a/Resources/Audio/Announcers/MedBot/shuttle/shuttlerecalled.ogg b/Resources/Audio/Announcers/MedBot/shuttle/shuttlerecalled.ogg new file mode 100644 index 00000000000..53b622576d4 Binary files /dev/null and b/Resources/Audio/Announcers/MedBot/shuttle/shuttlerecalled.ogg differ diff --git a/Resources/Audio/Announcers/MedBot/unused/animes.ogg b/Resources/Audio/Announcers/MedBot/unused/animes.ogg new file mode 100644 index 00000000000..7615a744a66 Binary files /dev/null and b/Resources/Audio/Announcers/MedBot/unused/animes.ogg differ diff --git a/Resources/Audio/Announcers/MedBot/unused/intercept.ogg b/Resources/Audio/Announcers/MedBot/unused/intercept.ogg new file mode 100644 index 00000000000..c59d0455c1c Binary files /dev/null and b/Resources/Audio/Announcers/MedBot/unused/intercept.ogg differ diff --git a/Resources/Audio/Announcers/MedBot/unused/newai.ogg b/Resources/Audio/Announcers/MedBot/unused/newai.ogg new file mode 100644 index 00000000000..c40b0990206 Binary files /dev/null and b/Resources/Audio/Announcers/MedBot/unused/newai.ogg differ diff --git a/Resources/Audio/Announcers/MedBot/unused/outbreak7.ogg b/Resources/Audio/Announcers/MedBot/unused/outbreak7.ogg new file mode 100644 index 00000000000..1fc542534db Binary files /dev/null and b/Resources/Audio/Announcers/MedBot/unused/outbreak7.ogg differ diff --git a/Resources/Audio/Announcers/MedBot/unused/radiation.ogg b/Resources/Audio/Announcers/MedBot/unused/radiation.ogg new file mode 100644 index 00000000000..5c48830b5f2 Binary files /dev/null and b/Resources/Audio/Announcers/MedBot/unused/radiation.ogg differ diff --git a/Resources/Audio/Announcers/Michael/alerts/blue.ogg b/Resources/Audio/Announcers/Michael/alerts/blue.ogg new file mode 100644 index 00000000000..f6458c00bb3 Binary files /dev/null and b/Resources/Audio/Announcers/Michael/alerts/blue.ogg differ diff --git a/Resources/Audio/Announcers/Michael/alerts/epsilon.ogg b/Resources/Audio/Announcers/Michael/alerts/epsilon.ogg new file mode 100644 index 00000000000..82815eda27d Binary files /dev/null and b/Resources/Audio/Announcers/Michael/alerts/epsilon.ogg differ diff --git a/Resources/Audio/Announcers/Michael/alerts/gamma.ogg b/Resources/Audio/Announcers/Michael/alerts/gamma.ogg new file mode 100644 index 00000000000..0a402b6d331 Binary files /dev/null and b/Resources/Audio/Announcers/Michael/alerts/gamma.ogg differ diff --git a/Resources/Audio/Announcers/Michael/alerts/green.ogg b/Resources/Audio/Announcers/Michael/alerts/green.ogg new file mode 100644 index 00000000000..d9d0f036fd4 Binary files /dev/null and b/Resources/Audio/Announcers/Michael/alerts/green.ogg differ diff --git a/Resources/Audio/Announcers/Michael/alerts/red.ogg b/Resources/Audio/Announcers/Michael/alerts/red.ogg new file mode 100644 index 00000000000..4a7f1e9472a Binary files /dev/null and b/Resources/Audio/Announcers/Michael/alerts/red.ogg differ diff --git a/Resources/Audio/Announcers/Michael/alerts/rename.js b/Resources/Audio/Announcers/Michael/alerts/rename.js new file mode 100644 index 00000000000..0c52f5fb327 --- /dev/null +++ b/Resources/Audio/Announcers/Michael/alerts/rename.js @@ -0,0 +1,191 @@ +// Set the method variable to one of these +const methods = [ + 'startsWith', // Replaces beginning with replace if matches searchfor OR cuts off the beginning if matches searchfor if replace is undefined + 'endsWith', // Replaces end with replace if matches searchfor OR cuts off the end if matches searchfor if replace is undefined + 'includes', // Replaces all instances of searchfor with replace OR removes all instances of searchfor if replace is undefined + + 'numberedSuffix', // Adds a numbered suffix to the end of the file name + 'numberedPrefix', // Adds a numbered prefix to the beginning of the file name + 'numbered', // Replaces the file name with a number +]; + +// User set variables +const dirname = './'; // Where to look for files ('./' is the current directory) +const includedirs = false; // Whether or not to include directories in the search +const searchfor = 'code_'; // What to search for +const replace = undefined; // What to replace with (undefined will remove the searchfor from the file name entirely) +const removeextraperiods = true; // Whether or not to remove extra periods in the file name (good for numbered methods) +const method = 'startsWith'; // Which method to use (see above) +const startingnumber = 0; // What number to start at (only used with numbered methods) +const debuglog = true; // Provides some extra info about what's going on +// End of user set variables + + +// Check if method is valid +if (typeof method !== 'string' || !methods.includes(method)) return console.log(`ERROR: Invalid method ${method}`); +else console.log('INFO: Using method: ' + method); + +// Check if dirname is valid +if (typeof dirname !== 'string') return console.log('ERROR: Invalid dirname'); +else console.log('INFO: Using directory: ' + dirname); + +// Warn of includedirs +if (includedirs) console.log('WARNING: Including directories in search'); +else console.log('INFO: Not including directories in search'); + +// Check if searchfor is valid +if (typeof searchfor !== 'string' && !method.includes('numbered')) return console.log('ERROR: Invalid searchfor'); +if (typeof searchfor !== 'string' && method.includes('numbered')) console.log('WARNING: Searchfor is undefined, this will replace the file name with a number'); +else console.log(`INFO: Searching for: ${searchfor}`); + +// Warn if replace is undefined +if (replace === undefined) console.log('WARNING: Replace is undefined, this will remove the searchfor from the file name entirely'); +else console.log(`INFO: Replacing with: ${replace}`); + +// Tell user if startingnumber is not 0 +if (startingnumber !== 0) console.log(`INFO: Starting number: ${startingnumber}`); + +// Check if debuglog is enabled +if (debuglog) console.log('INFO: Debug log is enabled'); +else console.log('INFO: Debug log is disabled'); + + +console.log('\n'); +console.log('INFO: Starting search...'); +console.log('\n'); + + +const fs = require('fs'); +const files = fs.readdirSync(dirname); +let number = 0 + startingnumber; + + +// Debug log +if (debuglog) { + console.log('DEBUG: Files:'); + console.log(files); + console.log(`DEBUG: Files type: ${typeof files}`); + console.log('\n'); +} + + +files.forEach((file) => { + // Split file name and extension + // If there is no extension, name[1] will be a blank string to avoid files getting fucked up + let name = file.includes('.') ? file.split('.') : [file, '']; + name.reverse(); + if (name[0].length > 0) name[0] = '.' + name[0]; + var extension = name[0]; + name.reverse(); + if (removeextraperiods) name = [name.join('').slice(0, -extension.length), extension]; + else name = [name.join('.').slice(0, -extension.length), extension]; + + + // Check if file is this script + if (process.argv[1].includes(name.join(''))) return; + + + // Debug log + if (debuglog) console.log(`DEBUG: File name: ${name[0]}`); + + + // Check if file is a directory + if (!includedirs) { + try { + if (fs.readdirSync(dirname + file).length) { + if (debuglog) console.log(`DEBUG: File is a directory, skipping: ${name[0]}`); + if (debuglog) console.log('\n'); + return; + } + } catch (e) { + if (debuglog) console.log(`DEBUG: File is a file: ${name[0]}`); + } + } else { + try { + if (fs.readdirSync(dirname + file).length) { + if (debuglog) console.log(`DEBUG: File is a directory: ${name[0]}`); + } + } catch (e) { + if (debuglog) console.log(`DEBUG: File is a file: ${name[0]}`); + } + } + + + if (method === 'startsWith') { + if (!name[0].startsWith(searchfor)) { + if (debuglog) console.log(`DEBUG: File name does not start with '${searchfor}': ${name[0]}`); + if (debuglog) console.log('\n'); + return; + } + + if (replace) { + fs.renameSync(dirname + '/' + file, dirname + '/' + replace + name[0].slice(searchfor.length) + name[1]); + } else { + fs.renameSync(dirname + '/' + file, dirname + '/' + name[0].slice(searchfor.length) + name[1]); + } + } else if (method === 'endsWith') { + if (!name[0].endsWith(searchfor)) { + if (debuglog) console.log(`DEBUG: File name does not end with '${searchfor}': ${name[0]}`); + if (debuglog) console.log('\n'); + return; + } + + if (replace) { + fs.renameSync(dirname + '/' + file, dirname + '/' + name[0].slice(0, -searchfor.length) + replace + name[1]); + } else { + fs.renameSync(dirname + '/' + file, dirname + '/' + name[0].slice(0, -searchfor.length) + name[1]); + } + } else if (method === 'includes') { + if (!name[0].includes(searchfor)) { + if (debuglog) console.log(`DEBUG: File name does not include '${searchfor}': ${name[0]}`); + if (debuglog) console.log('\n'); + return; + } + + const regex = new RegExp(searchfor, 'g'); + + if (replace) { + fs.renameSync(dirname + '/' + file, dirname + '/' + name[0].replace(regex, replace) + name[1]); + } else { + fs.renameSync(dirname + '/' + file, dirname + '/' + name[0].replace(regex, '') + name[1]); + } + } else if (method === 'numberedPrefix') { + if (!name[0].startsWith(searchfor)) { + if (debuglog) console.log(`DEBUG: File name does not start with '${searchfor}': ${name[0]}`); + if (debuglog) console.log('\n'); + return; + } + + fs.renameSync(dirname + '/' + file, dirname + '/' + number + name[0] + name[1]); + + number++; + } else if (method === 'numberedSuffix') { + if (!name[0].endsWith(searchfor)) { + if (debuglog) console.log(`DEBUG: File name does not end with '${searchfor}': ${name[0]}`); + if (debuglog) console.log('\n'); + return; + } + + fs.renameSync(dirname + '/' + file, dirname + '/' + name[0] + number + name[1]); + + number++; + } else if (method === 'numbered') { + if (typeof searchfor === 'string') { + if (!name[0].includes(searchfor)) { + if (debuglog) console.log(`DEBUG: File name does not include '${searchfor}': ${name[0]}`); + if (debuglog) console.log('\n'); + return; + } + + fs.renameSync(dirname + '/' + file, dirname + '/' + number + name[1]); + } else { + fs.renameSync(dirname + '/' + file, dirname + '/' + number + name[1]); + } + + number++; + } + + console.log('\n'); +}); + +console.log('INFO: Search complete'); diff --git a/Resources/Audio/Announcers/Michael/alerts/violet.ogg b/Resources/Audio/Announcers/Michael/alerts/violet.ogg new file mode 100644 index 00000000000..7a611d819eb Binary files /dev/null and b/Resources/Audio/Announcers/Michael/alerts/violet.ogg differ diff --git a/Resources/Audio/Announcers/Michael/alerts/white.ogg b/Resources/Audio/Announcers/Michael/alerts/white.ogg new file mode 100644 index 00000000000..1bb3afd354c Binary files /dev/null and b/Resources/Audio/Announcers/Michael/alerts/white.ogg differ diff --git a/Resources/Audio/Announcers/Michael/alerts/yellow.ogg b/Resources/Audio/Announcers/Michael/alerts/yellow.ogg new file mode 100644 index 00000000000..3a72eca3bbc Binary files /dev/null and b/Resources/Audio/Announcers/Michael/alerts/yellow.ogg differ diff --git a/Resources/Audio/Announcers/Michael/comms/attention.ogg b/Resources/Audio/Announcers/Michael/comms/attention.ogg new file mode 100644 index 00000000000..e25fdf2af7e Binary files /dev/null and b/Resources/Audio/Announcers/Michael/comms/attention.ogg differ diff --git a/Resources/Audio/Announcers/Michael/comms/welcome.ogg b/Resources/Audio/Announcers/Michael/comms/welcome.ogg new file mode 100644 index 00000000000..32d90041090 Binary files /dev/null and b/Resources/Audio/Announcers/Michael/comms/welcome.ogg differ diff --git a/Resources/Audio/Announcers/Michael/events/aliens.ogg b/Resources/Audio/Announcers/Michael/events/aliens.ogg new file mode 100644 index 00000000000..1293b3ced5b Binary files /dev/null and b/Resources/Audio/Announcers/Michael/events/aliens.ogg differ diff --git a/Resources/Audio/Announcers/Michael/events/bureaucratic_error.ogg b/Resources/Audio/Announcers/Michael/events/bureaucratic_error.ogg new file mode 100644 index 00000000000..2bb2710acf0 Binary files /dev/null and b/Resources/Audio/Announcers/Michael/events/bureaucratic_error.ogg differ diff --git a/Resources/Audio/Announcers/Michael/events/gas_leak.ogg b/Resources/Audio/Announcers/Michael/events/gas_leak.ogg new file mode 100644 index 00000000000..26912c859d1 Binary files /dev/null and b/Resources/Audio/Announcers/Michael/events/gas_leak.ogg differ diff --git a/Resources/Audio/Announcers/Michael/events/kudzu_growth.ogg b/Resources/Audio/Announcers/Michael/events/kudzu_growth.ogg new file mode 100644 index 00000000000..31eccef518b Binary files /dev/null and b/Resources/Audio/Announcers/Michael/events/kudzu_growth.ogg differ diff --git a/Resources/Audio/Announcers/Michael/events/meteors.ogg b/Resources/Audio/Announcers/Michael/events/meteors.ogg new file mode 100644 index 00000000000..62a21625712 Binary files /dev/null and b/Resources/Audio/Announcers/Michael/events/meteors.ogg differ diff --git a/Resources/Audio/Announcers/Michael/events/noospheric_storm.ogg b/Resources/Audio/Announcers/Michael/events/noospheric_storm.ogg new file mode 100644 index 00000000000..eedaaf5699b Binary files /dev/null and b/Resources/Audio/Announcers/Michael/events/noospheric_storm.ogg differ diff --git a/Resources/Audio/Announcers/Michael/events/power_grid_check-complete.ogg b/Resources/Audio/Announcers/Michael/events/power_grid_check-complete.ogg new file mode 100644 index 00000000000..de5fa1ff401 Binary files /dev/null and b/Resources/Audio/Announcers/Michael/events/power_grid_check-complete.ogg differ diff --git a/Resources/Audio/Announcers/Michael/events/power_grid_check.ogg b/Resources/Audio/Announcers/Michael/events/power_grid_check.ogg new file mode 100644 index 00000000000..07964d240e7 Binary files /dev/null and b/Resources/Audio/Announcers/Michael/events/power_grid_check.ogg differ diff --git a/Resources/Audio/Announcers/Michael/events/vent_clog.ogg b/Resources/Audio/Announcers/Michael/events/vent_clog.ogg new file mode 100644 index 00000000000..16fbf88e03f Binary files /dev/null and b/Resources/Audio/Announcers/Michael/events/vent_clog.ogg differ diff --git a/Resources/Audio/Announcers/Michael/fallback.ogg b/Resources/Audio/Announcers/Michael/fallback.ogg new file mode 100644 index 00000000000..e25fdf2af7e Binary files /dev/null and b/Resources/Audio/Announcers/Michael/fallback.ogg differ diff --git a/Resources/Audio/Announcers/Michael/shuttle/shuttle_called.ogg b/Resources/Audio/Announcers/Michael/shuttle/shuttle_called.ogg new file mode 100644 index 00000000000..261ecabf6e5 Binary files /dev/null and b/Resources/Audio/Announcers/Michael/shuttle/shuttle_called.ogg differ diff --git a/Resources/Audio/Announcers/Michael/shuttle/shuttle_dock.ogg b/Resources/Audio/Announcers/Michael/shuttle/shuttle_dock.ogg new file mode 100644 index 00000000000..a83b482f49a Binary files /dev/null and b/Resources/Audio/Announcers/Michael/shuttle/shuttle_dock.ogg differ diff --git a/Resources/Audio/Announcers/Michael/shuttle/shuttle_recalled.ogg b/Resources/Audio/Announcers/Michael/shuttle/shuttle_recalled.ogg new file mode 100644 index 00000000000..b104ea561a8 Binary files /dev/null and b/Resources/Audio/Announcers/Michael/shuttle/shuttle_recalled.ogg differ diff --git a/Resources/Audio/Announcers/Michael/unused/outbreak7.ogg b/Resources/Audio/Announcers/Michael/unused/outbreak7.ogg new file mode 100644 index 00000000000..fc584db60c4 Binary files /dev/null and b/Resources/Audio/Announcers/Michael/unused/outbreak7.ogg differ diff --git a/Resources/Audio/Announcers/Michael/unused/radiation.ogg b/Resources/Audio/Announcers/Michael/unused/radiation.ogg new file mode 100644 index 00000000000..7b7ca0c2b9e Binary files /dev/null and b/Resources/Audio/Announcers/Michael/unused/radiation.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/alerts/code_blue.ogg b/Resources/Audio/Announcers/NEIL/alerts/code_blue.ogg new file mode 100644 index 00000000000..48d9c6548b6 Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/alerts/code_blue.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/alerts/code_delta.ogg b/Resources/Audio/Announcers/NEIL/alerts/code_delta.ogg new file mode 100644 index 00000000000..70826719156 Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/alerts/code_delta.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/alerts/code_epsilon.ogg b/Resources/Audio/Announcers/NEIL/alerts/code_epsilon.ogg new file mode 100644 index 00000000000..a8db858b1af Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/alerts/code_epsilon.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/alerts/code_gamma.ogg b/Resources/Audio/Announcers/NEIL/alerts/code_gamma.ogg new file mode 100644 index 00000000000..3351acc2e0d Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/alerts/code_gamma.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/alerts/code_green.ogg b/Resources/Audio/Announcers/NEIL/alerts/code_green.ogg new file mode 100644 index 00000000000..3c0031833be Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/alerts/code_green.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/alerts/code_red.ogg b/Resources/Audio/Announcers/NEIL/alerts/code_red.ogg new file mode 100644 index 00000000000..209eb36ba11 Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/alerts/code_red.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/alerts/code_violet.ogg b/Resources/Audio/Announcers/NEIL/alerts/code_violet.ogg new file mode 100644 index 00000000000..c1681c1edb8 Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/alerts/code_violet.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/alerts/code_white.ogg b/Resources/Audio/Announcers/NEIL/alerts/code_white.ogg new file mode 100644 index 00000000000..24c942dfcb2 Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/alerts/code_white.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/alerts/code_yellow.ogg b/Resources/Audio/Announcers/NEIL/alerts/code_yellow.ogg new file mode 100644 index 00000000000..9139446d2b6 Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/alerts/code_yellow.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/comms/announce.ogg b/Resources/Audio/Announcers/NEIL/comms/announce.ogg new file mode 100644 index 00000000000..0ee0f36d56f Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/comms/announce.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/comms/attention.ogg b/Resources/Audio/Announcers/NEIL/comms/attention.ogg new file mode 100644 index 00000000000..310fad3ef63 Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/comms/attention.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/comms/welcome.ogg b/Resources/Audio/Announcers/NEIL/comms/welcome.ogg new file mode 100644 index 00000000000..00c8991276c Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/comms/welcome.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/events/bureaucraticerror.ogg b/Resources/Audio/Announcers/NEIL/events/bureaucraticerror.ogg new file mode 100644 index 00000000000..0cbafcf6276 Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/events/bureaucraticerror.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/events/gasleak.ogg b/Resources/Audio/Announcers/NEIL/events/gasleak.ogg new file mode 100644 index 00000000000..8efffd02c45 Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/events/gasleak.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/events/kudzu.ogg b/Resources/Audio/Announcers/NEIL/events/kudzu.ogg new file mode 100644 index 00000000000..4ddd2f636bc Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/events/kudzu.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/events/meteors.ogg b/Resources/Audio/Announcers/NEIL/events/meteors.ogg new file mode 100644 index 00000000000..cf525441745 Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/events/meteors.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/events/noosphericstorm.ogg b/Resources/Audio/Announcers/NEIL/events/noosphericstorm.ogg new file mode 100644 index 00000000000..47b52f7cb47 Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/events/noosphericstorm.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/events/power_grid_check-complete.ogg b/Resources/Audio/Announcers/NEIL/events/power_grid_check-complete.ogg new file mode 100644 index 00000000000..961b50a5031 Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/events/power_grid_check-complete.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/events/power_grid_check.ogg b/Resources/Audio/Announcers/NEIL/events/power_grid_check.ogg new file mode 100644 index 00000000000..7d7a43825fe Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/events/power_grid_check.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/events/ventclog.ogg b/Resources/Audio/Announcers/NEIL/events/ventclog.ogg new file mode 100644 index 00000000000..90350f0e359 Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/events/ventclog.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/fallback.ogg b/Resources/Audio/Announcers/NEIL/fallback.ogg new file mode 100644 index 00000000000..310fad3ef63 Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/fallback.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/shuttle/shuttlecalled.ogg b/Resources/Audio/Announcers/NEIL/shuttle/shuttlecalled.ogg new file mode 100644 index 00000000000..482bf133193 Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/shuttle/shuttlecalled.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/shuttle/shuttledock.ogg b/Resources/Audio/Announcers/NEIL/shuttle/shuttledock.ogg new file mode 100644 index 00000000000..0615536555b Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/shuttle/shuttledock.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/shuttle/shuttlerecalled.ogg b/Resources/Audio/Announcers/NEIL/shuttle/shuttlerecalled.ogg new file mode 100644 index 00000000000..5a198ca5fe4 Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/shuttle/shuttlerecalled.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/unused/outbreak7.ogg b/Resources/Audio/Announcers/NEIL/unused/outbreak7.ogg new file mode 100644 index 00000000000..91067960125 Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/unused/outbreak7.ogg differ diff --git a/Resources/Audio/Announcers/NEIL/unused/radiation.ogg b/Resources/Audio/Announcers/NEIL/unused/radiation.ogg new file mode 100644 index 00000000000..3ea2928c1d9 Binary files /dev/null and b/Resources/Audio/Announcers/NEIL/unused/radiation.ogg differ diff --git a/Resources/Audio/Announcers/VoxFem/comms/announce.ogg b/Resources/Audio/Announcers/VoxFem/comms/announce.ogg new file mode 100644 index 00000000000..0ee0f36d56f Binary files /dev/null and b/Resources/Audio/Announcers/VoxFem/comms/announce.ogg differ diff --git a/Resources/Audio/Announcers/VoxFem/comms/attention.ogg b/Resources/Audio/Announcers/VoxFem/comms/attention.ogg new file mode 100644 index 00000000000..912be4425eb Binary files /dev/null and b/Resources/Audio/Announcers/VoxFem/comms/attention.ogg differ diff --git a/Resources/Audio/Announcers/VoxFem/comms/command_report.ogg b/Resources/Audio/Announcers/VoxFem/comms/command_report.ogg new file mode 100644 index 00000000000..82e4ca425de Binary files /dev/null and b/Resources/Audio/Announcers/VoxFem/comms/command_report.ogg differ diff --git a/Resources/Audio/Announcers/VoxFem/comms/welcome.ogg b/Resources/Audio/Announcers/VoxFem/comms/welcome.ogg new file mode 100644 index 00000000000..c7013dcbd5f Binary files /dev/null and b/Resources/Audio/Announcers/VoxFem/comms/welcome.ogg differ diff --git a/Resources/Audio/Announcers/VoxFem/events/aliens.ogg b/Resources/Audio/Announcers/VoxFem/events/aliens.ogg new file mode 100644 index 00000000000..f7d1746247f Binary files /dev/null and b/Resources/Audio/Announcers/VoxFem/events/aliens.ogg differ diff --git a/Resources/Audio/Announcers/VoxFem/events/anomaly.ogg b/Resources/Audio/Announcers/VoxFem/events/anomaly.ogg new file mode 100644 index 00000000000..7680726f153 Binary files /dev/null and b/Resources/Audio/Announcers/VoxFem/events/anomaly.ogg differ diff --git a/Resources/Audio/Announcers/VoxFem/events/ion_storm.ogg b/Resources/Audio/Announcers/VoxFem/events/ion_storm.ogg new file mode 100644 index 00000000000..9f39713de6e Binary files /dev/null and b/Resources/Audio/Announcers/VoxFem/events/ion_storm.ogg differ diff --git a/Resources/Audio/Announcers/VoxFem/events/meteors.ogg b/Resources/Audio/Announcers/VoxFem/events/meteors.ogg new file mode 100644 index 00000000000..8f1c3aeacbb Binary files /dev/null and b/Resources/Audio/Announcers/VoxFem/events/meteors.ogg differ diff --git a/Resources/Audio/Announcers/VoxFem/events/power_grid_check-complete.ogg b/Resources/Audio/Announcers/VoxFem/events/power_grid_check-complete.ogg new file mode 100644 index 00000000000..9d18797d6ea Binary files /dev/null and b/Resources/Audio/Announcers/VoxFem/events/power_grid_check-complete.ogg differ diff --git a/Resources/Audio/Announcers/VoxFem/events/power_grid_check.ogg b/Resources/Audio/Announcers/VoxFem/events/power_grid_check.ogg new file mode 100644 index 00000000000..1c6377c9d8d Binary files /dev/null and b/Resources/Audio/Announcers/VoxFem/events/power_grid_check.ogg differ diff --git a/Resources/Audio/Announcers/VoxFem/fallback.ogg b/Resources/Audio/Announcers/VoxFem/fallback.ogg new file mode 100644 index 00000000000..912be4425eb Binary files /dev/null and b/Resources/Audio/Announcers/VoxFem/fallback.ogg differ diff --git a/Resources/Audio/Announcers/VoxFem/shuttle/shuttlecalled.ogg b/Resources/Audio/Announcers/VoxFem/shuttle/shuttlecalled.ogg new file mode 100644 index 00000000000..716bf824654 Binary files /dev/null and b/Resources/Audio/Announcers/VoxFem/shuttle/shuttlecalled.ogg differ diff --git a/Resources/Audio/Announcers/VoxFem/shuttle/shuttledock.ogg b/Resources/Audio/Announcers/VoxFem/shuttle/shuttledock.ogg new file mode 100644 index 00000000000..0f70bebc751 Binary files /dev/null and b/Resources/Audio/Announcers/VoxFem/shuttle/shuttledock.ogg differ diff --git a/Resources/Audio/Announcers/VoxFem/shuttle/shuttlerecalled.ogg b/Resources/Audio/Announcers/VoxFem/shuttle/shuttlerecalled.ogg new file mode 100644 index 00000000000..5f6db404b87 Binary files /dev/null and b/Resources/Audio/Announcers/VoxFem/shuttle/shuttlerecalled.ogg differ diff --git a/Resources/Audio/Announcers/VoxFem/unused/newai.ogg b/Resources/Audio/Announcers/VoxFem/unused/newai.ogg new file mode 100644 index 00000000000..35aba34564f Binary files /dev/null and b/Resources/Audio/Announcers/VoxFem/unused/newai.ogg differ diff --git a/Resources/Audio/Announcers/VoxFem/unused/outbreak7.ogg b/Resources/Audio/Announcers/VoxFem/unused/outbreak7.ogg new file mode 100644 index 00000000000..f21d4fca443 Binary files /dev/null and b/Resources/Audio/Announcers/VoxFem/unused/outbreak7.ogg differ diff --git a/Resources/Audio/Announcers/VoxFem/unused/radiation.ogg b/Resources/Audio/Announcers/VoxFem/unused/radiation.ogg new file mode 100644 index 00000000000..ef395af3101 Binary files /dev/null and b/Resources/Audio/Announcers/VoxFem/unused/radiation.ogg differ diff --git a/Resources/Audio/Effects/Shadowkin/Powers/darkswapoff.ogg b/Resources/Audio/Effects/Shadowkin/Powers/darkswapoff.ogg new file mode 100644 index 00000000000..61f331a68a1 Binary files /dev/null and b/Resources/Audio/Effects/Shadowkin/Powers/darkswapoff.ogg differ diff --git a/Resources/Audio/Effects/Shadowkin/Powers/darkswapon.ogg b/Resources/Audio/Effects/Shadowkin/Powers/darkswapon.ogg new file mode 100644 index 00000000000..deb6139934e Binary files /dev/null and b/Resources/Audio/Effects/Shadowkin/Powers/darkswapon.ogg differ diff --git a/Resources/Audio/Effects/Shadowkin/Powers/futuristic-teleport.ogg b/Resources/Audio/Effects/Shadowkin/Powers/futuristic-teleport.ogg new file mode 100644 index 00000000000..87aeb33fdd9 Binary files /dev/null and b/Resources/Audio/Effects/Shadowkin/Powers/futuristic-teleport.ogg differ diff --git a/Resources/Audio/Effects/Shadowkin/Powers/license.txt b/Resources/Audio/Effects/Shadowkin/Powers/license.txt new file mode 100644 index 00000000000..c77ea8eb098 --- /dev/null +++ b/Resources/Audio/Effects/Shadowkin/Powers/license.txt @@ -0,0 +1,4 @@ +darkswapon.ogg licensed under Pixabay Licence taken from https://pixabay.com/users/cristian_changing-30278997/ +darkswapoff.ogg licensed under Pixabay Licence taken from https://pixabay.com/users/cristian_changing-30278997/ +futuristic-teleport.ogg licensed under Pixabay Licence taken from https://pixabay.com/users/cristian_changing-30278997/ +teleport.ogg licensed under Pixabay Licence taken from https://pixabay.com/users/cristian_changing-30278997/ diff --git a/Resources/Audio/Effects/Shadowkin/Powers/teleport.ogg b/Resources/Audio/Effects/Shadowkin/Powers/teleport.ogg new file mode 100644 index 00000000000..3cca66b47cb Binary files /dev/null and b/Resources/Audio/Effects/Shadowkin/Powers/teleport.ogg differ diff --git a/Resources/Audio/Effects/attributions.yml b/Resources/Audio/Effects/attributions.yml index 90445a31d1c..6f18510d17b 100644 --- a/Resources/Audio/Effects/attributions.yml +++ b/Resources/Audio/Effects/attributions.yml @@ -226,3 +226,8 @@ copyright: TGStation at 3df5d3b42bfb6b3b5adba1067ab41f83816255bb license: CC-BY-SA-3.0 source: https://github.com/tgstation/tgstation/blob/3df5d3b42bfb6b3b5adba1067ab41f83816255bb/sound/misc/server-ready.ogg + +- files: [beep_landmine.ogg] + copyright: '"beep_landmine.ogg" by kaktuscsc of Discord for SS14' + license: "CC-BY-SA-3.0" + source: https://github.com/YuriyKiss/space-station-14/commit/971a135a9c83aed46e967aac9302ab5b35562b5f diff --git a/Resources/Audio/Effects/beep_landmine.ogg b/Resources/Audio/Effects/beep_landmine.ogg new file mode 100644 index 00000000000..48bc5e21d96 Binary files /dev/null and b/Resources/Audio/Effects/beep_landmine.ogg differ diff --git a/Resources/Audio/Effects/closet_close.ogg b/Resources/Audio/Effects/closet_close.ogg new file mode 100644 index 00000000000..124f5d85f5e Binary files /dev/null and b/Resources/Audio/Effects/closet_close.ogg differ diff --git a/Resources/Audio/Effects/closet_open.ogg b/Resources/Audio/Effects/closet_open.ogg new file mode 100644 index 00000000000..86cbcea0d01 Binary files /dev/null and b/Resources/Audio/Effects/closet_open.ogg differ diff --git a/Resources/Audio/Effects/phasein.ogg b/Resources/Audio/Effects/phasein.ogg new file mode 100644 index 00000000000..8b74a7d42fd Binary files /dev/null and b/Resources/Audio/Effects/phasein.ogg differ diff --git a/Resources/Audio/Effects/podwoosh.ogg b/Resources/Audio/Effects/podwoosh.ogg new file mode 100644 index 00000000000..e6fd58c7fc2 Binary files /dev/null and b/Resources/Audio/Effects/podwoosh.ogg differ diff --git a/Resources/Audio/Effects/toggleoffcombat.ogg b/Resources/Audio/Effects/toggleoffcombat.ogg new file mode 100644 index 00000000000..98df1726e98 Binary files /dev/null and b/Resources/Audio/Effects/toggleoffcombat.ogg differ diff --git a/Resources/Audio/Effects/toggleoncombat.ogg b/Resources/Audio/Effects/toggleoncombat.ogg new file mode 100644 index 00000000000..7336b9cf0e1 Binary files /dev/null and b/Resources/Audio/Effects/toggleoncombat.ogg differ diff --git a/Resources/Audio/Items/Equip/toolbelt_equip.ogg b/Resources/Audio/Items/Equip/toolbelt_equip.ogg new file mode 100644 index 00000000000..0ef67a3fd6c Binary files /dev/null and b/Resources/Audio/Items/Equip/toolbelt_equip.ogg differ diff --git a/Resources/Audio/Items/Handling/ammobox_drop.ogg b/Resources/Audio/Items/Handling/ammobox_drop.ogg new file mode 100644 index 00000000000..13fce70fe3d Binary files /dev/null and b/Resources/Audio/Items/Handling/ammobox_drop.ogg differ diff --git a/Resources/Audio/Items/Handling/ammobox_pickup.ogg b/Resources/Audio/Items/Handling/ammobox_pickup.ogg new file mode 100644 index 00000000000..9532a7697b9 Binary files /dev/null and b/Resources/Audio/Items/Handling/ammobox_pickup.ogg differ diff --git a/Resources/Audio/Items/Handling/book_drop.ogg b/Resources/Audio/Items/Handling/book_drop.ogg new file mode 100644 index 00000000000..b492b665f59 Binary files /dev/null and b/Resources/Audio/Items/Handling/book_drop.ogg differ diff --git a/Resources/Audio/Items/Handling/book_pickup.ogg b/Resources/Audio/Items/Handling/book_pickup.ogg new file mode 100644 index 00000000000..120a4e4721a Binary files /dev/null and b/Resources/Audio/Items/Handling/book_pickup.ogg differ diff --git a/Resources/Audio/Items/Handling/cardboardbox_drop.ogg b/Resources/Audio/Items/Handling/cardboardbox_drop.ogg new file mode 100644 index 00000000000..7070ba1c342 Binary files /dev/null and b/Resources/Audio/Items/Handling/cardboardbox_drop.ogg differ diff --git a/Resources/Audio/Items/Handling/cardboardbox_pickup.ogg b/Resources/Audio/Items/Handling/cardboardbox_pickup.ogg new file mode 100644 index 00000000000..aa4e72129b0 Binary files /dev/null and b/Resources/Audio/Items/Handling/cardboardbox_pickup.ogg differ diff --git a/Resources/Audio/Items/Handling/cloth_drop.ogg b/Resources/Audio/Items/Handling/cloth_drop.ogg new file mode 100644 index 00000000000..5bf734caba0 Binary files /dev/null and b/Resources/Audio/Items/Handling/cloth_drop.ogg differ diff --git a/Resources/Audio/Items/Handling/cloth_pickup.ogg b/Resources/Audio/Items/Handling/cloth_pickup.ogg new file mode 100644 index 00000000000..f46988887d1 Binary files /dev/null and b/Resources/Audio/Items/Handling/cloth_pickup.ogg differ diff --git a/Resources/Audio/Items/Handling/component_drop.ogg b/Resources/Audio/Items/Handling/component_drop.ogg new file mode 100644 index 00000000000..95ba2591a31 Binary files /dev/null and b/Resources/Audio/Items/Handling/component_drop.ogg differ diff --git a/Resources/Audio/Items/Handling/component_pickup.ogg b/Resources/Audio/Items/Handling/component_pickup.ogg new file mode 100644 index 00000000000..fee7dd9d29f Binary files /dev/null and b/Resources/Audio/Items/Handling/component_pickup.ogg differ diff --git a/Resources/Audio/Items/Handling/crowbar_drop.ogg b/Resources/Audio/Items/Handling/crowbar_drop.ogg new file mode 100644 index 00000000000..77464110661 Binary files /dev/null and b/Resources/Audio/Items/Handling/crowbar_drop.ogg differ diff --git a/Resources/Audio/Items/Handling/crowbar_pickup.ogg b/Resources/Audio/Items/Handling/crowbar_pickup.ogg new file mode 100644 index 00000000000..79b276f8451 Binary files /dev/null and b/Resources/Audio/Items/Handling/crowbar_pickup.ogg differ diff --git a/Resources/Audio/Items/Handling/disk_drop.ogg b/Resources/Audio/Items/Handling/disk_drop.ogg new file mode 100644 index 00000000000..3174b88117f Binary files /dev/null and b/Resources/Audio/Items/Handling/disk_drop.ogg differ diff --git a/Resources/Audio/Items/Handling/disk_pickup.ogg b/Resources/Audio/Items/Handling/disk_pickup.ogg new file mode 100644 index 00000000000..8f67406a5fb Binary files /dev/null and b/Resources/Audio/Items/Handling/disk_pickup.ogg differ diff --git a/Resources/Audio/Items/Handling/drinkglass_drop.ogg b/Resources/Audio/Items/Handling/drinkglass_drop.ogg new file mode 100644 index 00000000000..43bb732db3d Binary files /dev/null and b/Resources/Audio/Items/Handling/drinkglass_drop.ogg differ diff --git a/Resources/Audio/Items/Handling/drinkglass_pickup.ogg b/Resources/Audio/Items/Handling/drinkglass_pickup.ogg new file mode 100644 index 00000000000..fcd1c7d3126 Binary files /dev/null and b/Resources/Audio/Items/Handling/drinkglass_pickup.ogg differ diff --git a/Resources/Audio/Items/Handling/matchbox_drop.ogg b/Resources/Audio/Items/Handling/matchbox_drop.ogg new file mode 100644 index 00000000000..8e4e276c9e1 Binary files /dev/null and b/Resources/Audio/Items/Handling/matchbox_drop.ogg differ diff --git a/Resources/Audio/Items/Handling/matchbox_pickup.ogg b/Resources/Audio/Items/Handling/matchbox_pickup.ogg new file mode 100644 index 00000000000..82c23410e11 Binary files /dev/null and b/Resources/Audio/Items/Handling/matchbox_pickup.ogg differ diff --git a/Resources/Audio/Items/Handling/multitool_drop.ogg b/Resources/Audio/Items/Handling/multitool_drop.ogg new file mode 100644 index 00000000000..67e0a41042c Binary files /dev/null and b/Resources/Audio/Items/Handling/multitool_drop.ogg differ diff --git a/Resources/Audio/Items/Handling/multitool_pickup.ogg b/Resources/Audio/Items/Handling/multitool_pickup.ogg new file mode 100644 index 00000000000..cbd598ce896 Binary files /dev/null and b/Resources/Audio/Items/Handling/multitool_pickup.ogg differ diff --git a/Resources/Audio/Items/Handling/paper_drop.ogg b/Resources/Audio/Items/Handling/paper_drop.ogg new file mode 100644 index 00000000000..27ce2b3d1a7 Binary files /dev/null and b/Resources/Audio/Items/Handling/paper_drop.ogg differ diff --git a/Resources/Audio/Items/Handling/paper_pickup.ogg b/Resources/Audio/Items/Handling/paper_pickup.ogg new file mode 100644 index 00000000000..55ae2b3d2db Binary files /dev/null and b/Resources/Audio/Items/Handling/paper_pickup.ogg differ diff --git a/Resources/Audio/Items/Handling/screwdriver_drop.ogg b/Resources/Audio/Items/Handling/screwdriver_drop.ogg new file mode 100644 index 00000000000..cca91f4dddd Binary files /dev/null and b/Resources/Audio/Items/Handling/screwdriver_drop.ogg differ diff --git a/Resources/Audio/Items/Handling/screwdriver_pickup.ogg b/Resources/Audio/Items/Handling/screwdriver_pickup.ogg new file mode 100644 index 00000000000..6f6b29ddfc9 Binary files /dev/null and b/Resources/Audio/Items/Handling/screwdriver_pickup.ogg differ diff --git a/Resources/Audio/Items/Handling/sword_sheath.ogg b/Resources/Audio/Items/Handling/sword_sheath.ogg new file mode 100644 index 00000000000..9e1d5cdc009 Binary files /dev/null and b/Resources/Audio/Items/Handling/sword_sheath.ogg differ diff --git a/Resources/Audio/Items/Handling/sword_unsheath.ogg b/Resources/Audio/Items/Handling/sword_unsheath.ogg new file mode 100644 index 00000000000..09867f5966a Binary files /dev/null and b/Resources/Audio/Items/Handling/sword_unsheath.ogg differ diff --git a/Resources/Audio/Items/Handling/toolbelt_drop.ogg b/Resources/Audio/Items/Handling/toolbelt_drop.ogg new file mode 100644 index 00000000000..2a3c4655c49 Binary files /dev/null and b/Resources/Audio/Items/Handling/toolbelt_drop.ogg differ diff --git a/Resources/Audio/Items/Handling/toolbelt_pickup.ogg b/Resources/Audio/Items/Handling/toolbelt_pickup.ogg new file mode 100644 index 00000000000..58e5d25979a Binary files /dev/null and b/Resources/Audio/Items/Handling/toolbelt_pickup.ogg differ diff --git a/Resources/Audio/Items/Handling/toolbox_drop.ogg b/Resources/Audio/Items/Handling/toolbox_drop.ogg new file mode 100644 index 00000000000..abf56946278 Binary files /dev/null and b/Resources/Audio/Items/Handling/toolbox_drop.ogg differ diff --git a/Resources/Audio/Items/Handling/toolbox_pickup.ogg b/Resources/Audio/Items/Handling/toolbox_pickup.ogg new file mode 100644 index 00000000000..01a4ab4b3fa Binary files /dev/null and b/Resources/Audio/Items/Handling/toolbox_pickup.ogg differ diff --git a/Resources/Audio/Items/Handling/welder_drop.ogg b/Resources/Audio/Items/Handling/welder_drop.ogg new file mode 100644 index 00000000000..58b722ad7a7 Binary files /dev/null and b/Resources/Audio/Items/Handling/welder_drop.ogg differ diff --git a/Resources/Audio/Items/Handling/welder_pickup.ogg b/Resources/Audio/Items/Handling/welder_pickup.ogg new file mode 100644 index 00000000000..da78b06b848 Binary files /dev/null and b/Resources/Audio/Items/Handling/welder_pickup.ogg differ diff --git a/Resources/Audio/Items/Handling/wirecutter_drop.ogg b/Resources/Audio/Items/Handling/wirecutter_drop.ogg new file mode 100644 index 00000000000..e099870fc7d Binary files /dev/null and b/Resources/Audio/Items/Handling/wirecutter_drop.ogg differ diff --git a/Resources/Audio/Items/Handling/wirecutter_pickup.ogg b/Resources/Audio/Items/Handling/wirecutter_pickup.ogg new file mode 100644 index 00000000000..078faaf4324 Binary files /dev/null and b/Resources/Audio/Items/Handling/wirecutter_pickup.ogg differ diff --git a/Resources/Audio/Items/Handling/wrench_drop.ogg b/Resources/Audio/Items/Handling/wrench_drop.ogg new file mode 100644 index 00000000000..86020bf822c Binary files /dev/null and b/Resources/Audio/Items/Handling/wrench_drop.ogg differ diff --git a/Resources/Audio/Items/Handling/wrench_pickup.ogg b/Resources/Audio/Items/Handling/wrench_pickup.ogg new file mode 100644 index 00000000000..860e0d70879 Binary files /dev/null and b/Resources/Audio/Items/Handling/wrench_pickup.ogg differ diff --git a/Resources/Audio/Items/Whistle/closet_close.ogg b/Resources/Audio/Items/Whistle/closet_close.ogg new file mode 100644 index 00000000000..124f5d85f5e Binary files /dev/null and b/Resources/Audio/Items/Whistle/closet_close.ogg differ diff --git a/Resources/Audio/Items/Whistle/closet_open.ogg b/Resources/Audio/Items/Whistle/closet_open.ogg new file mode 100644 index 00000000000..86cbcea0d01 Binary files /dev/null and b/Resources/Audio/Items/Whistle/closet_open.ogg differ diff --git a/Resources/Audio/Items/Whistle/phasein.ogg b/Resources/Audio/Items/Whistle/phasein.ogg new file mode 100644 index 00000000000..8b74a7d42fd Binary files /dev/null and b/Resources/Audio/Items/Whistle/phasein.ogg differ diff --git a/Resources/Audio/Items/Whistle/podwoosh.ogg b/Resources/Audio/Items/Whistle/podwoosh.ogg new file mode 100644 index 00000000000..e6fd58c7fc2 Binary files /dev/null and b/Resources/Audio/Items/Whistle/podwoosh.ogg differ diff --git a/Resources/Audio/Lobby/01 The Gamble.ogg b/Resources/Audio/Lobby/01 The Gamble.ogg new file mode 100644 index 00000000000..c1cfdd53850 Binary files /dev/null and b/Resources/Audio/Lobby/01 The Gamble.ogg differ diff --git a/Resources/Audio/Lobby/02 Guilty Pleasures.ogg b/Resources/Audio/Lobby/02 Guilty Pleasures.ogg new file mode 100644 index 00000000000..9a281d19485 Binary files /dev/null and b/Resources/Audio/Lobby/02 Guilty Pleasures.ogg differ diff --git a/Resources/Audio/Lobby/03 Jazzcuzzi.ogg b/Resources/Audio/Lobby/03 Jazzcuzzi.ogg new file mode 100644 index 00000000000..49e7a332050 Binary files /dev/null and b/Resources/Audio/Lobby/03 Jazzcuzzi.ogg differ diff --git a/Resources/Audio/Lobby/04 The Walk.ogg b/Resources/Audio/Lobby/04 The Walk.ogg new file mode 100644 index 00000000000..481b08e650f Binary files /dev/null and b/Resources/Audio/Lobby/04 The Walk.ogg differ diff --git a/Resources/Audio/Lobby/05 Velvet Bossa.ogg b/Resources/Audio/Lobby/05 Velvet Bossa.ogg new file mode 100644 index 00000000000..dcb639de436 Binary files /dev/null and b/Resources/Audio/Lobby/05 Velvet Bossa.ogg differ diff --git a/Resources/Audio/Lobby/06 Colors.ogg b/Resources/Audio/Lobby/06 Colors.ogg new file mode 100644 index 00000000000..83a8d3a3ee2 Binary files /dev/null and b/Resources/Audio/Lobby/06 Colors.ogg differ diff --git a/Resources/Audio/Lobby/07 Midnight Jam.ogg b/Resources/Audio/Lobby/07 Midnight Jam.ogg new file mode 100644 index 00000000000..18e4e8de8a1 Binary files /dev/null and b/Resources/Audio/Lobby/07 Midnight Jam.ogg differ diff --git a/Resources/Audio/Lobby/08 Miles Ahead.ogg b/Resources/Audio/Lobby/08 Miles Ahead.ogg new file mode 100644 index 00000000000..db632e77218 Binary files /dev/null and b/Resources/Audio/Lobby/08 Miles Ahead.ogg differ diff --git a/Resources/Audio/Lobby/09 Moody.ogg b/Resources/Audio/Lobby/09 Moody.ogg new file mode 100644 index 00000000000..29720317d21 Binary files /dev/null and b/Resources/Audio/Lobby/09 Moody.ogg differ diff --git a/Resources/Audio/Lobby/10 Flying Away.ogg b/Resources/Audio/Lobby/10 Flying Away.ogg new file mode 100644 index 00000000000..84bda9db8f7 Binary files /dev/null and b/Resources/Audio/Lobby/10 Flying Away.ogg differ diff --git a/Resources/Audio/Lobby/11 Take It Easy.ogg b/Resources/Audio/Lobby/11 Take It Easy.ogg new file mode 100644 index 00000000000..f305357554d Binary files /dev/null and b/Resources/Audio/Lobby/11 Take It Easy.ogg differ diff --git a/Resources/Audio/Lobby/attributions.yml b/Resources/Audio/Lobby/attributions.yml index e37196494fb..9e777c37d10 100644 --- a/Resources/Audio/Lobby/attributions.yml +++ b/Resources/Audio/Lobby/attributions.yml @@ -1,89 +1,4 @@ -- files: ["434387_Time_Lapse_of_Clouds.ogg"] - license: "CC-BY-3.0" - copyright: "==(Time Lapse of Clouds)== by Buoy" - source: "https://www.newgrounds.com/audio/listen/434387" - -- files: ["a_different_reality_lagoona_remix.xm.ogg"] - license: "CC-BY-4.0" - copyright: "A.D.R (Lagoona rmx) by Andreas Viklund" - source: "https://modarchive.org/index.php?request=view_by_moduleid&query=134786" - -- files: ["aggravated.it.ogg"] - license: "CC-BY-NC-SA-4.0" - copyright: "MEL -Aggravated Assault by melcom" - source: "https://modarchive.org/index.php?request=view_by_moduleid&query=176234" - -- files: ["autumnal_equinox.xm.ogg"] - license: "CC-BY-NC-4.0" - copyright: "Autumnal Equinox by lemonade" - source: "https://modarchive.org/index.php?request=view_by_moduleid&query=143993" - -- files: ["comet_haley.ogg"] +- files: ["01 The Gamble.ogg", "02 Guilty Pleasures.ogg", "03 Jazzcuzzi.ogg", "04 The Walk.ogg", "05 Velvet Bossa.ogg", "06 Colors.ogg", "07 Midnight Jam.ogg", "08 Miles Ahead.ogg", "09 Moody.ogg", "10 Flying Away.ogg", "11 Take It Easy.ogg"] license: "CC-BY-NC-SA-3.0" - copyright: "Comet Haley by Stellardrone. Converted from MP3 to OGG." - source: "https://freemusicarchive.org/music/Stellardrone/Light_Years_1227/07_Comet_Halley" - -- files: ["drozerix_-_alone.xm.ogg"] - license: "Custom" - copyright: "Alone by Drozerix" - source: "https://modarchive.org/index.php?request=view_by_moduleid&query=199968" - -- files: ["drozerix_-_leisurely_voice.xm.ogg"] - license: "Custom" - copyright: "Leisurely Voice by Drozerix" - source: "https://modarchive.org/index.php?request=view_by_moduleid&query=183837" - -- files: ["endless_space.ogg"] - license: "CC-BY-3.0" - copyright: "Endless Space by SolusLunes. Converted from MP3 to OGG." - source: "https://www.newgrounds.com/audio/listen/67583" - -- files: ["marhaba.ogg"] - license: "CC-BY-NC-SA-3.0" - copyright: "Marhaba by Ian Alex Mac. Converted from MP3 to OGG." - source: "https://freemusicarchive.org/music/Ian_Alex_Mac/Cues/Marhaba" - -- files: ["melcom-cyberpunk.it.ogg"] - license: "CC-BY-NC-SA-4.0" - copyright: "MEL -Cyberpunk by melcom" - source: "https://modarchive.org/index.php?request=view_by_moduleid&query=184215" - -- files: ["midori_-_conundrum_final.it.ogg"] - license: "CC-BY-NC-SA-4.0" - copyright: "Conundrum by Midori Mizuno" - source: "https://modarchive.org/index.php?request=view_by_moduleid&query=181705" - -- files: ["mod.flip-flap.ogg"] - license: "Custom" - copyright: "Flip Flap by X-ceed is licensed under a short but clear license (see flip-flap.txt in this directory) and is free for non-commercial use. It was converted from MOD to WAV using Schism Tracker, in 16 Bit, Non-Interpolated mode, no output equalizer settings, Ramp volume at start of sample enabled. From there it was converted to OGG Vorbis with `ffmpeg -i flip-flap.wav -q 2.9 flip-flap-renc.ogg` (quality scale chosen to match size of the OGG file being replaced). Non-interpolated mode was chosen as the module has a high enough sample rate to balance it out, but seems muffled in other interpolation modes. If 'Ramp volume at start of sample' is not enabled, a clicking phenomenon results." - source: "http://aminet.net/package/mods/xceed/Flipflap" - -- files: ["psirius_-_nights_of_orion.xm.ogg"] - license: "CC-BY-NC-SA-4.0" - copyright: "Nights of Orion by Psirius" - source: "https://modarchive.org/index.php?request=view_by_moduleid&query=184962" - -- files: ["psirius_-_nymphs_of_the_forest.mptm.ogg"] - license: "CC-BY-NC-SA-4.0" - copyright: "Nymphs of the forest by Psirius" - source: "https://modarchive.org/index.php?request=view_by_moduleid&query=185545" - -- files: ["hackers.ogg"] - license: "CC-BY-NC-SA-3.0" - copyright: "Hackers by Karl Casey @ White Bat Audio" - source: "https://www.youtube.com/watch?v=k8nHWwO1U2Q" - -- files: ["superposition.ogg"] - license: "CC-BY-NC-3.0" - copyright: "Superposition by Amie Waters" - source: "https://amiewaters.bandcamp.com/track/superposition-2" - -- files: ["every_light_is_blinking_at_once.ogg"] - license: "CC-BY-NC-SA-3.0" - copyright: "every light is blinking at once by Alexander Divine." - source: "https://soundcloud.com/alexanderdivine/every-light-is-blinking-at-once" - -- files: ["DOS=HIGH,_UMB.ogg"] - license: "Custom" - copyright: "DOS=HIGH, UMB by MASTER BOOT RECORD may be used non-commercially in the Delta-V fork of SS14. Converted from FLAC to OGG." - source: "https://masterbootrecord.bandcamp.com/album/c-edit-config-sys" + copyright: "All songs used are produced by Danya Vodovoz, royalty free." + source: "https://soundcloud.com/danyavodovoz" diff --git a/Resources/Audio/Machines/AI/borg_death.ogg b/Resources/Audio/Machines/AI/borg_death.ogg new file mode 100644 index 00000000000..9f6d1861904 Binary files /dev/null and b/Resources/Audio/Machines/AI/borg_death.ogg differ diff --git a/Resources/Audio/Machines/machine_vend.ogg b/Resources/Audio/Machines/machine_vend.ogg index 8f7c187d0c3..92867a1f3d3 100644 Binary files a/Resources/Audio/Machines/machine_vend.ogg and b/Resources/Audio/Machines/machine_vend.ogg differ diff --git a/Resources/Audio/Music/attributions.yml b/Resources/Audio/Music/attributions.yml new file mode 100644 index 00000000000..c1ed2f1027f --- /dev/null +++ b/Resources/Audio/Music/attributions.yml @@ -0,0 +1,4 @@ +- files: ["deadling.ogg"] + license: "CC-BY-3.0" + copyright: "Created by Bolgarich" + source: "https://youtu.be/q7_NFEeeEac" diff --git a/Resources/Audio/Music/deadline.ogg b/Resources/Audio/Music/deadline.ogg new file mode 100644 index 00000000000..6ab081fc236 Binary files /dev/null and b/Resources/Audio/Music/deadline.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Equip/toolbelt_equip.ogg b/Resources/Audio/SimpleStation14/Items/Equip/toolbelt_equip.ogg new file mode 100644 index 00000000000..0ef67a3fd6c Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Equip/toolbelt_equip.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/ammobox_drop.ogg b/Resources/Audio/SimpleStation14/Items/Handling/ammobox_drop.ogg new file mode 100644 index 00000000000..13fce70fe3d Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/ammobox_drop.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/ammobox_pickup.ogg b/Resources/Audio/SimpleStation14/Items/Handling/ammobox_pickup.ogg new file mode 100644 index 00000000000..9532a7697b9 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/ammobox_pickup.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/book_drop.ogg b/Resources/Audio/SimpleStation14/Items/Handling/book_drop.ogg new file mode 100644 index 00000000000..b492b665f59 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/book_drop.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/book_pickup.ogg b/Resources/Audio/SimpleStation14/Items/Handling/book_pickup.ogg new file mode 100644 index 00000000000..120a4e4721a Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/book_pickup.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/cardboardbox_drop.ogg b/Resources/Audio/SimpleStation14/Items/Handling/cardboardbox_drop.ogg new file mode 100644 index 00000000000..7070ba1c342 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/cardboardbox_drop.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/cardboardbox_pickup.ogg b/Resources/Audio/SimpleStation14/Items/Handling/cardboardbox_pickup.ogg new file mode 100644 index 00000000000..aa4e72129b0 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/cardboardbox_pickup.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/cloth_drop.ogg b/Resources/Audio/SimpleStation14/Items/Handling/cloth_drop.ogg new file mode 100644 index 00000000000..5bf734caba0 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/cloth_drop.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/cloth_pickup.ogg b/Resources/Audio/SimpleStation14/Items/Handling/cloth_pickup.ogg new file mode 100644 index 00000000000..f46988887d1 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/cloth_pickup.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/component_drop.ogg b/Resources/Audio/SimpleStation14/Items/Handling/component_drop.ogg new file mode 100644 index 00000000000..95ba2591a31 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/component_drop.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/component_pickup.ogg b/Resources/Audio/SimpleStation14/Items/Handling/component_pickup.ogg new file mode 100644 index 00000000000..fee7dd9d29f Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/component_pickup.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/crowbar_drop.ogg b/Resources/Audio/SimpleStation14/Items/Handling/crowbar_drop.ogg new file mode 100644 index 00000000000..77464110661 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/crowbar_drop.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/crowbar_pickup.ogg b/Resources/Audio/SimpleStation14/Items/Handling/crowbar_pickup.ogg new file mode 100644 index 00000000000..79b276f8451 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/crowbar_pickup.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/disk_drop.ogg b/Resources/Audio/SimpleStation14/Items/Handling/disk_drop.ogg new file mode 100644 index 00000000000..3174b88117f Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/disk_drop.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/disk_pickup.ogg b/Resources/Audio/SimpleStation14/Items/Handling/disk_pickup.ogg new file mode 100644 index 00000000000..8f67406a5fb Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/disk_pickup.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg b/Resources/Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg new file mode 100644 index 00000000000..43bb732db3d Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/drinkglass_pickup.ogg b/Resources/Audio/SimpleStation14/Items/Handling/drinkglass_pickup.ogg new file mode 100644 index 00000000000..fcd1c7d3126 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/drinkglass_pickup.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/matchbox_drop.ogg b/Resources/Audio/SimpleStation14/Items/Handling/matchbox_drop.ogg new file mode 100644 index 00000000000..8e4e276c9e1 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/matchbox_drop.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/matchbox_pickup.ogg b/Resources/Audio/SimpleStation14/Items/Handling/matchbox_pickup.ogg new file mode 100644 index 00000000000..82c23410e11 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/matchbox_pickup.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/multitool_drop.ogg b/Resources/Audio/SimpleStation14/Items/Handling/multitool_drop.ogg new file mode 100644 index 00000000000..67e0a41042c Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/multitool_drop.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/multitool_pickup.ogg b/Resources/Audio/SimpleStation14/Items/Handling/multitool_pickup.ogg new file mode 100644 index 00000000000..cbd598ce896 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/multitool_pickup.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/paper_drop.ogg b/Resources/Audio/SimpleStation14/Items/Handling/paper_drop.ogg new file mode 100644 index 00000000000..27ce2b3d1a7 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/paper_drop.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/paper_pickup.ogg b/Resources/Audio/SimpleStation14/Items/Handling/paper_pickup.ogg new file mode 100644 index 00000000000..55ae2b3d2db Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/paper_pickup.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/screwdriver_drop.ogg b/Resources/Audio/SimpleStation14/Items/Handling/screwdriver_drop.ogg new file mode 100644 index 00000000000..cca91f4dddd Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/screwdriver_drop.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/screwdriver_pickup.ogg b/Resources/Audio/SimpleStation14/Items/Handling/screwdriver_pickup.ogg new file mode 100644 index 00000000000..6f6b29ddfc9 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/screwdriver_pickup.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/sword_sheath.ogg b/Resources/Audio/SimpleStation14/Items/Handling/sword_sheath.ogg new file mode 100644 index 00000000000..9e1d5cdc009 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/sword_sheath.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/sword_unsheath.ogg b/Resources/Audio/SimpleStation14/Items/Handling/sword_unsheath.ogg new file mode 100644 index 00000000000..09867f5966a Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/sword_unsheath.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/toolbelt_drop.ogg b/Resources/Audio/SimpleStation14/Items/Handling/toolbelt_drop.ogg new file mode 100644 index 00000000000..2a3c4655c49 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/toolbelt_drop.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/toolbelt_pickup.ogg b/Resources/Audio/SimpleStation14/Items/Handling/toolbelt_pickup.ogg new file mode 100644 index 00000000000..58e5d25979a Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/toolbelt_pickup.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/toolbox_drop.ogg b/Resources/Audio/SimpleStation14/Items/Handling/toolbox_drop.ogg new file mode 100644 index 00000000000..abf56946278 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/toolbox_drop.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/toolbox_pickup.ogg b/Resources/Audio/SimpleStation14/Items/Handling/toolbox_pickup.ogg new file mode 100644 index 00000000000..01a4ab4b3fa Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/toolbox_pickup.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/welder_drop.ogg b/Resources/Audio/SimpleStation14/Items/Handling/welder_drop.ogg new file mode 100644 index 00000000000..58b722ad7a7 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/welder_drop.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/welder_pickup.ogg b/Resources/Audio/SimpleStation14/Items/Handling/welder_pickup.ogg new file mode 100644 index 00000000000..da78b06b848 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/welder_pickup.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/wirecutter_drop.ogg b/Resources/Audio/SimpleStation14/Items/Handling/wirecutter_drop.ogg new file mode 100644 index 00000000000..e099870fc7d Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/wirecutter_drop.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/wirecutter_pickup.ogg b/Resources/Audio/SimpleStation14/Items/Handling/wirecutter_pickup.ogg new file mode 100644 index 00000000000..078faaf4324 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/wirecutter_pickup.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/wrench_drop.ogg b/Resources/Audio/SimpleStation14/Items/Handling/wrench_drop.ogg new file mode 100644 index 00000000000..86020bf822c Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/wrench_drop.ogg differ diff --git a/Resources/Audio/SimpleStation14/Items/Handling/wrench_pickup.ogg b/Resources/Audio/SimpleStation14/Items/Handling/wrench_pickup.ogg new file mode 100644 index 00000000000..860e0d70879 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Items/Handling/wrench_pickup.ogg differ diff --git a/Resources/Audio/SimpleStation14/Machines/machine_vend.ogg b/Resources/Audio/SimpleStation14/Machines/machine_vend.ogg new file mode 100644 index 00000000000..92867a1f3d3 Binary files /dev/null and b/Resources/Audio/SimpleStation14/Machines/machine_vend.ogg differ diff --git a/Resources/Audio/SimpleStation14/Weapons/Melee/banjohit.ogg b/Resources/Audio/SimpleStation14/Weapons/Melee/banjohit.ogg new file mode 100644 index 00000000000..06a86a535dd Binary files /dev/null and b/Resources/Audio/SimpleStation14/Weapons/Melee/banjohit.ogg differ diff --git a/Resources/Audio/SimpleStation14/Weapons/Melee/rapierhit.ogg b/Resources/Audio/SimpleStation14/Weapons/Melee/rapierhit.ogg new file mode 100644 index 00000000000..401fcf9677c Binary files /dev/null and b/Resources/Audio/SimpleStation14/Weapons/Melee/rapierhit.ogg differ diff --git a/Resources/Audio/Voice/Slime/slime_crackleslap.ogg b/Resources/Audio/Voice/Slime/slime_crackleslap.ogg new file mode 100644 index 00000000000..c9fcfbee448 Binary files /dev/null and b/Resources/Audio/Voice/Slime/slime_crackleslap.ogg differ diff --git a/Resources/Audio/Voice/Slime/slime_laugh_f1.ogg b/Resources/Audio/Voice/Slime/slime_laugh_f1.ogg new file mode 100644 index 00000000000..4b3b36810f3 Binary files /dev/null and b/Resources/Audio/Voice/Slime/slime_laugh_f1.ogg differ diff --git a/Resources/Audio/Voice/Slime/slime_laugh_m1.ogg b/Resources/Audio/Voice/Slime/slime_laugh_m1.ogg new file mode 100644 index 00000000000..7ad1ba95dae Binary files /dev/null and b/Resources/Audio/Voice/Slime/slime_laugh_m1.ogg differ diff --git a/Resources/Audio/Voice/Slime/slime_laugh_m2.ogg b/Resources/Audio/Voice/Slime/slime_laugh_m2.ogg new file mode 100644 index 00000000000..0d08e954523 Binary files /dev/null and b/Resources/Audio/Voice/Slime/slime_laugh_m2.ogg differ diff --git a/Resources/Audio/Voice/Slime/slime_schlorp.ogg b/Resources/Audio/Voice/Slime/slime_schlorp.ogg new file mode 100644 index 00000000000..f125fbc03b0 Binary files /dev/null and b/Resources/Audio/Voice/Slime/slime_schlorp.ogg differ diff --git a/Resources/Audio/Voice/Slime/slime_scream_f1.ogg b/Resources/Audio/Voice/Slime/slime_scream_f1.ogg new file mode 100644 index 00000000000..99f8e7f91fa Binary files /dev/null and b/Resources/Audio/Voice/Slime/slime_scream_f1.ogg differ diff --git a/Resources/Audio/Voice/Slime/slime_scream_f2.ogg b/Resources/Audio/Voice/Slime/slime_scream_f2.ogg new file mode 100644 index 00000000000..71ea5f4bdce Binary files /dev/null and b/Resources/Audio/Voice/Slime/slime_scream_f2.ogg differ diff --git a/Resources/Audio/Voice/Slime/slime_scream_m1.ogg b/Resources/Audio/Voice/Slime/slime_scream_m1.ogg new file mode 100644 index 00000000000..67f4734bcf4 Binary files /dev/null and b/Resources/Audio/Voice/Slime/slime_scream_m1.ogg differ diff --git a/Resources/Audio/Voice/Slime/slime_scream_m2.ogg b/Resources/Audio/Voice/Slime/slime_scream_m2.ogg new file mode 100644 index 00000000000..bc499bad782 Binary files /dev/null and b/Resources/Audio/Voice/Slime/slime_scream_m2.ogg differ diff --git a/Resources/Audio/Voice/Slime/slime_squish.ogg b/Resources/Audio/Voice/Slime/slime_squish.ogg index 60e118e217b..e7c3509c4d8 100644 Binary files a/Resources/Audio/Voice/Slime/slime_squish.ogg and b/Resources/Audio/Voice/Slime/slime_squish.ogg differ diff --git a/Resources/Audio/Weapons/Melee/banjohit.ogg b/Resources/Audio/Weapons/Melee/banjohit.ogg new file mode 100644 index 00000000000..06a86a535dd Binary files /dev/null and b/Resources/Audio/Weapons/Melee/banjohit.ogg differ diff --git a/Resources/Audio/Weapons/Melee/rapierhit.ogg b/Resources/Audio/Weapons/Melee/rapierhit.ogg new file mode 100644 index 00000000000..401fcf9677c Binary files /dev/null and b/Resources/Audio/Weapons/Melee/rapierhit.ogg differ diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d0b3206f26d..e357069c73b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4126,3 +4126,420 @@ Entries: message: Resprited gas tanks id: 6116 time: '2024-05-31T00:13:45.0000000+00:00' +- author: LovelyLophi + changes: + - type: Add + message: Added five new coats + - type: Add + message: Added loadouts + - type: Fix + message: Fixed the coat handhole + id: 6117 + time: '2024-06-02T00:36:59.0000000+00:00' +- author: FoxxoTrystan + changes: + - type: Tweak + message: Floors Looks Updated/Resprited. + id: 6118 + time: '2024-06-03T19:23:51.0000000+00:00' +- author: FoxxoTrystan + changes: + - type: Add + message: All species can now bring their own cultures and languages + id: 6119 + time: '2024-06-10T20:48:48.0000000+00:00' +- author: FoxxoTrystan + changes: + - type: Tweak + message: Rust Walls Sprites. + - type: Tweak + message: Armor, Bulletproof, Riot Suit Resprites. + - type: Tweak + message: New Banners Sprites. + - type: Tweak + message: Stunbaton, Fire Extinguisher New Sprites. + - type: Tweak + message: Rack/WallScreen resprites. + - type: Tweak + message: Stock Parts new sprites! + - type: Tweak + message: Radiation Collector has now a new sprite! + id: 6120 + time: '2024-06-11T00:34:02.0000000+00:00' +- author: DEATHB4DEFEAT + changes: + - type: Tweak + message: >- + UI layout now defaults to separated, the old one is still available in + settings + id: 6121 + time: '2024-06-16T22:38:10.0000000+00:00' +- author: DEATHB4DEFEAT + changes: + - type: Tweak + message: Space has suddenly become less dense (objects don't slow down in space) + - type: Remove + message: Moths are unable to move in space + - type: Tweak + message: Moths have way better control in zero gravity environments + id: 6122 + time: '2024-06-17T07:58:34.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + Added station goals that get sent to the Command fax machine at the + start of every shift + id: 6123 + time: '2024-06-17T21:42:13.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: Peacock Tails have been added for Harpies + id: 6124 + time: '2024-06-20T22:07:29.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + NanoTrasen has disabled the unneeded safeties on your guns- Make sure + you're careful with them! + - type: Tweak + message: >- + All Firearms now have a reliability stat, some are more reliable than + others. The more reliable a weapon is, the less likely it is to + accidentally discharge when yeeted. + id: 6125 + time: '2024-06-20T22:17:03.0000000+00:00' +- author: DEATHB4DEFEAT + changes: + - type: Add + message: Animals will no longer be a silent, soulless shell + id: 6126 + time: '2024-06-20T22:24:30.0000000+00:00' +- author: DEATHB4DEFEAT + changes: + - type: Add + message: Added trait points + - type: Add + message: Added categories for traits + id: 6127 + time: '2024-06-20T23:39:31.0000000+00:00' +- author: LovelyLophi + changes: + - type: Remove + message: Removed Wizden patrons + id: 6128 + time: '2024-06-25T19:54:47.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + Harpies remembered that just like moths; they also have wings, and can + zoom whenever the gravity turns off. + id: 6129 + time: '2024-06-25T20:19:11.0000000+00:00' +- author: DEATHB4DEFEAT + changes: + - type: Tweak + message: Mid-round events will occur much less often + id: 6130 + time: '2024-06-25T20:47:09.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: 'Height and Width sliders have been added to character creation. ' + id: 6131 + time: '2024-06-27T17:46:51.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Add + message: Most items now take time to equip and unequip, especially space suits. + id: 6132 + time: '2024-06-30T18:22:28.0000000+00:00' +- author: VMSolidus + changes: + - type: Fix + message: >- + Spent bullet casings now fly away from a shooter in a cinematic manner, + rather than fall at their feet. + id: 6133 + time: '2024-07-01T22:37:29.0000000+00:00' +- author: WarMechanic + changes: + - type: Fix + message: Fixed loadouts becoming uneditable after spending all your points + id: 6134 + time: '2024-07-02T07:18:27.0000000+00:00' +- author: deltanedas + changes: + - type: Add + message: >- + Security can find the new SecWatch™ app in their PDAs to see current + suspects and wanted criminals. + id: 6135 + time: '2024-07-02T08:01:36.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Fix + message: Equipping clothing using the Z key works correctly again. + id: 6136 + time: '2024-07-03T19:48:29.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Tweak + message: >- + Space stations now have a tiny bit of velocity dampening to prevent them + from being flunged into the void. + id: 6137 + time: '2024-07-05T16:53:25.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Fix + message: Carrying is less likely to behave erratically or suddenly interrupt now. + - type: Add + message: >- + You can now see when someone is trying to pick you up, and also you can + interrupt your attempt at escaping from their hands or inventory. + - type: Add + message: You can now properly take Felinids out of bags and place them inside. + - type: Add + message: Scientists have discovered that Felinids can sleep in bags. + id: 6138 + time: '2024-07-05T17:28:44.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Add + message: You can now sign paper by alt-clicking it while holding a pen. + id: 6139 + time: '2024-07-05T17:33:39.0000000+00:00' +- author: WarMechanic + changes: + - type: Add + message: Added the Thievery trait, which provides various soft stripping bonuses + - type: Tweak + message: >- + Felinids no longer have passive thieving gloves, they instead get the + Thievery trait by default + id: 6140 + time: '2024-07-05T17:49:25.0000000+00:00' +- author: Froffy025 + changes: + - type: Add + message: You can now carry most of the station pets. + id: 6141 + time: '2024-07-05T17:49:57.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Fix + message: Job requirements are now displayed correctly. + id: 6142 + time: '2024-07-05T19:10:24.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Tweak + message: >- + Events should now occur as frequently as before. Note: server owner can + configure the frequency on their server manually. + id: 6143 + time: '2024-07-05T21:03:28.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + The catalog of items available via Loadouts has been greatly expanded. + Have fun customizing your characters! + id: 6144 + time: '2024-07-05T22:53:36.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Tweak + message: Translator implants are now proper implants that can be removed. + - type: Tweak + message: Animalistic languages should now look less messy. + - type: Fix + message: Hopefully fixed language menu desync and other issues. + id: 6145 + time: '2024-07-05T23:49:47.0000000+00:00' +- author: Spatison + changes: + - type: Add + message: Added system + id: 6146 + time: '2024-07-06T00:19:35.0000000+00:00' +- author: Velcroboy + changes: + - type: Tweak + message: Changed asteroids to have more ore...and some danger + id: 6147 + time: '2024-07-08T07:03:39.0000000+00:00' +- author: FoxxoTrystan + changes: + - type: Add + message: Languages are now marked in the chat! + id: 6148 + time: '2024-07-09T19:01:38.0000000+00:00' +- author: Spatison + changes: + - type: Fix + message: Food and handcuffs can now be given + id: 6149 + time: '2024-07-09T19:32:11.0000000+00:00' +- author: FoxxoTrrystan + changes: + - type: Tweak + message: >- + Power Resprites! (New SMES, APC, Airlarm, Camera, Substation, LightTube, + Intercom, FireAlarm and Substation) + id: 6150 + time: '2024-07-09T19:37:03.0000000+00:00' +- author: CodedCrow + changes: + - type: Add + message: Added an Arachne plushie + id: 6151 + time: '2024-07-11T17:23:58.0000000+00:00' +- author: osjarw + changes: + - type: Add + message: Wallmount substation electronics can now be created at an autolathe. + id: 6152 + time: '2024-07-11T17:24:30.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Tweak + message: 'Players can now vote on two more gamemodes: Traitors and Hellshift.' + id: 6153 + time: '2024-07-11T17:26:41.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Add + message: >- + Added two new foreigner traits that make your character unable to speak + Galactic Common and give you a translator instead. + - type: Tweak + message: >- + Translators can now be equipped in the neck slot and display useful info + when examined. + id: 6154 + time: '2024-07-12T01:19:09.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Fix + message: Foreigner traits now work correctly. + id: 6155 + time: '2024-07-12T17:46:37.0000000+00:00' +- author: WarMechanic + changes: + - type: Add + message: >- + Added the Heavyweight Drunk trait, which doubles your alcoholism + potential. + id: 6156 + time: '2024-07-12T19:02:15.0000000+00:00' +- author: DEATHB4DEFEAT + changes: + - type: Add + message: Added 4 new announcers that will randomly be selected every shift + id: 6157 + time: '2024-07-12T20:13:50.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: 'Mass Contests have returned in a new reworked form. ' + - type: Add + message: >- + Weapon Recoil is now resisted by character mass. More massive characters + take less recoil, less massive characters take more recoil. + - type: Add + message: >- + Disarm and Shove actions are now modified by relative character mass. It + is easier to shove people around if you're bigger than them. + - type: Add + message: >- + Cablecuffs and Zipties are now easier to escape out of if you're + smaller. + id: 6158 + time: '2024-07-13T08:05:52.0000000+00:00' +- author: FoxxoTrystan + changes: + - type: Tweak + message: We got new ID Cards the old ones were soo tiny that they were lost. + id: 6159 + time: '2024-07-14T23:12:33.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Tweak + message: >- + Shock collars can now be manufactured in the security techfab. They also + deal less damage and ignore insulated gloves. + id: 6160 + time: '2024-07-14T23:14:03.0000000+00:00' +- author: WarMechanic + changes: + - type: Fix + message: Fixed thieving trait not granting pocket vision + id: 6161 + time: '2024-07-16T17:41:42.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: Many new sound effects have been implemented for items. + id: 6162 + time: '2024-07-16T17:52:03.0000000+00:00' +- author: gluesniffler + changes: + - type: Add + message: Added a new icon to the offer item interaction. + - type: Fix + message: Fixed typos in the offer item prompts. + id: 6163 + time: '2024-07-16T18:18:18.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Add + message: You can now configure your zoom more precisely. + id: 6164 + time: '2024-07-16T18:18:57.0000000+00:00' +- author: dootythefrooty + changes: + - type: Add + message: Added Harpy Wings as a delicious dish. + id: 6165 + time: '2024-07-16T18:21:27.0000000+00:00' +- author: gluesniffler + changes: + - type: Add + message: Added an alert on the UI for when the user is walking or running. + id: 6166 + time: '2024-07-16T21:39:46.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Add + message: >- + You can now lie down and stand up at will! The default keybind for it is + "R", but it can be changed in settings. + id: 6167 + time: '2024-07-18T02:33:16.0000000+00:00' +- author: VMSolidus + changes: + - type: Fix + message: >- + Harpies can no longer buy Loadout items that are impossible for them to + wear due to having digitigrade legs. + id: 6168 + time: '2024-07-18T02:34:52.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Fix + message: Foreigner translator should now consume power, as intended. + id: 6169 + time: '2024-07-18T08:22:52.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + Atmospheric "Throws" are now calculated using object mass, and behave + accordingly. Tiny objects will shoot out of rooms quite fast! + id: 6170 + time: '2024-07-18T08:24:58.0000000+00:00' diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index db58663a2b2..0cf9c113634 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -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, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, ColdAutumnRain, Colin-Tel, 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, Delete69, deltanedas, DeltaV-Bot, DerbyX, 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, Guess-My-Name, 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, 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, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, Subversionary, SweptWasTaken, Szunti, TadJohnson00, 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, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem +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, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CaasGit, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, CodedCrow, ColdAutumnRain, Colin-Tel, 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, Delete69, deltanedas, DeltaV-Bot, DerbyX, 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, FoxxoTrystan, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, geraeumig, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, Guess-My-Name, 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, 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, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Mnemotechnician, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, Theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, WarMechanic, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem diff --git a/Resources/Credits/Patrons.yml b/Resources/Credits/Patrons.yml index ff98e134cec..e6be63f6774 100644 --- a/Resources/Credits/Patrons.yml +++ b/Resources/Credits/Patrons.yml @@ -1,58 +1,2 @@ -- Name: "weirdrock" - Tier: Captain -- Name: "Drifter Drifter" - Tier: Captain -- Name: "Bikowu" - Tier: Assistant -- Name: "Hasan al-Binabi" - Tier: Central Commander -- Name: "lleft The Dragon" - Tier: Central Commander -- Name: "Pandaconda" - Tier: Assistant -- Name: "Lazhannya" - Tier: Captain -- Name: "Bonktrauma" - Tier: Captain -- Name: "Haltell" - Tier: Captain -- Name: "Delta.Pizza" - Tier: Captain -- Name: "steph kaus" - Tier: Captain -- Name: "HyperionGM" - Tier: Central Commander -- Name: "MikeAndIkes" - Tier: Assistant -- Name: "Ashley" - Tier: Central Commander -- Name: "mura" - Tier: Captain -- Name: "Adeinitas" - Tier: Captain -- Name: "Shock" - Tier: Captain -- Name: "Dead Rabbit" - Tier: Captain -- Name: "T-Dog" - Tier: Captain -- Name: "oBerry" - Tier: Central Commander -- Name: "Wakefield" - Tier: Captain -- Name: "Hûvy" - Tier: Assistant -- Name: "TheGungeonologist" - Tier: Central Commander -- Name: "Ethan" - Tier: Captain -- Name: "TeeJay Neuroth" - Tier: Captain -- Name: "Neptunia_Counseling" - Tier: Central Commander -- Name: "rosysyntax" - Tier: Assistant -- Name: "Kurzaen" - Tier: Captain -- Name: "tokie" - Tier: Central Commander +#- Name: "nameinquotes" +# Tier: teirnotinquotes diff --git a/Resources/Fonts/Copperplate.otf b/Resources/Fonts/Copperplate.otf new file mode 100644 index 00000000000..40d45aa46b6 Binary files /dev/null and b/Resources/Fonts/Copperplate.otf differ diff --git a/Resources/Fonts/Mangat.ttf b/Resources/Fonts/Mangat.ttf new file mode 100644 index 00000000000..de4c11beba5 Binary files /dev/null and b/Resources/Fonts/Mangat.ttf differ diff --git a/Resources/Fonts/Noganas.ttf b/Resources/Fonts/Noganas.ttf new file mode 100644 index 00000000000..afa0c82f03e Binary files /dev/null and b/Resources/Fonts/Noganas.ttf differ diff --git a/Resources/Fonts/RubikBubbles.ttf b/Resources/Fonts/RubikBubbles.ttf new file mode 100644 index 00000000000..a653715c6cd Binary files /dev/null and b/Resources/Fonts/RubikBubbles.ttf differ diff --git a/Resources/Locale/en-US/actions/actions/sleep.ftl b/Resources/Locale/en-US/actions/actions/sleep.ftl index fd833fd4a5c..6188e1639fe 100644 --- a/Resources/Locale/en-US/actions/actions/sleep.ftl +++ b/Resources/Locale/en-US/actions/actions/sleep.ftl @@ -5,3 +5,5 @@ sleep-examined = [color=lightblue]{CAPITALIZE(SUBJECT($target))} {CONJUGATE-BE($ wake-other-success = You shake {THE($target)} awake. wake-other-failure = You shake {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BE($target)} not waking up. + +popup-sleep-in-bag = {THE($entity)} curls up and falls asleep. diff --git a/Resources/Locale/en-US/administration/commands/stealthmin-command.ftl b/Resources/Locale/en-US/administration/commands/stealthmin-command.ftl new file mode 100644 index 00000000000..4fb5e521057 --- /dev/null +++ b/Resources/Locale/en-US/administration/commands/stealthmin-command.ftl @@ -0,0 +1,3 @@ +cmd-stealthmin-desc = Toggle whether others can see you in adminwho. +cmd-stealthmin-help = Usage: stealthmin\nUse stealthmin to toggle whether you appear in the output of the adminwho command. +cmd-stealthmin-no-console = You cannot use this command from the server console. diff --git a/Resources/Locale/en-US/administration/managers/admin-manager.ftl b/Resources/Locale/en-US/administration/managers/admin-manager.ftl index b1bbcc4c8c1..b70f550fc37 100644 --- a/Resources/Locale/en-US/administration/managers/admin-manager.ftl +++ b/Resources/Locale/en-US/administration/managers/admin-manager.ftl @@ -6,4 +6,8 @@ admin-manager-no-longer-admin-message = You are no longer an admin. admin-manager-admin-permissions-updated-message = Your admin permission have been updated. admin-manager-admin-logout-message = Admin logout: {$name} admin-manager-admin-login-message = Admin login: {$name} -admin-manager-admin-data-host-title = Host \ No newline at end of file +admin-manager-admin-data-host-title = Host +admin-manager-stealthed-message = You are now a hidden admin. +admin-manager-unstealthed-message = You are no longer hidden. +admin-manager-self-enable-stealth = {$stealthAdminName} is now hidden. +admin-manager-self-disable-stealth = {$exStealthAdminName} is no longer hidden. diff --git a/Resources/Locale/en-US/advertisements/vending/bay12Vendors.ftl b/Resources/Locale/en-US/advertisements/vending/bay12Vendors.ftl new file mode 100644 index 00000000000..fbdcfa5a39f --- /dev/null +++ b/Resources/Locale/en-US/advertisements/vending/bay12Vendors.ftl @@ -0,0 +1,23 @@ +advertisement-solsnack-1 = We cut all the red-tape so that you can have diarrhea! +advertisement-solsnack-2 = Food safety standards are merely a suggestion if you know the right people! +advertisement-solsnack-3 = Snacks from home, corruption included! +advertisement-solsnack-4 = A taste of home! + +advertisement-weebvend-1 = Konnichiwa gaijin senpai! +advertisement-weebvend-2 = Notice me senpai! +advertisement-weebvend-3 = Kawaii-desu! + +advertisement-hotfood-1 = Get your stale, crumbling food here! Sol's national dish has never tasted better! +advertisement-hotfood-2 = If this is the food waiting for you at home, it's no wonder you're hiding here. +advertisement-hotfood-3 = Solarian food products, served with a side of diarrhea as always! +advertisement-hotfood-4 = Revenge is a dish best served warm. + +advertisement-fitness-1 = SweatMAX, get robust! +advertisement-fitness-2 = Pain is just weakness leaving the body! +advertisement-fitness-3 = Run! Your fat is catching up to you! +advertisement-fitness-4 = Never forget leg day! +advertisement-fitness-5 = Push out! +advertisement-fitness-6 = This is the only break you get today. +advertisement-fitness-7 = Don't cry, sweat! +advertisement-fitness-8 = Healthy is an outfit that looks good on everybody. +advertisement-fitness-9 = Want to hide from the Solarian authorities? Don't worry, they don't know what the inside of a gym looks like. \ No newline at end of file diff --git a/Resources/Locale/en-US/alerts/alerts.ftl b/Resources/Locale/en-US/alerts/alerts.ftl index 795d740141b..ff2c0d9ee29 100644 --- a/Resources/Locale/en-US/alerts/alerts.ftl +++ b/Resources/Locale/en-US/alerts/alerts.ftl @@ -110,3 +110,9 @@ alerts-revenant-essence-desc = The power of souls. It sustains you and is used f alerts-revenant-corporeal-name = Corporeal alerts-revenant-corporeal-desc = You have manifested physically. People around you can see and hurt you. + +alerts-walking-name = Walking +alerts-walking-desc = Indicates how fast you're moving. + +alerts-offer-name = Offer +alerts-offer-desc = Someone offers you an item. diff --git a/Resources/Locale/en-US/announcements/announcers/announcers.ftl b/Resources/Locale/en-US/announcements/announcers/announcers.ftl new file mode 100644 index 00000000000..d18857a38e2 --- /dev/null +++ b/Resources/Locale/en-US/announcements/announcers/announcers.ftl @@ -0,0 +1,5 @@ +announcer-Intern-name=Central Command +announcer-MedBot-name=Automated +announcer-Michael-name=Michael +announcer-NEIL-name=N.E.I.L. +announcer-VoxFem-name=Automated diff --git a/Resources/Locale/en-US/cargo/bounties.ftl b/Resources/Locale/en-US/cargo/bounties.ftl index 63c68de1053..b332517c70d 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/chat/managers/chat-manager.ftl b/Resources/Locale/en-US/chat/managers/chat-manager.ftl index fab815b4f90..2c8b326b076 100644 --- a/Resources/Locale/en-US/chat/managers/chat-manager.ftl +++ b/Resources/Locale/en-US/chat/managers/chat-manager.ftl @@ -21,11 +21,11 @@ chat-manager-whisper-headset-on-message = You can't whisper on the radio! chat-manager-server-wrap-message = [bold]{$message}[/bold] chat-manager-sender-announcement-wrap-message = [font size=14][bold]{$sender} Announcement:[/font][font size=12] {$message}[/bold][/font] -chat-manager-entity-say-wrap-message = [BubbleHeader][Name]{$entityName}[/Name][/BubbleHeader] {$verb}, [font={$fontType} size={$fontSize}]"[BubbleContent]{$message}[/BubbleContent]"[/font] -chat-manager-entity-say-bold-wrap-message = [BubbleHeader][Name]{$entityName}[/Name][/BubbleHeader] {$verb}, [font={$fontType} size={$fontSize}]"[BubbleContent][bold]{$message}[/bold][/BubbleContent]"[/font] +chat-manager-entity-say-wrap-message = [BubbleHeader][Name]{$entityName}[/Name][/BubbleHeader] {$verb}, [font="{$fontType}" size={$fontSize}]"[color={$color}][BubbleContent]{$message}[/BubbleContent][/color]"[/font] +chat-manager-entity-say-bold-wrap-message = [BubbleHeader][Name]{$entityName}[/Name][/BubbleHeader] {$verb}, [font="{$fontType}" size={$fontSize}]"[color={$color}][BubbleContent][bold]{$message}[/bold][/BubbleContent][/color]"[/font] -chat-manager-entity-whisper-wrap-message = [font size=11][italic][BubbleHeader][Name]{$entityName}[/Name][/BubbleHeader] whispers,"[BubbleContent]{$message}[/BubbleContent]"[/italic][/font] -chat-manager-entity-whisper-unknown-wrap-message = [font size=11][italic][BubbleHeader]Someone[/BubbleHeader] whispers, "[BubbleContent]{$message}[/BubbleContent]"[/italic][/font] +chat-manager-entity-whisper-wrap-message = [font size=11][italic][BubbleHeader][Name]{$entityName}[/Name][/BubbleHeader] whispers,"[color={$color}][BubbleContent]{$message}[/BubbleContent][/color]"[/italic][/font] +chat-manager-entity-whisper-unknown-wrap-message = [font size=11][italic][BubbleHeader]Someone[/BubbleHeader] whispers, "[color={$color}][BubbleContent]{$message}[/BubbleContent][/color]"[/italic][/font] # THE() is not used here because the entity and its name can technically be disconnected if a nameOverride is passed... chat-manager-entity-me-wrap-message = [italic]{ PROPER($entity) -> diff --git a/Resources/Locale/en-US/customization/character-requirements.ftl b/Resources/Locale/en-US/customization/character-requirements.ftl new file mode 100644 index 00000000000..efa1b7e7677 --- /dev/null +++ b/Resources/Locale/en-US/customization/character-requirements.ftl @@ -0,0 +1,39 @@ +character-age-requirement = You must {$inverted -> + [true] not be + *[other] be +} be within [color=yellow]{$min}[/color] and [color=yellow]{$max}[/color] years old +character-species-requirement = You must {$inverted -> + [true] not be + *[other] be +} a [color=green]{$species}[/color] +character-trait-requirement = You must {$inverted -> + [true] not have + *[other] have +} one of these traits: [color=lightblue]{$traits}[/color] +character-backpack-type-requirement = You must {$inverted -> + [true] not use + *[other] use +} a [color=lightblue]{$type}[/color] as your bag +character-clothing-preference-requirement = You must {$inverted -> + [true] not wear + *[other] wear +} a [color=lightblue]{$type}[/color] + +character-job-requirement = You must {$inverted -> + [true] not be + *[other] be +} one of these jobs: {$jobs} +character-department-requirement = You must {$inverted -> + [true] not be + *[other] be +} in one of these departments: {$departments} + +character-timer-department-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes of [color={$departmentColor}]{$department}[/color] department playtime +character-timer-department-too-high = You require [color=yellow]{TOSTRING($time, "0")}[/color] fewer minutes in [color={$departmentColor}]{$department}[/color] department +character-timer-overall-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes of playtime +character-timer-overall-too-high = You require [color=yellow]{TOSTRING($time, "0")}[/color] fewer minutes of playtime +character-timer-role-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes with [color={$departmentColor}]{$job}[/color] +character-timer-role-too-high = You require[color=yellow] {TOSTRING($time, "0")}[/color] fewer minutes with [color={$departmentColor}]{$job}[/color] + +character-trait-group-exclusion-requirement = You cannot have one of the following traits if you select this: {$traits} +character-loadout-group-exclusion-requirement = You cannot have one of the following loadouts if you select this: {$loadouts} diff --git a/Resources/Locale/en-US/deltav/cartridge-loader/secwatch.ftl b/Resources/Locale/en-US/deltav/cartridge-loader/secwatch.ftl new file mode 100644 index 00000000000..a5b96eab08f --- /dev/null +++ b/Resources/Locale/en-US/deltav/cartridge-loader/secwatch.ftl @@ -0,0 +1,5 @@ +sec-watch-program-name = SecWatch +sec-watch-title = SecWatch 1.0 +sec-watch-no-entries = Everything's calm. Why not enjoy a Monkin Donut? +sec-watch-entry = {$name}, {$job} +sec-watch-no-reason = None given??? diff --git a/Resources/Locale/en-US/deltav/markings/harpy.ftl b/Resources/Locale/en-US/deltav/markings/harpy.ftl index 3c1a2e3b9b2..871f2f17290 100644 --- a/Resources/Locale/en-US/deltav/markings/harpy.ftl +++ b/Resources/Locale/en-US/deltav/markings/harpy.ftl @@ -40,6 +40,10 @@ marking-HarpyTailRooster-rooster_tail = Tail marking-HarpyTailFinch = Finch Tail marking-HarpyTailFinch-finch_tail = Tail +marking-HarpyTailPeacock = Peacock Tail +marking-HarpyTailPeacock-peacock_tail_feathers = Feathers +marking-HarpyTailPeacock-peacock_tail_eyes = Eyes + marking-HarpyChestDefault = Wing & Groin Under-Clothes marking-HarpyChestDefault-upper = Wing Under-Clothes marking-HarpyChestDefault-lower = Groin Under-Clothes diff --git a/Resources/Locale/en-US/deltav/paper/signature.ftl b/Resources/Locale/en-US/deltav/paper/signature.ftl new file mode 100644 index 00000000000..87741c962c0 --- /dev/null +++ b/Resources/Locale/en-US/deltav/paper/signature.ftl @@ -0,0 +1,5 @@ +paper-sign-verb = Sign + +paper-signed-other = {CAPITALIZE(THE($user))} signs {THE($target)}. +paper-signed-self = You sign {THE($target)}. +paper-signed-failure = You cannot sign {THE($target)} diff --git a/Resources/Locale/en-US/deltav/station-events/events/xeno-vent.ftl b/Resources/Locale/en-US/deltav/station-events/events/xeno-vent.ftl index eebfe1610f9..eb59c8e0a63 100644 --- a/Resources/Locale/en-US/deltav/station-events/events/xeno-vent.ftl +++ b/Resources/Locale/en-US/deltav/station-events/events/xeno-vent.ftl @@ -1 +1 @@ -station-event-xeno-vent-start-announcement = Confirmed sightings of hostile alien wildlife on the station. Personnel are advised to arm themselves, barricade doors, and defend themselves if necessary. Security is advised to eradicate the threat as soon as possible. +station-event-xeno-vents-announcement = Confirmed sightings of hostile alien wildlife on the station. Personnel are advised to arm themselves, barricade doors, and defend themselves if necessary. Security is advised to eradicate the threat as soon as possible. diff --git a/Resources/Locale/en-US/deltav/traits/traits.ftl b/Resources/Locale/en-US/deltav/traits/traits.ftl index e00cec47077..914a5c9f1bc 100644 --- a/Resources/Locale/en-US/deltav/traits/traits.ftl +++ b/Resources/Locale/en-US/deltav/traits/traits.ftl @@ -1,13 +1,13 @@ -trait-scottish-accent-name = Scottish Accent -trait-scottish-accent-desc = Fer tha folk who come frae Hielan clan. +trait-name-ScottishAccent = Scottish Accent +trait-description-ScottishAccent = Fer tha folk who come frae Hielan clan. -trait-ultravision-name = Ultraviolet Vision -trait-ultravision-desc = Whether through custom bionic eyes, random mutation, +trait-name-UltraVision = Ultraviolet Vision +trait-description-UltraVision = Whether through custom bionic eyes, random mutation, or being a Harpy, you perceive the world with ultraviolet light. -trait-deuteranopia-name = Deuteranopia -trait-deuteranopia-desc = Whether through custom bionic eyes, random mutation, +trait-name-DogVision = Deuteranopia +trait-description-DogVision = Whether through custom bionic eyes, random mutation, or being a Vulpkanin, you have red–green colour blindness. -trait-uncloneable-name = Uncloneable -trait-uncloneable-desc = Cannot be cloned +trait-name-Uncloneable = Uncloneable +trait-description-Uncloneable = Cannot be cloned diff --git a/Resources/Locale/en-US/door-remote/door-remote.ftl b/Resources/Locale/en-US/door-remote/door-remote.ftl index bf2fc118619..2c4ccd08052 100644 --- a/Resources/Locale/en-US/door-remote/door-remote.ftl +++ b/Resources/Locale/en-US/door-remote/door-remote.ftl @@ -1,3 +1,12 @@ +## UI +door-remote-open-close-text = Opens and Closes Doors +door-remote-toggle-bolt-text = Toggles Bolts +door-remote-emergency-access-text = Toggles Emergency Access +door-remote-invalid-text = Invalid +door-remote-mode-label = Mode: [color=white]{$modeString}[/color] + +## Entity + door-remote-switch-state-open-close = You switch the remote to open and close doors door-remote-switch-state-toggle-bolts = You switch the remote to toggle bolts door-remote-switch-state-toggle-emergency-access = You switch the remote to toggle emergency access diff --git a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl index 46f5df48ad6..23446b2b847 100644 --- a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl +++ b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl @@ -30,6 +30,7 @@ ui-options-ambience-volume = Ambience volume: ui-options-lobby-volume = Lobby & Round-end volume: ui-options-interface-volume = Interface volume: ui-options-ambience-max-sounds = Ambience simultaneous sounds: +ui-options-announcer-volume = Announcer volume: ui-options-lobby-music = Lobby & Round-end Music ui-options-restart-sounds = Round Restart Sounds ui-options-event-music = Event Music @@ -41,6 +42,7 @@ ui-options-volume-percent = { TOSTRING($volume, "P0") } ui-options-show-held-item = Show held item next to cursor ui-options-show-combat-mode-indicators = Show combat mode indicators with cursor +ui-options-show-offer-mode-indicators = Show offer mode indicators with cursor ui-options-opaque-storage-window = Opaque storage window ui-options-show-looc-on-head = Show LOOC chat above characters head ui-options-fancy-speech = Show names in speech bubbles @@ -135,6 +137,8 @@ ui-options-function-examine-entity = Examine ui-options-function-swap-hands = Swap hands ui-options-function-move-stored-item = Move stored item ui-options-function-rotate-stored-item = Rotate stored item +ui-options-function-offer-item = Offer something +ui-options-function-toggle-standing = Toggle standing ui-options-static-storage-ui = Lock storage window to hotbar ui-options-function-smart-equip-backpack = Smart-equip to backpack diff --git a/Resources/Locale/en-US/game-ticking/game-presets/preset-survival.ftl b/Resources/Locale/en-US/game-ticking/game-presets/preset-survival.ftl index 231733eabfb..0b8fa83ae8b 100644 --- a/Resources/Locale/en-US/game-ticking/game-presets/preset-survival.ftl +++ b/Resources/Locale/en-US/game-ticking/game-presets/preset-survival.ftl @@ -1,2 +1,5 @@ survival-title = Survival survival-description = No internal threats, but how long can the station survive increasingly chaotic and frequent events? + +hellshift-title = Hellshift +hellshift-description = The station rolled a "one" in a luck check. Can the crew make it to the end? diff --git a/Resources/Locale/en-US/game-ticking/game-ticker.ftl b/Resources/Locale/en-US/game-ticking/game-ticker.ftl index 9527ecb57d9..a8253dd9f35 100644 --- a/Resources/Locale/en-US/game-ticking/game-ticker.ftl +++ b/Resources/Locale/en-US/game-ticking/game-ticker.ftl @@ -25,6 +25,7 @@ game-ticker-get-info-preround-text = Hi and welcome to [color=white]Space Statio >[color=yellow]{$desc}[/color] game-ticker-no-map-selected = [color=yellow]Map not yet selected![/color] game-ticker-player-no-jobs-available-when-joining = When attempting to join to the game, no jobs were available. +game-ticker-welcome-to-the-station = Welcome to the station crew, enjoy your stay! # Displayed in chat to admins when a player joins player-join-message = Player {$name} joined. @@ -39,4 +40,4 @@ latejoin-arrivals-direction = A shuttle transferring you to your station will ar latejoin-arrivals-direction-time = A shuttle transferring you to your station will arrive in {$time}. preset-not-enough-ready-players = Can't start {$presetName}. Requires {$minimumPlayers} players but we have {$readyPlayersCount}. -preset-no-one-ready = Can't start {$presetName}. No players are ready. \ No newline at end of file +preset-no-one-ready = Can't start {$presetName}. No players are ready. diff --git a/Resources/Locale/en-US/headset/headset-component.ftl b/Resources/Locale/en-US/headset/headset-component.ftl index a220737f18a..75c83643d6d 100644 --- a/Resources/Locale/en-US/headset/headset-component.ftl +++ b/Resources/Locale/en-US/headset/headset-component.ftl @@ -1,6 +1,6 @@ # Chat window radio wrap (prefix and postfix) -chat-radio-message-wrap = [color={$color}]{$channel} {$name} {$verb}, [font={$fontType} size={$fontSize}]"{$message}"[/font][/color] -chat-radio-message-wrap-bold = [color={$color}]{$channel} {$name} {$verb}, [font={$fontType} size={$fontSize}][bold]"{$message}"[/bold][/font][/color] +chat-radio-message-wrap = [color={$color}]{$channel} {$name} {$verb}, [font="{$fontType}" size={$fontSize}]"[/color][color={$languageColor}]{$message}[/color][color={$color}]"[/font][/color] +chat-radio-message-wrap-bold = [color={$color}]{$channel} {$name} {$verb}, [font="{$fontType}" size={$fontSize}][bold]"[/color][color={$languageColor}]{$message}[/color][color={$color}]"[/bold][/font][/color] examine-headset-default-channel = Use {$prefix} for the default channel ([color={$color}]{$channel}[/color]). diff --git a/Resources/Locale/en-US/implant/implant.ftl b/Resources/Locale/en-US/implant/implant.ftl index 22db4460aff..2f6ab9e4e2f 100644 --- a/Resources/Locale/en-US/implant/implant.ftl +++ b/Resources/Locale/en-US/implant/implant.ftl @@ -4,6 +4,7 @@ implanter-component-implanting-target = {$user} is trying to implant you with so implanter-component-implant-failed = The {$implant} cannot be given to {$target}! implanter-draw-failed-permanent = The {$implant} in {$target} is fused with them and cannot be removed! implanter-draw-failed = You tried to remove an implant but found nothing. +implanter-component-implant-already = {$target} already has the {$implant}! ## UI implanter-draw-text = Draw diff --git a/Resources/Locale/en-US/interaction/offer-item-system.ftl b/Resources/Locale/en-US/interaction/offer-item-system.ftl new file mode 100644 index 00000000000..a0847afa308 --- /dev/null +++ b/Resources/Locale/en-US/interaction/offer-item-system.ftl @@ -0,0 +1,13 @@ +offer-item-empty-hand = You don't have anything in your hand to give! + +offer-item-full-hand = Your hand isn't free to receive the item. + +offer-item-try-give = You offer {THE($item)} to {$target} +offer-item-try-give-target = {$user} offers you {THE($item)} + +offer-item-give = You handed {THE($item)} to {$target} +offer-item-give-other = {$user} handed {THE($item)} to {$target} +offer-item-give-target = {$user} handed you {THE($item)} + +offer-item-no-give = You stop offering {THE($item)} to {$target} +offer-item-no-give-target = {$user} is no longer offering {THE($item)} to you diff --git a/Resources/Locale/en-US/language/commands.ftl b/Resources/Locale/en-US/language/commands.ftl new file mode 100644 index 00000000000..ba2b3160094 --- /dev/null +++ b/Resources/Locale/en-US/language/commands.ftl @@ -0,0 +1,16 @@ +command-list-langs-desc = List languages your current entity can speak at the current moment. +command-list-langs-help = Usage: {$command} + +command-saylang-desc = Send a message in a specific language. To choose a language, you can use either the name of the language, or its position in the list of languages. +command-saylang-help = Usage: {$command} . Example: {$command} GalacticCommon "Hello World!". Example: {$command} 1 "Hello World!" + +command-language-select-desc = Select the currently spoken language of your entity. You can use either the name of the language, or its position in the list of languages. +command-language-select-help = Usage: {$command} . Example: {$command} 1. Example: {$command} GalacticCommon + +command-language-spoken = Spoken: +command-language-understood = Understood: +command-language-current-entry = {$id}. {$language} - {$name} (current) +command-language-entry = {$id}. {$language} - {$name} + +command-language-invalid-number = The language number must be between 0 and {$total}. Alternatively, use the language name. +command-language-invalid-language = The language {$id} does not exist or you cannot speak it. diff --git a/Resources/Locale/en-US/language/language-menu.ftl b/Resources/Locale/en-US/language/language-menu.ftl new file mode 100644 index 00000000000..83687d0f1a6 --- /dev/null +++ b/Resources/Locale/en-US/language/language-menu.ftl @@ -0,0 +1,4 @@ +language-menu-window-title = Language Menu +language-menu-current-language = Current Language: {$language} +language-menu-description-header = Description +ui-options-function-open-language-menu = Open language Menu diff --git a/Resources/Locale/en-US/language/languages.ftl b/Resources/Locale/en-US/language/languages.ftl new file mode 100644 index 00000000000..69c5d0a4a76 --- /dev/null +++ b/Resources/Locale/en-US/language/languages.ftl @@ -0,0 +1,71 @@ +language-Universal-name = Universal +language-Universal-description = What are you? + +language-GalacticCommon-name = Galactic common +language-GalacticCommon-description = The standard Galatic language, most commonly used for inter-species communications and legal work. + +language-Bubblish-name = Bubblish +language-Bubblish-description = The language of Slimes. Being a mixture of bubbling noises and pops it's very difficult to speak for humans without the use of mechanical aids. + +language-RootSpeak-name = Rootspeak +language-RootSpeak-description = The strange whistling-style language spoken by the Diona. + +language-Nekomimetic-name = Nekomimetic +language-Nekomimetic-description = To the casual observer, this language is an incomprehensible mess of broken Japanese. To the felinids, it's somehow comprehensible. + +language-Draconic-name = Draconic +language-Draconic-description = The common language of lizard-people, composed of sibilant hisses and rattles. + +language-SolCommon-name = Sol common +language-SolCommon-description = The language common to species from the Sol System. + +language-Canilunzt-name = Canilunzt +language-Canilunzt-description = The guttural language spoken and utilized by the inhabitants of the Vazzend system, composed of growls, barks, yaps, and heavy utilization of ears and tail movements. Vulpkanin speak this language with ease. + +language-Moffic-name = Moffic +language-Moffic-description = The language of the mothpeople borders on complete unintelligibility. + +language-RobotTalk-name = RobotTalk +language-RobotTalk-description = A language consisting of harsh binary chirps, whistles, hisses, and whines. Organic tongues cannot speak it without aid from special translators. + +language-Cat-name = Cat +language-Cat-description = Meow + +language-Dog-name = Dog +language-Dog-description = Bark! + +language-Fox-name = Fox +language-Fox-description = Yeeps! + +language-Xeno-name = Xeno +language-Xeno-description = Sssss! + +language-Monkey-name = Monkey +language-Monkey-description = oooook! + +language-Mouse-name = Mouse +language-Mouse-description = Squeeek! + +language-Chicken-name = Chicken +language-Chicken-description = Coot! + +language-Duck-name = Duck +language-Duck-description = Quack! + +language-Cow-name = Cow +language-Cow-description = Moooo! + +language-Sheep-name = Sheep +language-Sheep-description = Baaah! + +language-Kangaroo-name = Kangaroo +language-Kangaroo-description = Chuu! + +language-Pig-name = Pig +language-Pig-description = Oink! + +language-Crab-name = Crab +language-Crab-description = Click! + +language-Kobold-name = Kobold +language-Kobold-description = Hiss! diff --git a/Resources/Locale/en-US/language/technologies.ftl b/Resources/Locale/en-US/language/technologies.ftl new file mode 100644 index 00000000000..901a48061c5 --- /dev/null +++ b/Resources/Locale/en-US/language/technologies.ftl @@ -0,0 +1,2 @@ +research-technology-basic-translation = Basic Translation +research-technology-advanced-translation = Advanced Translation diff --git a/Resources/Locale/en-US/language/translator.ftl b/Resources/Locale/en-US/language/translator.ftl new file mode 100644 index 00000000000..8070d03be29 --- /dev/null +++ b/Resources/Locale/en-US/language/translator.ftl @@ -0,0 +1,13 @@ +translator-component-shutoff = The {$translator} shuts off. +translator-component-turnon = The {$translator} turns on. +translator-implanter-refuse = The {$implanter} has no effect on {$target}. +translator-implanter-success = The {$implanter} successfully injected {$target}. +translator-implanter-ready = This implanter appears to be ready to use. +translator-implanter-used = This implanter seems empty. + +translator-examined-langs-understood = It can translate from: [color=green]{$languages}[/color]. +translator-examined-langs-spoken = It can translate to: [color=green]{$languages}[/color]. +translator-examined-requires-any = It requires you to know at least one of these languages: [color=yellow]{$languages}[/color]. +translator-examined-requires-all = It requires you to know all of these languages: [color=yellow]{$languages}[/color]. +translator-examined-enabled = It appears to be [color=green]active[/color]. +translator-examined-disabled = It appears to be [color=red]turned off[/color]. diff --git a/Resources/Locale/en-US/loadouts/categories.ftl b/Resources/Locale/en-US/loadouts/categories.ftl index bdfa215e6a8..9770bd8bafd 100644 --- a/Resources/Locale/en-US/loadouts/categories.ftl +++ b/Resources/Locale/en-US/loadouts/categories.ftl @@ -1,7 +1,15 @@ -# Alphabetically ordered +# Alphabetically ordered, except for Uncategorized since it is always first + +loadout-category-Uncategorized = Uncategorized loadout-category-Accessories = Accessories +loadout-category-Eyes = Eyes +loadout-category-Hands = Hands +loadout-category-Head = Head loadout-category-Items = Items loadout-category-Jobs = Jobs +loadout-category-Mask = Mask +loadout-category-Neck = Neck loadout-category-Outer = Outer -loadout-category-Uncategorized = Uncategorized +loadout-category-Shoes = Shoes +loadout-category-Species = Species loadout-category-Uniform = Uniform diff --git a/Resources/Locale/en-US/loadouts/items.ftl b/Resources/Locale/en-US/loadouts/items.ftl index a4819011262..b92f56bc7cb 100644 --- a/Resources/Locale/en-US/loadouts/items.ftl +++ b/Resources/Locale/en-US/loadouts/items.ftl @@ -11,3 +11,5 @@ loadout-description-LoadoutItemPlushieSharkBlue = Dive into battle with your ver loadout-description-LoadoutItemPlushieSharkPink = Unleash the power of pink with the Pink Shark Plushie! This rosy-hued predator might not have real teeth, but its sheer adorableness is enough to take a bite out of anyone's resolve. Watch as foes melt away in the face of its cottony charm. loadout-description-LoadoutItemPlushieSharkGrey = Introducing the Grey Shark Plushie, the apex predator of snuggles! With its sleek and understated design, this plushie strikes the perfect balance between cuddle companion and imaginary ocean guardian. Beware; opponents may be mesmerized by its dorsal fin's hypnotic sway! loadout-description-LoadoutItemPlushieCarp = Brace for extraterrestrial antics with the Purple Space Carp Plushie! A fishy invader from the cosmic deep, this plushie brings a splash of humor to zero-gravity escapades. From hostile waters to interstellar giggles, it's a cuddly contradiction that's out of this world +loadout-description-LoadoutSolCommonTranslator = The most common of all translators, such that it can be purchased in any civilized station. + This device translates Sol Common speech into Galactic Common. diff --git a/Resources/Locale/en-US/loadouts/loadout-requirements.ftl b/Resources/Locale/en-US/loadouts/loadout-requirements.ftl deleted file mode 100644 index 5a453ed5cbf..00000000000 --- a/Resources/Locale/en-US/loadouts/loadout-requirements.ftl +++ /dev/null @@ -1,13 +0,0 @@ -loadout-age-requirement = You must be within {$min} and {$max} years old -loadout-species-requirement = You must be a {$species} -loadout-trait-requirement = You must have the trait {$trait} -loadout-backpack-type-requirement = You must use a {$type} as your bag -loadout-clothing-preference-requirement = You must wear a {$type} - -loadout-job-requirement = You must be one of these jobs: {$job} -loadout-timer-department-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes of [color={$departmentColor}]{$department}[/color] department playtime -loadout-timer-department-too-high = You require [color=yellow]{TOSTRING($time, "0")}[/color] fewer minutes in [color={$departmentColor}]{$department}[/color] department -loadout-timer-overall-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes of playtime -loadout-timer-overall-too-high = You require [color=yellow]{TOSTRING($time, "0")}[/color] fewer minutes of playtime -loadout-timer-role-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes with [color={$departmentColor}]{$job}[/color] -loadout-timer-role-too-high = You require[color=yellow] {TOSTRING($time, "0")}[/color] fewer minutes with [color={$departmentColor}]{$job}[/color] diff --git a/Resources/Locale/en-US/movement/laying.ftl b/Resources/Locale/en-US/movement/laying.ftl new file mode 100644 index 00000000000..f75061d6a75 --- /dev/null +++ b/Resources/Locale/en-US/movement/laying.ftl @@ -0,0 +1,7 @@ +laying-comp-lay-success-self = You lay down. +laying-comp-lay-success-other = {THE($entity)} lays down. +laying-comp-lay-fail-self = You can't lay down right now. + +laying-comp-stand-success-self = You stand up. +laying-comp-stand-success-other = {THE($entity)} stands up. +laying-comp-stand-fail-self = You can't stand up right now. diff --git a/Resources/Locale/en-US/nyanotrasen/carrying/carry.ftl b/Resources/Locale/en-US/nyanotrasen/carrying/carry.ftl index 4fa1abae8bd..490daced3f2 100644 --- a/Resources/Locale/en-US/nyanotrasen/carrying/carry.ftl +++ b/Resources/Locale/en-US/nyanotrasen/carrying/carry.ftl @@ -1,3 +1,4 @@ carry-verb = Carry carry-too-heavy = You're not strong enough. +carry-started = {THE($carrier)} is trying to pick you up! diff --git a/Resources/Locale/en-US/preferences/ui/humanoid-profile-editor.ftl b/Resources/Locale/en-US/preferences/ui/humanoid-profile-editor.ftl index b929da96554..f0ea0a4a721 100644 --- a/Resources/Locale/en-US/preferences/ui/humanoid-profile-editor.ftl +++ b/Resources/Locale/en-US/preferences/ui/humanoid-profile-editor.ftl @@ -11,6 +11,9 @@ humanoid-profile-editor-sex-female-text = Female humanoid-profile-editor-sex-unsexed-text = None humanoid-profile-editor-age-label = Age: humanoid-profile-editor-skin-color-label = Skin color: +humanoid-profile-editor-height-label = Height: {$height}cm +humanoid-profile-editor-width-label = Width: {$width}cm +humanoid-profile-editor-weight-label = Weight: {$weight}kg humanoid-profile-editor-species-label = Species: humanoid-profile-editor-pronouns-label = Pronouns: humanoid-profile-editor-pronouns-male-text = He / Him @@ -44,20 +47,40 @@ humanoid-profile-editor-department-jobs-label = {$departmentName} jobs humanoid-profile-editor-antags-tab = Antags humanoid-profile-editor-antag-preference-yes-button = Yes humanoid-profile-editor-antag-preference-no-button = No + humanoid-profile-editor-traits-tab = Traits +humanoid-profile-editor-traits-header = You have {$points -> + [1] 1 point + *[other] {$points} points +} and {$maxTraits -> + [2147483648] {$traits -> + [1] {$traits} trait + *[other] {$traits} traits + } + *[other] {$traits}/{$maxTraits} traits +} +humanoid-profile-editor-traits-show-unusable-button = Show Unusable +humanoid-profile-editor-traits-show-unusable-button-tooltip = + When enabled, traits that your current character setup cannot use will be shown highlighted in red. + You will still not be able to use the invalid traits unless your character setup changes to fit the requirements. + This is most likely useful only if there's a bug hiding traits you actually can use or if you want to see other species' traits or something. +humanoid-profile-editor-traits-no-traits = No traits found + humanoid-profile-editor-job-priority-high-button = High humanoid-profile-editor-job-priority-medium-button = Medium humanoid-profile-editor-job-priority-low-button = Low humanoid-profile-editor-job-priority-never-button = Never + humanoid-profile-editor-naming-rules-warning = Warning: Offensive or LRP IC names and descriptions will lead to admin intervention on this server. Read our \[Rules\] for more. + humanoid-profile-editor-loadouts-tab = Loadout -humanoid-profile-editor-loadouts-uncategorized-tab = Uncategorized -humanoid-profile-editor-loadouts-no-loadouts = No loadouts found humanoid-profile-editor-loadouts-points-label = You have {$points}/{$max} points humanoid-profile-editor-loadouts-show-unusable-button = Show Unusable humanoid-profile-editor-loadouts-show-unusable-button-tooltip = When enabled, loadouts that your current character setup cannot use will be shown highlighted in red. You will still not be able to use the invalid loadouts unless your character setup changes to fit the requirements. - This may be useful if you like switching between multiple jobs and don't want to have to reselect your loadout every time. + This may be useful if you like switching between multiple jobs and don't want to have to reselect your loadout every +humanoid-profile-editor-loadouts-no-loadouts = No loadouts foundtime. + humanoid-profile-editor-markings-tab = Markings humanoid-profile-editor-flavortext-tab = Description diff --git a/Resources/Locale/en-US/reagents/bay12reagents.ftl b/Resources/Locale/en-US/reagents/bay12reagents.ftl new file mode 100644 index 00000000000..7e0e9ccfca9 --- /dev/null +++ b/Resources/Locale/en-US/reagents/bay12reagents.ftl @@ -0,0 +1,2 @@ +reagent-name-milk-choco = chocolate milk +reagent-desc-milk-choco = A milk drink flavored with chocolate. \ No newline at end of file diff --git a/Resources/Locale/en-US/simplestation14/Traits/disabilities.ftl b/Resources/Locale/en-US/simplestation14/Traits/disabilities.ftl index 3d8af061392..8360aaeb9df 100644 --- a/Resources/Locale/en-US/simplestation14/Traits/disabilities.ftl +++ b/Resources/Locale/en-US/simplestation14/Traits/disabilities.ftl @@ -1,3 +1,2 @@ -trait-nearsighted-name = Nearsighted -trait-nearsighted-desc = You require glasses to see properly. -trait-nearsighted-examined = [color=lightblue]{CAPITALIZE(POSS-ADJ($target))} eyes are pretty unfocused. It doesn't seem like {SUBJECT($target)} can see things that well.[/color] +trait-name-Nearsighted = Nearsighted +trait-description-Nearsighted = You require glasses to see properly. diff --git a/Resources/Locale/en-US/station-events/events/anomaly-spawn.ftl b/Resources/Locale/en-US/station-events/events/anomaly-spawn.ftl index 0e4b5f6e39c..543bef949aa 100644 --- a/Resources/Locale/en-US/station-events/events/anomaly-spawn.ftl +++ b/Resources/Locale/en-US/station-events/events/anomaly-spawn.ftl @@ -1,7 +1,7 @@ -anomaly-spawn-event-announcement = Our readings have detected a dangerous interspacial anomaly. Please inform the research team of { $sighting }. +station-event-anomaly-spawn-announcement = Our readings have detected a dangerous interspacial anomaly. Please inform the research team of { $sighting }. anomaly-spawn-sighting-1 = low pulsating sounds heard throughout the station anomaly-spawn-sighting-2 = strange sources of light anomaly-spawn-sighting-3 = inexplicable shapes anomaly-spawn-sighting-4 = forms causing severe mental distress -anomaly-spawn-sighting-5 = strange effects on the local environment \ No newline at end of file +anomaly-spawn-sighting-5 = strange effects on the local environment diff --git a/Resources/Locale/en-US/station-events/events/bluespace-artifact.ftl b/Resources/Locale/en-US/station-events/events/bluespace-artifact.ftl index a2307d77b5d..59ea8a536b5 100644 --- a/Resources/Locale/en-US/station-events/events/bluespace-artifact.ftl +++ b/Resources/Locale/en-US/station-events/events/bluespace-artifact.ftl @@ -6,4 +6,4 @@ bluespace-artifact-sighting-3 = otherworldly structures bluespace-artifact-sighting-4 = incomprehensible alien objects bluespace-artifact-sighting-5 = unfamiliar objects in strange places bluespace-artifact-sighting-6 = unknown alien artifacts -bluespace-artifact-sighting-7 = explosions of light accompanied by weird sounds \ No newline at end of file +bluespace-artifact-sighting-7 = explosions of light accompanied by weird sounds diff --git a/Resources/Locale/en-US/station-events/events/cargo-gifts.ftl b/Resources/Locale/en-US/station-events/events/cargo-gifts.ftl index d669fbeff90..fd20459b5eb 100644 --- a/Resources/Locale/en-US/station-events/events/cargo-gifts.ftl +++ b/Resources/Locale/en-US/station-events/events/cargo-gifts.ftl @@ -10,14 +10,14 @@ cargo-gift-dest-janitor = Service Dept cargo-gift-dest-med = Medical Dept cargo-gift-dest-sec = Security Dept -cargo-gift-pizza-small = A small pizza party -cargo-gift-pizza-large = A large pizza party +cargo-gift-pizza-small = a small pizza party +cargo-gift-pizza-large = a large pizza party -cargo-gift-eng = Repair Materials -cargo-gift-vending = Vending machines refills -cargo-gift-cleaning = Cleaning equipment -cargo-gift-medical-supply = Medical supplies -cargo-gift-space-protection = Space Hazard Protection -cargo-gift-fire-protection = Fire Protection -cargo-gift-security-guns = Lethal Weapons -cargo-gift-security-riot = Riot Gear +cargo-gift-eng = repair Materials +cargo-gift-vending = vending machine refills +cargo-gift-cleaning = cleaning equipment +cargo-gift-medical-supply = medical supplies +cargo-gift-space-protection = space hazard protection +cargo-gift-fire-protection = fire protection +cargo-gift-security-guns = lethal weapons +cargo-gift-security-riot = riot gear diff --git a/Resources/Locale/en-US/station-events/events/gas-leak.ftl b/Resources/Locale/en-US/station-events/events/gas-leak.ftl index 18429fa58d8..230e886db47 100644 --- a/Resources/Locale/en-US/station-events/events/gas-leak.ftl +++ b/Resources/Locale/en-US/station-events/events/gas-leak.ftl @@ -1,2 +1,2 @@ -station-event-gas-leak-start-announcement = Attention crew, there is a gas leak on the station. We advise you to avoid the area and wear suit internals in the meantime. -station-event-gas-leak-end-announcement = The source of the gas leak has been fixed. Please be cautious around areas with gas remaining. +station-event-gas-leak-announcement = Attention crew, there is a gas leak on the station. We advise you to avoid the area and wear suit internals in the meantime. +station-event-gas-leak-complete-announcement = The source of the gas leak has been fixed. Please be cautious around areas with gas remaining. diff --git a/Resources/Locale/en-US/station-events/events/immovable-rod.ftl b/Resources/Locale/en-US/station-events/events/immovable-rod.ftl index 06abcc85c38..ff39923ecdd 100644 --- a/Resources/Locale/en-US/station-events/events/immovable-rod.ftl +++ b/Resources/Locale/en-US/station-events/events/immovable-rod.ftl @@ -1 +1 @@ -station-event-immovable-rod-start-announcement = High velocity unidentified object is on a collision course with the station. Impact imminent. +station-event-immovable-rod-announcement = High velocity unidentified object is on a collision course with the station. Impact imminent. diff --git a/Resources/Locale/en-US/station-events/events/ion-storm.ftl b/Resources/Locale/en-US/station-events/events/ion-storm.ftl index 28192d96637..10e8f190061 100644 --- a/Resources/Locale/en-US/station-events/events/ion-storm.ftl +++ b/Resources/Locale/en-US/station-events/events/ion-storm.ftl @@ -1,4 +1,4 @@ -station-event-ion-storm-start-announcement = Ion storm detected near the station. Please check all AI-controlled equipment for errors. +station-event-ion-storm-announcement = Ion storm detected near the station. Please check all AI-controlled equipment for errors. ion-storm-law-scrambled-number = [font="Monospace"][scramble rate=250 length={$length} chars="@@###$$&%!01"/][/font] diff --git a/Resources/Locale/en-US/station-events/events/kudzu-growth.ftl b/Resources/Locale/en-US/station-events/events/kudzu-growth.ftl index e0725deaf15..9ba4adb4a2d 100644 --- a/Resources/Locale/en-US/station-events/events/kudzu-growth.ftl +++ b/Resources/Locale/en-US/station-events/events/kudzu-growth.ftl @@ -1 +1 @@ -station-event-kudzu-growth-start-announcement = Attention crew, we have detected a Type 2 Biological Invader on-station, that poses potentially serious threat to crew productivity. We advise you to exterminate it. +station-event-kudzu-growth-announcement = Attention crew, we have detected a Type 2 Biological Invader on-station, that poses potentially serious threat to crew productivity. We advise you to exterminate it. diff --git a/Resources/Locale/en-US/station-events/events/meteor-swarm.ftl b/Resources/Locale/en-US/station-events/events/meteor-swarm.ftl index 6a96c560481..9066fb52121 100644 --- a/Resources/Locale/en-US/station-events/events/meteor-swarm.ftl +++ b/Resources/Locale/en-US/station-events/events/meteor-swarm.ftl @@ -1,2 +1,2 @@ -station-event-meteor-swarm-start-announcement = Meteors are on a collision course with the station. Brace for impact. -station-event-meteor-swarm-end-announcement = The meteor swarm has passed. Please return to your stations. +station-event-meteor-swarm-announcement = Meteors are on a collision course with the station. Brace for impact. +station-event-meteor-swarm-complete-announcement = The meteor swarm has passed. Please return to your stations. diff --git a/Resources/Locale/en-US/station-events/events/power-grid-check.ftl b/Resources/Locale/en-US/station-events/events/power-grid-check.ftl index b42dbd19db3..90ede6b9965 100644 --- a/Resources/Locale/en-US/station-events/events/power-grid-check.ftl +++ b/Resources/Locale/en-US/station-events/events/power-grid-check.ftl @@ -1,4 +1,4 @@ ## PowerGridCheck -station-event-power-grid-check-start-announcement = Abnormal activity detected in the station's powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration. -station-event-power-grid-check-end-announcement = Power has been restored to the station. We apologize for the inconvenience. \ No newline at end of file +station-event-power-grid-check-announcement = Abnormal activity detected in the station's powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration. +station-event-power-grid-check-complete-announcement = Power has been restored to the station. We apologize for the inconvenience. diff --git a/Resources/Locale/en-US/station-events/events/radiation-storm.ftl b/Resources/Locale/en-US/station-events/events/radiation-storm.ftl index c8f07c1b2ff..a3c5f48e84f 100644 --- a/Resources/Locale/en-US/station-events/events/radiation-storm.ftl +++ b/Resources/Locale/en-US/station-events/events/radiation-storm.ftl @@ -1,4 +1,4 @@ ## RadiationStorm -station-event-radiation-storm-start-announcement = High levels of radiation detected near the station. Evacuate any areas containing abnormal green energy fields. -station-event-radiation-storm-end-announcement = The radiation threat has passed. Please return to your workplaces. \ No newline at end of file +station-event-radiation-storm-announcement = High levels of radiation detected near the station. Evacuate any areas containing abnormal green energy fields. +station-event-radiation-storm-complete-announcement = The radiation threat has passed. Please return to your workplaces. diff --git a/Resources/Locale/en-US/station-events/events/solar-flare.ftl b/Resources/Locale/en-US/station-events/events/solar-flare.ftl index 5c88f82ded1..617b65739a8 100644 --- a/Resources/Locale/en-US/station-events/events/solar-flare.ftl +++ b/Resources/Locale/en-US/station-events/events/solar-flare.ftl @@ -1,2 +1,2 @@ -station-event-solar-flare-start-announcement = A solar flare has been detected near the station. Some communication channels may not function. -station-event-solar-flare-end-announcement = The solar flare ended. Communication channels no longer affected. +station-event-solar-flare-announcement = A solar flare has been detected near the station. Some communication channels may not function. +station-event-solar-flare-complete-announcement = The solar flare ended. Communication channels no longer affected. diff --git a/Resources/Locale/en-US/station-events/events/vent-clog.ftl b/Resources/Locale/en-US/station-events/events/vent-clog.ftl index f87f9e241b2..1d6ddd136b7 100644 --- a/Resources/Locale/en-US/station-events/events/vent-clog.ftl +++ b/Resources/Locale/en-US/station-events/events/vent-clog.ftl @@ -1 +1 @@ -station-event-vent-clog-start-announcement = The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur. +station-event-vent-clog-announcement = The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur. diff --git a/Resources/Locale/en-US/station-events/events/vent-critters.ftl b/Resources/Locale/en-US/station-events/events/vent-critters.ftl index 426f0c0ca1a..7c0103cd559 100644 --- a/Resources/Locale/en-US/station-events/events/vent-critters.ftl +++ b/Resources/Locale/en-US/station-events/events/vent-critters.ftl @@ -1 +1,4 @@ -station-event-vent-creatures-start-announcement = Attention. A large influx of unknown life forms have been detected residing within the station's ventilation systems. Please be rid of these creatures before it begins to affect productivity. +station-event-cockroach-migration-announcement = Attention. A large influx of unknown life forms have been detected residing within the station's ventilation systems. Please be rid of these creatures before it begins to affect productivity. +station-event-slimes-spawn-announcement = Attention. A large influx of unknown life forms have been detected residing within the station's ventilation systems. Please be rid of these creatures before it begins to affect productivity. +station-event-vent-critters-announcement = Attention. A large influx of unknown life forms have been detected residing within the station's ventilation systems. Please be rid of these creatures before it begins to affect productivity. +station-event-spider-spawn-announcement = Attention. A large influx of unknown life forms have been detected residing within the station's ventilation systems. Please be rid of these creatures before it begins to affect productivity. diff --git a/Resources/Locale/en-US/station-goal/station-goal-command.ftl b/Resources/Locale/en-US/station-goal/station-goal-command.ftl new file mode 100644 index 00000000000..82ed4d5c8a7 --- /dev/null +++ b/Resources/Locale/en-US/station-goal/station-goal-command.ftl @@ -0,0 +1,6 @@ +send-station-goal-command-description = Sends the selected station target to all faxes that can receive it +send-station-goal-command-help-text = Usage: { $command } +send-station-goal-command-arg-id = Goal Prototype ID + +send-station-goal-command-error-no-goal-proto = No station goal found with ID {$id} +send-station-goal-command-error-couldnt-fax = Couldn't send station goal, probably due to a lack of fax machines that are able to recieve it diff --git a/Resources/Locale/en-US/station-goal/station-goals.ftl b/Resources/Locale/en-US/station-goal/station-goals.ftl new file mode 100644 index 00000000000..f98190fa3c4 --- /dev/null +++ b/Resources/Locale/en-US/station-goal/station-goals.ftl @@ -0,0 +1,224 @@ +station-goal-fax-paper-name = Station Goal + +station-goal-fax-paper-header = + ███╗░░██╗████████╗ + ████╗░██║╚══██╔══╝ Form NT-No.{$station}-CC + ██╔██╗██║░░░██║░░░ Target Order + ██║╚████║░░░██║░░░ Date: {$date} + ██║░╚███║░░░██║░░░ Signed: CCO-{$name} + ╚═╝░░╚══╝░░░╚═╝░░░ + ════════════════════════════════════════ + {$content} + ════════════════════════════════════════ + + +station-goal-xeno= + Dear Station Command, the purpose of your shift is to build a Xenobiology Lab and then study exotic life forms. + Two containment chambers must be constructed according to the following requirements: + 1. Must be well reinforced; + 2. At least one of the chambers must be equipped with a gas supply system; + 3. The entrance should be a cycling airlock system to prevent contamination. + + Get the Salvage Team to capture at least 2 representatives of life forms (e.g. space carp) and transport them to the above-described chambers. + + Capture requirements: + 1. Exotic fauna should not have critical injuries at the time of placement in the research department; + 2. When captured fauna dies, you are required to catch another, cloning is strictly prohibited. + + Once you collect the required fauna, you must study them and write a report on their properties. + The report must be stamped by the head of the department and faxed to Central Command. + + Experience Requirements: + 1. Experience should be documented in detail; + 2. Test activities may include: working with gases, smoke, foam, or injecting experimental reagents (e.g. Cognizine) into captured fauna. + +station-goal-museum= + Dear Command of the station, the purpose of your shift is to build a museum, the exhibits for which will be unique objects collected from the station. + + Below are the requirements for the design of the museum: + 1. The museum must be structurally connected to the station by a space-protected corridor, or be located within it; + 2. The premises must be of a size that allows them to easily receive a large number of visitors; + 3. The premises must be provided with a standard atmosphere, ventilation and stable power supply; + 4. Room decoration should be visually pleasing; + 5. Exhibits must be reinforced accordingly to what is contained in them. + + Exhibit requirements: + 1. Exhibits must be unique in their kind; + 2. Each department must provide at least 2 exhibits for the museum fund; + 3. The total number of exhibits must be at least 20. + + Exhibits may include: + 1. Exotic drinks and dishes that require an extraordinary method of production and/or non-standard ingredients; + 2. Exotic matter/substance; + 3. Works of art (e.g. statues, paintings); + 4. Fully studied and documented artifacts (optionally provide a copy of the document); + 5. High-tech devices or tools; + 6. High-tech or high-power weapons; + 7. Robotic entities (e.g. Mechs, Cyborgs, Drones); + 8. Mutated biological organisms; + 9. Domesticated wild animals or intelligent non-humanoid life forms; + 10. Found treasures or items not available on the market. + + Upon completion of the museum, it is required to provide the crew with at least 20 minutes of free time from work so that they can visit the museum. + +station-goal-area= + Dear Station Command, the goal of your shift is to increase the effective use of space at the station. + + It is required to bring the abandoned premises into proper form and find a use for them. + Each department must equip and effectively use the area of adjacent maintenance tunnels. + Sufficiently spacious maintenance tunnels need to be converted into residential areas. + The remaining tunnels should be provided with floor coverings and adequate lighting. + In addition, it is necessary to provide a public, well-lit corridor connecting all the restored compartments and new bedrooms. + +station-goal-bureaucraticerror = + ACCESS TO THIS DOCUMENT IS PROHIBITED FOR PERSONS WHO DO NOT HAVE LEGAL IMMUNITY + + Dear Station Command, we inform you that the purpose of your shift was lost as a result of a bureaucratic error. + With this news, Central Command gives you the opportunity to independently assign a new goal for the station. + + New goal requirements: + 1. Relevance: The goal must be relevant and relevant to the current situation; + 2. Engagement: The goal should require the cooperation of as many departments as possible in the plans; + 3. Scope: The goal should involve sufficient, but not excessive, amounts of work to ensure the effective completion of the task. + + Please note that distribution of the contents of this document to persons who do not have legal immunity is strictly prohibited due to the possibility of discrediting the management of the Corporation. + Therefore, in order to present a new goal to the crew, the command staff must contact Central Command for approval of your ideas. + +station-goal-anomalies= + Dear Station Command, the purpose of your shift is to provide new information about anomalies to NanoTrasen. + + It is necessary to conduct experimental studies aimed at testing the consequences of the collapse of at least 4 unique anomalies. + During or after the experiments, it is necessary to isolate and document the aforementioned anomalies. + + Document requirements: + 1. The official name of the anomaly; + 2. Physical description; + 3. Passive properties; + 4. Reaction of the anomaly to different particles; + 5. Consequences of the collapse; + 6. Location of the anomaly. + + The document must be certified by the stamp of the supervisor and faxed to Central Command. + +station-goal-combat= + Dear station Command, due to the increase in attacks of pirate ships in this sector, the purpose of your shift is to raise the overall combat readiness of the station. + + Required: + 1. Organize an inspection of every sentient being and cargo arriving at or leaving the station. + 2. Build or modify an existing security checkpoint at arrivals and departures. The checkpoint must be able to completely block the ports from the main part of the station. + Each of the above checkpoints must have at least one cell for the temporary detention of detainees. + 3. Organize a spare weapons storage in the opposite part of the station from the brig. + The vault arsenal should have enough weapons and equipment to fully equip all security personnel. + 4. Organize the recruitment of a new combat subdepartment of security. + Squad members must be recruited from the station's crew. + Recruitment should be carried out on a voluntary-compulsory basis. + Composition of the squad: + 1 Field Medic; + 1 Field Engineer; + 3 Combat Operatives. + All members of the squad must be trained in all the necessary skills to conduct combat and fulfill their role. + 5. Open a public shooting range. + The shooting range should present all available types of weapons or their training counterparts. + Avoid providing lethal weaponry to unauthorized personnel. + 6. Encourage the use of the station boxing ring. + If there is no boxing ring, you must create one. + +station-goal-shuttle= + Dear Station Command, the purpose of your shift is to build a space shuttle capable of being piloted. + + Shuttle requirements: + 1. The shuttle must have a locked bridge; + a medical room with the necessary medical supplies and chemical equipment; + a supply store surrounded by reinforced material; + a crew room with at least 12 seats. + 2. There must be an intermediate room between the docking airlock and the main rooms to prevent possible depressurization. + 3. The shuttle must have a standard atmosphere, and also have several air gas containers to maintain it. + 4. The shuttle must be able to move in all directions (forward, backward, sideways) and turn reasonably well. + + Upon completion, the shuttle crew must be recruited from the station personnel. + The shuttle crew must include: + 1 pilot; + 2 engineers; + 1 medic/chemist; + 1 security officer. + + The shuttle should take on board all the station Command representatives as passengers and, in parallel with the evacuation shuttle, go to the Central Command station. + +station-goal-singularity= + Dear station Command, the goal of your shift is to build a generator based on the gravitational singularity. + + The design requirements are: + 1. The structure must be located at a significant distance from the station. + 2. The structure must be protected from meteorites and space debris. + 3. The containment field must be able to prevent the loss of a class 3 singularity. + +station-goal-solarpanels= + Dear station Command, the purpose of your shift is to organize a backup power system. + + The following work is required: + 1. Build two new branches of solar panels. + 2. Allocate an area for a compartment with spare batteries. + This compartment should accommodate at least 3 fully charged SMES', which should not be connected to the main power system of the station unless needed. + +station-goal-artifacts= + Dear station Command, the purpose of your shift is to provide new information about alien artifacts to NanoTrasen. + + It is required to organize the work of salvagers to search for and deliver artifacts from the wreckage around the station or expeditions. + After the delivery of the artifacts, they must be transferred to a special container to the research department. + It is necessary to deliver at least 2 fully studied and documented artifacts on the evacuation shuttle in special containment units. + + Recommended information for the document: + 1. Name of the artifact. + 2. Physical description. + 3. Properties of the object. + 4. Location of where the artifact was found. + 5. Additional notes. + + The document must be certified by the stamp of the supervisor. + +station-goal-storage= + Dear station Command, the purpose of your shift is to build an orbital storage facility with supplies and technology. + + The storage should be placed in space separately from the main station, make sure its design is strong, a random meteorite should not damage it. + + 4 boxes must be placed in the storage containing the following respectively: + - Advanced medicines; + - Stocks of the best seeds; + - Refrigerator box of food with a high nutritional value; + - Valuable, but not unique boards. + + Monitor the safety of the contents in the storage until the end of the shift, a cleanup crew will come retrieve the contents as they prepare the station. + +station-goal-zoo= + Dear station Command, the purpose of your shift is to improve the recreational value of the personnel at the station. + + It is necessary to build a zoo with at least 5 enclosures containing different types of animals ordered from the supply department. + Provide animals with food, at least one cleaning robot in each enclosure, and everything necessary for life, depending on the type of animal. + It is also necessary to build a bathhouse for the animals, water vapor must be supplied by Atmospheric Technicians. + + Upon completion of the zoo, it is required to provide the crew with at least 20 minutes of free time from work so that they can visit the new zoo. + +station-goal-labor= + Dear station Command, the purpose of your shift is to increase the motivation of the personnel for the growth of labor productivity. + + This requires that each of the heads during the shift closely monitors the performance of the duties of their employees and evaluates them. + After the time set by Command for evaluation, in each of the departments, the best, in the opinion of the head, employee should be selected, who will be invited to a dinner, where the Command staff will be obliged to award them a medal and a prize. + The heads must provide a report indicating the employee's position and merits for the shift. + Drinks and meals should be prepared for the dinner, as well as, if possible, several entertainment events that allow the presence of actors and musicians. + For the duration of the celebration, the dining room or other place chosen for the event must be inaccessible to the rest of the crew. + + The duration of the shift for a more accurate assessment of the work of the personnel should be set by the Command staff. + After the dinner someone must announce the end of the shift and call the evacuation shuttle. + +station-goal-lectures= + Dear station Command, the purpose of your shift is to carry out a number of events within the framework of the Corporation's plan to increase the knowledge of its employees. + + The Command staff are instructed to organize a platform for public lectures, if none exists, create one nearby the bridge entry. + The venue should be equipped with a large enough stage for speakers in the middle, a podium for the presenter to one side of it, plenty of seating for guests, and a special counter/table for brochures at the entrance. + A host/organizer of the event must also be selected. + Each department is required to present a group of employees consisting of at least 2 people. + Selected employees, under the supervision of the head of the department, should prepare a short lecture/presentation on a specific topic within their specialization (e.g. the harm of drugs and their reason for their criminalization, the effect of smoking on the body, acting, product pricing, cooking etc.), preferably with demonstration materials, and at least 10 brochures, on which the abstracts of the lecture should be indicated. + At the time indicated by the Command staff, the crew must be assembled on the site for the event, where lectures will be read. + There may be breaks between lectures to allow guests to read brochures and catch their breath. + + After the end of the event someone must announce the end of the shift and call the evacuation shuttle. diff --git a/Resources/Locale/en-US/store/categories.ftl b/Resources/Locale/en-US/store/categories.ftl index 437fc03ae09..b6abc3e4288 100644 --- a/Resources/Locale/en-US/store/categories.ftl +++ b/Resources/Locale/en-US/store/categories.ftl @@ -12,6 +12,7 @@ store-category-implants = Implants store-category-job = Job store-category-armor = Armor store-category-pointless = Pointless +store-category-deception = Deception # Revenant store-category-abilities = Abilities diff --git a/Resources/Locale/en-US/store/uplink-catalog.ftl b/Resources/Locale/en-US/store/uplink-catalog.ftl index 70eb998bb40..592cf59d2fe 100644 --- a/Resources/Locale/en-US/store/uplink-catalog.ftl +++ b/Resources/Locale/en-US/store/uplink-catalog.ftl @@ -109,6 +109,9 @@ uplink-holoclown-kit-desc = A joint venture between Cybersun and Honk.co. Contai uplink-holster-name = Shoulder Holster uplink-holster-desc = A deep shoulder holster capable of holding many types of ballistics. +uplink-chest-rig-name = Chest Rig +uplink-chest-rig-desc = Explosion-resistant tactical webbing used for holding traitor goods. + uplink-emag-name = Emag uplink-emag-desc = The business card of the syndicate, this sequencer is able to break open airlocks and tamper with a variety of station devices. Recharges automatically. @@ -201,6 +204,9 @@ uplink-decoy-kit-desc = State-of-the-art distraction technology straight from RN uplink-chemistry-kit-name = Chemical Synthesis Kit uplink-chemistry-kit-desc = A starter kit for the aspiring chemist, includes toxin and vestine for all your criminal needs! +uplink-knives-kit-name = Throwing Knives Kit +uplink-knives-kit-desc = A set of 4 syndicate branded throwing knives, perfect for embedding into the body of your victims. + uplink-meds-bundle-name = Medical Bundle uplink-meds-bundle-desc = All you need to get your comrades back in the fight: mainly a combat medkit, a defibrillator and three combat medipens. diff --git a/Resources/Locale/en-US/strip/strippable-component.ftl b/Resources/Locale/en-US/strip/strippable-component.ftl index 7654b20b03f..65d7844ee22 100644 --- a/Resources/Locale/en-US/strip/strippable-component.ftl +++ b/Resources/Locale/en-US/strip/strippable-component.ftl @@ -19,4 +19,8 @@ strip-verb-get-data-text = Strip ## UI strippable-bound-user-interface-stripping-menu-title = {$ownerName}'s inventory -strippable-bound-user-interface-stripping-menu-ensnare-button = Remove Leg Restraints \ No newline at end of file +strippable-bound-user-interface-stripping-menu-ensnare-button = Remove Leg Restraints + +# Stealth +thieving-component-user = Someone +thieving-component-item = something \ No newline at end of file diff --git a/Resources/Locale/en-US/traits/categories.ftl b/Resources/Locale/en-US/traits/categories.ftl new file mode 100644 index 00000000000..56f0adeb479 --- /dev/null +++ b/Resources/Locale/en-US/traits/categories.ftl @@ -0,0 +1,8 @@ +# Alphabetically ordered, except for Uncategorized since it is always first + +trait-category-Uncategorized = Uncategorized +trait-category-Auditory = Auditory +trait-category-Mental = Mental +trait-category-Physical = Physical +trait-category-Speech = Speech +trait-category-Visual = Visual diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 7a3564edf66..f8cef13ecd3 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -1,34 +1,57 @@ -trait-blindness-name = Blindness -trait-blindness-desc = You are legally blind, and can't see clearly past a few meters in front of you. +trait-name-Blindness = Blindness +trait-description-Blindness = You are legally blind, and can't see clearly past a few meters in front of you. +trait-examined-Blindness = [color=lightblue]{CAPITALIZE(POSS-ADJ($target))} eyes are glassy and unfocused. It doesn't seem like {SUBJECT($target)} can see you well, if at all.[/color] -trait-narcolepsy-name = Narcolepsy -trait-narcolepsy-desc = You fall asleep randomly +trait-name-Narcolepsy = Narcolepsy +trait-description-Narcolepsy = You fall asleep randomly -trait-pacifist-name = Pacifist -trait-pacifist-desc = You cannot attack or hurt any living beings. +trait-name-Pacifist = Pacifist +trait-description-Pacifist = You cannot attack or hurt any living beings. -permanent-blindness-trait-examined = [color=lightblue]{CAPITALIZE(POSS-ADJ($target))} eyes are glassy and unfocused. It doesn't seem like {SUBJECT($target)} can see you well, if at all.[/color] +trait-name-LightweightDrunk = Lightweight Drunk +trait-description-LightweightDrunk = Alcohol has a stronger effect on you -trait-lightweight-name = Lightweight Drunk -trait-lightweight-desc = Alcohol has a stronger effect on you +trait-name-HeavyweightDrunk = Heavyweight Drunk +trait-description-HeavyweightDrunk = Alcohols are afraid of you -trait-muted-name = Muted -trait-muted-desc = You can't speak +trait-name-Muted = Muted +trait-description-Muted = You can't speak -trait-paracusia-name = Paracusia -trait-paracusia-desc = You hear sounds that aren't really there +trait-name-Paracusia = Paracusia +trait-description-Paracusia = You hear sounds that aren't really there -trait-pirate-accent-name = Pirate Accent -trait-pirate-accent-desc = You can't stop speaking like a pirate! +trait-name-PirateAccent = Pirate Accent +trait-description-PirateAccent = You can't stop speaking like a pirate! -trait-accentless-name = Accentless -trait-accentless-desc = You don't have the accent that your species would usually have +trait-name-Accentless = Accentless +trait-description-Accentless = You don't have the accent that your species would usually have -trait-frontal-lisp-name = Frontal Lisp -trait-frontal-lisp-desc = You thpeak with a lithp +trait-name-FrontalLisp = Frontal Lisp +trait-description-FrontalLisp = You thpeak with a lithp -trait-socialanxiety-name = Social Anxiety -trait-socialanxiety-desc = You are anxious when you speak and stutter. +trait-name-SocialAnxiety = Social Anxiety +trait-description-SocialAnxiety = You are anxious when you speak and stutter. -trait-snoring-name = Snoring -trait-snoring-desc = You will snore while sleeping. +trait-name-Snoring = Snoring +trait-description-Snoring = You will snore while sleeping. + +trait-name-NormalVisionHarpy = Trichromat Modification +trait-description-NormalVisionHarpy = Your eyes have been modified by means of advanced medicine to see in the standard colors of Red, Green, and Blue. + +trait-name-NormalVisionVulpkanin = Trichromat Modification +trait-description-NormalVisionVulpkanin = Your eyes have been modified by means of advanced medicine to see in the standard colors of Red, Green, and Blue. + +trait-name-Thieving = Thieving +trait-description-Thieving = + You are deft with your hands, and talented at convincing people of their belongings. + You can identify pocketed items, steal them quieter, and steal ~33% faster. + +trait-name-ForeignerLight = Foreigner (light) +trait-description-ForeignerLight = + You struggle to learn this station's primary language, and as such, cannot speak it. You can, however, comprehend what others say in that language. + To help you overcome this obstacle, you are equipped with a translator that helps you speak in this station's primary language. + +trait-name-Foreigner = Foreigner +trait-description-Foreigner = + For one reason or another you do not speak this station's primary language. + Instead, you have a translator issued to you that only you can use. diff --git a/Resources/Maps/Shuttles/trading_outpost.yml b/Resources/Maps/Shuttles/trading_outpost.yml index a10f070bd25..7b968b5c13d 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 @@ -60,6 +60,9 @@ entities: linearDamping: 0.05 fixedRotation: False bodyType: Dynamic + - type: PassiveDampening # To prevent cargotechs from flingling it away. + linearDampening: 0.01 + angularDampening: 0.01 - type: Fixtures fixtures: {} - type: OccluderTree @@ -1889,276 +1892,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/Prototypes/Actions/misc.yml b/Resources/Prototypes/Actions/misc.yml new file mode 100644 index 00000000000..60fec699210 --- /dev/null +++ b/Resources/Prototypes/Actions/misc.yml @@ -0,0 +1,10 @@ +- type: entity + id: ActionCancelEscape + name: Stop escaping + description: Calm down and sit peacefuly in your carrier's inventory + noSpawn: true + components: + - type: InstantAction + icon: Actions/escapeinventory.rsi/cancel-escape.png + event: !type:EscapeInventoryCancelActionEvent + useDelay: 2 diff --git a/Resources/Prototypes/Alerts/alerts.yml b/Resources/Prototypes/Alerts/alerts.yml index 2d1c9062e61..75d4ca8a862 100644 --- a/Resources/Prototypes/Alerts/alerts.yml +++ b/Resources/Prototypes/Alerts/alerts.yml @@ -24,6 +24,7 @@ - category: Thirst - alertType: Magboots - alertType: Pacified + - alertType: Offer - type: alert id: LowOxygen @@ -150,6 +151,15 @@ name: alerts-buckled-name description: alerts-buckled-desc +- type: alert + id: Offer + onClick: !type:AcceptOffer { } + icons: + - sprite: /Textures/Interface/Alerts/offer_item.rsi + state: offer_item + name: alerts-offer-name + description: alerts-offer-desc + - type: alert id: HumanCrit category: Health @@ -419,6 +429,18 @@ name: alerts-pacified-name description: alerts-pacified-desc +- type: alert + id: Walking + icons: + - sprite: /Textures/Interface/Alerts/walking.rsi + state: walking0 + - sprite: /Textures/Interface/Alerts/walking.rsi + state: walking1 + name: alerts-walking-name + description: alerts-walking-desc + minSeverity: 0 + maxSeverity: 1 + - type: alert id: Debug1 icons: diff --git a/Resources/Prototypes/Announcers/!randomAnnouncers.yml b/Resources/Prototypes/Announcers/!randomAnnouncers.yml new file mode 100644 index 00000000000..a796094b28d --- /dev/null +++ b/Resources/Prototypes/Announcers/!randomAnnouncers.yml @@ -0,0 +1,8 @@ +- type: weightedRandom + id: RandomAnnouncers + weights: + Intern: 0.15 + MedBot: 0.5 + Michael: 0.9 + NEIL: 1 + VoxFem: 0.55 diff --git a/Resources/Prototypes/Announcers/intern.yml b/Resources/Prototypes/Announcers/intern.yml new file mode 100644 index 00000000000..0a1a4049b6d --- /dev/null +++ b/Resources/Prototypes/Announcers/intern.yml @@ -0,0 +1,134 @@ +- type: announcer + id: Intern + basePath: /Audio/Announcers/Intern + baseAudioParams: + volume: -7 + announcements: + # Communications + - id: announce # Communications console + path: comms/announce.ogg + # - id: attention # Generic alert sound # Should be different from fallback but it's very similar + # path: comms/attention.ogg + - id: commandReport # Station goal, Central Command messages, etc + collection: InternCommandReportAnnouncements + # - id: spawnAnnounceCaptain # Captain arrives on the station # TODO That system is annoyingly not modular + # path: comms/spawn_announce.ogg + # - id: war # Nuclear Operative declaration of war + # path: comms/war.ogg + # - id: nukeCodes # The station has been send nuclear activation codes + # path: comms/nuke_codes.ogg # Or command_report.ogg if you want + # - id: nukeArm # The nuke is active and ticking + # path: comms/nuke_arm.ogg + # - id: nukeDisarm # The nuke has been disarmed + # path: comms/nuke_disarm.ogg + - id: welcome # The shift has started + collection: InternWelcomeAnnouncements + + # Alert levels + # - id: alertGreen # Everything is fine + # path: alerts/green.ogg + # - id: alertBlue # Something is amiss + # path: alerts/blue.ogg + # - id: alertViolet # Viral infection or misc medical emergencies, listen to Medical + # path: alerts/violet.ogg + # - id: alertWhite # Glimmer is too high, listen to Epistemics + # path: alerts/white.ogg + # - id: alertYellow # The station is being largely damaged, listen to Engineering + # path: alerts/yellow.ogg + # - id: alertRed # Generic many things are bad, listen to Security + # path: alerts/red.ogg + # - id: alertGamma # There is a massive immediate threat to the station, listen to Central Command + # path: alerts/gamma.ogg + # - id: alertDelta # The station is being or about to be massively destroyed, run for your life + # path: alerts/delta.ogg + # - id: alertEpsilon # The station has been terminated, good luck survivors! + # path: alerts/epsilon.ogg + + # Events + ## Wizard's Den + ### Mid-Round Antagonists + # - id: ninjaHacking # A Ninja is hacking something + # path: comms/ninja_hacking.ogg + # - id: powerSinkExplosion # A power sink is about to overcharge and explode + # path: comms/powersink_explosion.ogg + ### Events + - id: anomalySpawn # An anomaly has spawned in a random place + path: events/anomaly.ogg + # - id: bluespaceArtifact # An artifact has spawned in a random place + # path: events/bluespace_artifact.ogg + # - id: bluespaceLocker # Two random lockers now share inventories + # path: events/bluespace_locker.ogg + # - id: breakerFlip # A few random APCs have been disabled, ask Engineering to fix them + # path: events/breaker_flip.ogg + # - id: bureaucraticError # Random jobs have been added, removed, or made infinite + # path: events/bureaucratic_error.ogg + # - id: clericalError # Random crew are removed from the manifest + # path: events/clerical_error.ogg + # - id: carpRift # A dragon's carp rift is active + # path: events/carp_rift.ogg + # - id: revenantSpawn # A revenant has spawned (by a prober?) + # path: events/revenant_spawn.ogg + # - id: gasLeak # A random gas is coming out of a random vent + # path: events/gas_leak.ogg + # - id: gasLeakComplete # Gas has stopped coming out of a vent + # path: events/gas_leak-complete.ogg + # - id: kudzuGrowth # Kudzu is growing in a random place + # path: events/kudzu_growth.ogg + - id: meteorSwarm # Meteors are flying at the station, stay away from windows + path: events/meteors.ogg + # - id: meteorSwarmComplete # Meteors have stopped flying at the station + # path: events/meteors-complete.ogg + # - id: mouseMigration # Several mice have appeared in a random place + # path: events/mouse_migration.ogg + # - id: cockroachMigration # Several cockroaches have appeared in a random place + # path: events/cockroach_migration.ogg + - id: powerGridCheck # The station's power is offline for some moments + path: events/power_grid_check.ogg + - id: powerGridCheckComplete # The station's power is online again + path: events/power_grid_check-complete.ogg + # - id: randomSentience # A random few animals have become sentient + # path: events/random_sentience.ogg + # - id: solarFlare # A solar flare is nearby, may mess with comms and electronics + # path: events/solar_flare.ogg + # - id: solarFlareComplete # The solar flare has passed + # path: events/solar_flare-complete.ogg + # - id: ventClog # A random reagent is coming out of a scrubber + # path: events/vent_clog.ogg + # - id: slimesSpawn # Some simple slimes are appearing in vents + # path: events/slimes_spawn.ogg + # - id: spiderSpawn # Some simple spiders are appearing in vents + # path: events/spider_spawn.ogg + # - id: immovableRodSpawn # The station is moving into an immovable rod, don't die or something, ask Engineering for help repairing it + # path: events/immovable_rod_spawn.ogg + - id: ionStorm # AI-controlled equipment are now weird, check their laws + path: events/ion_storm.ogg + ## Delta-V + - id: xenoVents # Xenomorphs are coming out of vents + path: events/aliens.ogg + ## NyanoTrasen + # - id: noosphericStorm # A large amount of glimmer has joined the station and made people psionic + # path: events/noospheric_storm.ogg + + # Shuttle + - id: shuttleCalled # The shuttle is on its way + path: shuttle/called.ogg + - id: shuttleRecalled # The shuttle is going back to Central Command + path: shuttle/recalled.ogg + - id: shuttleDock # The shuttle has arrived at the station + path: shuttle/dock.ogg + # - id: shuttleNearby # The shuttle couldn't dock, it's at a specified location + # path: shuttle/nearby.ogg + # - id: shuttleGoodLuck # The shuttle could not find its way to the station, good luck crew + # path: shuttle/good_luck.ogg + # - id: shuttleAuthAdded # One of few have added their acceptance to early launching + # path: shuttle/auth_added.ogg + # - id: shuttleAuthRevoked # One of few have revoked their acceptance to early launching + # path: shuttle/auth_revoked.ogg + # - id: shuttleAlmostLaunching # The shuttle will leave to FTL in 10 seconds + # path: shuttle/almost_launching.ogg + # - id: shuttleLeft # The shuttle has left the station + # path: shuttle/left.ogg + + # Fallback # REQUIRED + - id: fallback # Any announcement sent without a valid announcement on this announcer will use this + collection: InternAnnouncements diff --git a/Resources/Prototypes/Announcers/medbot.yml b/Resources/Prototypes/Announcers/medbot.yml new file mode 100644 index 00000000000..3b1fba49721 --- /dev/null +++ b/Resources/Prototypes/Announcers/medbot.yml @@ -0,0 +1,132 @@ +- type: announcer + id: MedBot + basePath: /Audio/Announcers/MedBot + announcements: + # Communications + - id: announce # Communications console + path: comms/announce.ogg + - id: attention # Generic alert sound # Should be different from fallback but it's very similar + path: comms/attention.ogg + - id: commandReport # Station goal, Central Command messages, etc + path: comms/command_report.ogg + # - id: spawnAnnounceCaptain # Captain arrives on the station # TODO That system is annoyingly not modular + # path: comms/spawn_announce.ogg + # - id: war # Nuclear Operative declaration of war + # path: comms/war.ogg + # - id: nukeCodes # The station has been send nuclear activation codes + # path: comms/nuke_codes.ogg # Or command_report.ogg if you want + # - id: nukeArm # The nuke is active and ticking + # path: comms/nuke_arm.ogg + # - id: nukeDisarm # The nuke has been disarmed + # path: comms/nuke_disarm.ogg + - id: welcome # The shift has started + path: comms/welcome.ogg + + # Alert levels + # - id: alertGreen # Everything is fine + # path: alerts/green.ogg + # - id: alertBlue # Something is amiss + # path: alerts/blue.ogg + # - id: alertViolet # Viral infection or misc medical emergencies, listen to Medical + # path: alerts/violet.ogg + # - id: alertWhite # Glimmer is too high, listen to Epistemics + # path: alerts/white.ogg + # - id: alertYellow # The station is being largely damaged, listen to Engineering + # path: alerts/yellow.ogg + # - id: alertRed # Generic many things are bad, listen to Security + # path: alerts/red.ogg + # - id: alertGamma # There is a massive immediate threat to the station, listen to Central Command + # path: alerts/gamma.ogg + # - id: alertDelta # The station is being or about to be massively destroyed, run for your life + # path: alerts/delta.ogg + # - id: alertEpsilon # The station has been terminated, good luck survivors! + # path: alerts/epsilon.ogg + + # Events + ## Wizard's Den + ### Mid-Round Antagonists + # - id: ninjaHacking # A Ninja is hacking something + # path: comms/ninja_hacking.ogg + # - id: powerSinkExplosion # A power sink is about to overcharge and explode + # path: comms/powersink_explosion.ogg + ### Events + - id: anomalySpawn # An anomaly has spawned in a random place + path: events/anomaly.ogg + # - id: bluespaceArtifact # An artifact has spawned in a random place + # path: events/bluespace_artifact.ogg + # - id: bluespaceLocker # Two random lockers now share inventories + # path: events/bluespace_locker.ogg + # - id: breakerFlip # A few random APCs have been disabled, ask Engineering to fix them + # path: events/breaker_flip.ogg + # - id: bureaucraticError # Random jobs have been added, removed, or made infinite + # path: events/bureaucratic_error.ogg + # - id: clericalError # Random crew are removed from the manifest + # path: events/clerical_error.ogg + # - id: carpRift # A dragon's carp rift is active + # path: events/carp_rift.ogg + # - id: revenantSpawn # A revenant has spawned (by a prober?) + # path: events/revenant_spawn.ogg + # - id: gasLeak # A random gas is coming out of a random vent + # path: events/gas_leak.ogg + # - id: gasLeakComplete # Gas has stopped coming out of a vent + # path: events/gas_leak-complete.ogg + # - id: kudzuGrowth # Kudzu is growing in a random place + # path: events/kudzu_growth.ogg + - id: meteorSwarm # Meteors are flying at the station, stay away from windows + path: events/meteors.ogg + # - id: meteorSwarmComplete # Meteors have stopped flying at the station + # path: events/meteors-complete.ogg + # - id: mouseMigration # Several mice have appeared in a random place + # path: events/mouse_migration.ogg + # - id: cockroachMigration # Several cockroaches have appeared in a random place + # path: events/cockroach_migration.ogg + - id: powerGridCheck # The station's power is offline for some moments + path: events/power_grid_check.ogg + - id: powerGridCheckComplete # The station's power is online again + path: events/power_grid_check-complete.ogg + # - id: randomSentience # A random few animals have become sentient + # path: events/random_sentience.ogg + # - id: solarFlare # A solar flare is nearby, may mess with comms and electronics + # path: events/solar_flare.ogg + # - id: solarFlareComplete # The solar flare has passed + # path: events/solar_flare-complete.ogg + # - id: ventClog # A random reagent is coming out of a scrubber + # path: events/vent_clog.ogg + # - id: slimesSpawn # Some simple slimes are appearing in vents + # path: events/slimes_spawn.ogg + # - id: spiderSpawn # Some simple spiders are appearing in vents + # path: events/spider_spawn.ogg + # - id: immovableRodSpawn # The station is moving into an immovable rod, don't die or something, ask Engineering for help repairing it + # path: events/immovable_rod_spawn.ogg + - id: ionStorm # AI-controlled equipment are now weird, check their laws + path: events/ion_storm.ogg + ## Delta-V + - id: xenoVents # Xenomorphs are coming out of vents + path: events/aliens.ogg + ## NyanoTrasen + # - id: noosphericStorm # A large amount of glimmer has joined the station and made people psionic + # path: events/noospheric_storm.ogg + + # Shuttle + - id: shuttleCalled # The shuttle is on its way + path: shuttle/called.ogg + - id: shuttleRecalled # The shuttle is going back to Central Command + path: shuttle/recalled.ogg + - id: shuttleDock # The shuttle has arrived at the station + path: shuttle/dock.ogg + # - id: shuttleNearby # The shuttle couldn't dock, it's at a specified location + # path: shuttle/nearby.ogg + # - id: shuttleGoodLuck # The shuttle could not find its way to the station, good luck crew + # path: shuttle/good_luck.ogg + # - id: shuttleAuthAdded # One of few have added their acceptance to early launching + # path: shuttle/auth_added.ogg + # - id: shuttleAuthRevoked # One of few have revoked their acceptance to early launching + # path: shuttle/auth_revoked.ogg + # - id: shuttleAlmostLaunching # The shuttle will leave to FTL in 10 seconds + # path: shuttle/almost_launching.ogg + # - id: shuttleLeft # The shuttle has left the station + # path: shuttle/left.ogg + + # Fallback # REQUIRED + - id: fallback # Any announcement sent without a valid announcement on this announcer will use this + path: fallback.ogg diff --git a/Resources/Prototypes/Announcers/michael.yml b/Resources/Prototypes/Announcers/michael.yml new file mode 100644 index 00000000000..f63b934fbc6 --- /dev/null +++ b/Resources/Prototypes/Announcers/michael.yml @@ -0,0 +1,134 @@ +- type: announcer + id: Michael + basePath: /Audio/Announcers/Michael + announcements: + # Communications + # - id: announce # Communications console + # path: comms/announce.ogg + - id: attention # Generic alert sound # Should be different from fallback but it's very similar + path: comms/attention.ogg + # - id: commandReport # Station goal, Central Command messages, etc + # path: comms/command_report.ogg + # - id: spawnAnnounceCaptain # Captain arrives on the station # TODO That system is annoyingly not modular + # path: comms/spawn_announce.ogg + # - id: war # Nuclear Operative declaration of war + # path: comms/war.ogg + # - id: nukeCodes # The station has been send nuclear activation codes + # path: comms/nuke_codes.ogg # Or command_report.ogg if you want + # - id: nukeArm # The nuke is active and ticking + # path: comms/nuke_arm.ogg + # - id: nukeDisarm # The nuke has been disarmed + # path: comms/nuke_disarm.ogg + - id: welcome # The shift has started + path: comms/welcome.ogg + + # Alert levels + - id: alertGreen # Everything is fine + path: alerts/green.ogg + - id: alertBlue # Something is amiss + path: alerts/blue.ogg + - id: alertViolet # Viral infection or misc medical emergencies, listen to Medical + path: alerts/violet.ogg + - id: alertWhite # Glimmer is too high, listen to Epistemics + path: alerts/white.ogg + - id: alertYellow # The station is being largely damaged, listen to Engineering + path: alerts/yellow.ogg + - id: alertRed # Generic many things are bad, listen to Security + path: alerts/red.ogg + - id: alertGamma # There is a massive immediate threat to the station, listen to Central Command + path: alerts/gamma.ogg + # - id: alertDelta # The station is being or about to be massively destroyed, run for your life + # path: alerts/delta.ogg + - id: alertEpsilon # The station has been terminated, good luck survivors! + path: alerts/epsilon.ogg + audioParams: + volume: -3 + + # Events + ## Wizard's Den + ### Mid-Round Antagonists + # - id: ninjaHacking # A Ninja is hacking something + # path: comms/ninja_hacking.ogg + # - id: powerSinkExplosion # A power sink is about to overcharge and explode + # path: comms/powersink_explosion.ogg + ### Events + # - id: anomalySpawn # An anomaly has spawned in a random place + # path: events/anomaly.ogg + # - id: bluespaceArtifact # An artifact has spawned in a random place + # path: events/bluespace_artifact.ogg + # - id: bluespaceLocker # Two random lockers now share inventories + # path: events/bluespace_locker.ogg + # - id: breakerFlip # A few random APCs have been disabled, ask Engineering to fix them + # path: events/breaker_flip.ogg + - id: bureaucraticError # Random jobs have been added, removed, or made infinite + path: events/bureaucratic_error.ogg + # - id: clericalError # Random crew are removed from the manifest + # path: events/clerical_error.ogg + # - id: carpRift # A dragon's carp rift is active + # path: events/carp_rift.ogg + # - id: revenantSpawn # A revenant has spawned (by a prober?) + # path: events/revenant_spawn.ogg + - id: gasLeak # A random gas is coming out of a random vent + path: events/gas_leak.ogg + # - id: gasLeakComplete # Gas has stopped coming out of a vent + # path: events/gas_leak-complete.ogg + - id: kudzuGrowth # Kudzu is growing in a random place + path: events/kudzu_growth.ogg + - id: meteorSwarm # Meteors are flying at the station, stay away from windows + path: events/meteors.ogg + # - id: meteorSwarmComplete # Meteors have stopped flying at the station + # path: events/meteors-complete.ogg + # - id: mouseMigration # Several mice have appeared in a random place + # path: events/mouse_migration.ogg + # - id: cockroachMigration # Several cockroaches have appeared in a random place + # path: events/cockroach_migration.ogg + - id: powerGridCheck # The station's power is offline for some moments + path: events/power_grid_check.ogg + - id: powerGridCheckComplete # The station's power is online again + path: events/power_grid_check-complete.ogg + # - id: randomSentience # A random few animals have become sentient + # path: events/random_sentience.ogg + # - id: solarFlare # A solar flare is nearby, may mess with comms and electronics + # path: events/solar_flare.ogg + # - id: solarFlareComplete # The solar flare has passed + # path: events/solar_flare-complete.ogg + - id: ventClog # A random reagent is coming out of a scrubber + path: events/vent_clog.ogg + # - id: slimesSpawn # Some simple slimes are appearing in vents + # path: events/slimes_spawn.ogg + # - id: spiderSpawn # Some simple spiders are appearing in vents + # path: events/spider_spawn.ogg + # - id: immovableRodSpawn # The station is moving into an immovable rod, don't die or something, ask Engineering for help repairing it + # path: events/immovable_rod_spawn.ogg + # - id: ionStorm # AI-controlled equipment are now weird, check their laws + # path: events/ion_storm.ogg + ## Delta-V + - id: xenoVents # Xenomorphs are coming out of vents + path: events/aliens.ogg + ## NyanoTrasen + - id: noosphericStorm # A large amount of glimmer has joined the station and made people psionic + path: events/noospheric_storm.ogg + + # Shuttle + - id: shuttleCalled # The shuttle is on its way + path: shuttle/called.ogg + - id: shuttleRecalled # The shuttle is going back to Central Command + path: shuttle/recalled.ogg + - id: shuttleDock # The shuttle has arrived at the station + path: shuttle/dock.ogg + # - id: shuttleNearby # The shuttle couldn't dock, it's at a specified location + # path: shuttle/nearby.ogg + # - id: shuttleGoodLuck # The shuttle could not find its way to the station, good luck crew + # path: shuttle/good_luck.ogg + # - id: shuttleAuthAdded # One of few have added their acceptance to early launching + # path: shuttle/auth_added.ogg + # - id: shuttleAuthRevoked # One of few have revoked their acceptance to early launching + # path: shuttle/auth_revoked.ogg + # - id: shuttleAlmostLaunching # The shuttle will leave to FTL in 10 seconds + # path: shuttle/almost_launching.ogg + # - id: shuttleLeft # The shuttle has left the station + # path: shuttle/left.ogg + + # Fallback # REQUIRED + - id: fallback # Any announcement sent without a valid announcement on this announcer will use this + path: fallback.ogg diff --git a/Resources/Prototypes/Announcers/neil.yml b/Resources/Prototypes/Announcers/neil.yml new file mode 100644 index 00000000000..1db1828ed11 --- /dev/null +++ b/Resources/Prototypes/Announcers/neil.yml @@ -0,0 +1,134 @@ +- type: announcer + id: NEIL + basePath: /Audio/Announcers/NEIL + baseAudioParams: + volume: -3 + announcements: + # Communications + - id: announce # Communications console + path: comms/announce.ogg + - id: attention # Generic alert sound # Should be different from fallback but it's very similar + path: comms/attention.ogg + # - id: commandReport # Station goal, Central Command messages, etc + # path: comms/command_report.ogg + # - id: spawnAnnounceCaptain # Captain arrives on the station # TODO That system is annoyingly not modular + # path: comms/spawn_announce.ogg + # - id: war # Nuclear Operative declaration of war + # path: comms/war.ogg + # - id: nukeCodes # The station has been send nuclear activation codes + # path: comms/nuke_codes.ogg # Or command_report.ogg if you want + # - id: nukeArm # The nuke is active and ticking + # path: comms/nuke_arm.ogg + # - id: nukeDisarm # The nuke has been disarmed + # path: comms/nuke_disarm.ogg + - id: welcome # The shift has started + path: comms/welcome.ogg + + # Alert levels + - id: alertGreen # Everything is fine + path: alerts/green.ogg + - id: alertBlue # Something is amiss + path: alerts/blue.ogg + - id: alertViolet # Viral infection or misc medical emergencies, listen to Medical + path: alerts/violet.ogg + - id: alertWhite # Glimmer is too high, listen to Epistemics + path: alerts/white.ogg + - id: alertYellow # The station is being largely damaged, listen to Engineering + path: alerts/yellow.ogg + - id: alertRed # Generic many things are bad, listen to Security + path: alerts/red.ogg + - id: alertGamma # There is a massive immediate threat to the station, listen to Central Command + path: alerts/gamma.ogg + - id: alertDelta # The station is being or about to be massively destroyed, run for your life + path: alerts/delta.ogg + - id: alertEpsilon # The station has been terminated, good luck survivors! + path: alerts/epsilon.ogg + + # Events + ## Wizard's Den + ### Mid-Round Antagonists + # - id: ninjaHacking # A Ninja is hacking something + # path: comms/ninja_hacking.ogg + # - id: powerSinkExplosion # A power sink is about to overcharge and explode + # path: comms/powersink_explosion.ogg + ### Events + - id: anomalySpawn # An anomaly has spawned in a random place + path: events/anomaly.ogg + # - id: bluespaceArtifact # An artifact has spawned in a random place + # path: events/bluespace_artifact.ogg + # - id: bluespaceLocker # Two random lockers now share inventories + # path: events/bluespace_locker.ogg + - id: breakerFlip # A few random APCs have been disabled, ask Engineering to fix them + path: events/breaker_flip.ogg + - id: bureaucraticError # Random jobs have been added, removed, or made infinite + path: events/bureaucratic_error.ogg + # - id: clericalError # Random crew are removed from the manifest + # path: events/clerical_error.ogg + # - id: carpRift # A dragon's carp rift is active + # path: events/carp_rift.ogg + # - id: revenantSpawn # A revenant has spawned (by a prober?) + # path: events/revenant_spawn.ogg + - id: gasLeak # A random gas is coming out of a random vent + path: events/gas_leak.ogg + # - id: gasLeakComplete # Gas has stopped coming out of a vent + # path: events/gas_leak-complete.ogg + - id: kudzuGrowth # Kudzu is growing in a random place + path: events/kudzu_growth.ogg + - id: meteorSwarm # Meteors are flying at the station, stay away from windows + path: events/meteors.ogg + # - id: meteorSwarmComplete # Meteors have stopped flying at the station + # path: events/meteors-complete.ogg + # - id: mouseMigration # Several mice have appeared in a random place + # path: events/mouse_migration.ogg + # - id: cockroachMigration # Several cockroaches have appeared in a random place + # path: events/cockroach_migration.ogg + - id: powerGridCheck # The station's power is offline for some moments + path: events/power_grid_check.ogg + - id: powerGridCheckComplete # The station's power is online again + path: events/power_grid_check-complete.ogg + # - id: randomSentience # A random few animals have become sentient + # path: events/random_sentience.ogg + # - id: solarFlare # A solar flare is nearby, may mess with comms and electronics + # path: events/solar_flare.ogg + # - id: solarFlareComplete # The solar flare has passed + # path: events/solar_flare-complete.ogg + - id: ventClog # A random reagent is coming out of a scrubber + path: events/vent_clog.ogg + # - id: slimesSpawn # Some simple slimes are appearing in vents + # path: events/slimes_spawn.ogg + # - id: spiderSpawn # Some simple spiders are appearing in vents + # path: events/spider_spawn.ogg + # - id: immovableRodSpawn # The station is moving into an immovable rod, don't die or something, ask Engineering for help repairing it + # path: events/immovable_rod_spawn.ogg + - id: ionStorm # AI-controlled equipment are now weird, check their laws + path: events/ion_storm.ogg + ## Delta-V + # - id: xenoVents # Xenomorphs are coming out of vents + # path: events/xeno_vents.ogg + ## NyanoTrasen + - id: noosphericStorm # A large amount of glimmer has joined the station and made people psionic + path: events/noospheric_storm.ogg + + # Shuttle + - id: shuttleCalled # The shuttle is on its way + path: shuttle/called.ogg + - id: shuttleRecalled # The shuttle is going back to Central Command + path: shuttle/recalled.ogg + - id: shuttleDock # The shuttle has arrived at the station + path: shuttle/dock.ogg + # - id: shuttleNearby # The shuttle couldn't dock, it's at a specified location + # path: shuttle/nearby.ogg + # - id: shuttleGoodLuck # The shuttle could not find its way to the station, good luck crew + # path: shuttle/good_luck.ogg + # - id: shuttleAuthAdded # One of few have added their acceptance to early launching + # path: shuttle/auth_added.ogg + # - id: shuttleAuthRevoked # One of few have revoked their acceptance to early launching + # path: shuttle/auth_revoked.ogg + # - id: shuttleAlmostLaunching # The shuttle will leave to FTL in 10 seconds + # path: shuttle/almost_launching.ogg + # - id: shuttleLeft # The shuttle has left the station + # path: shuttle/left.ogg + + # Fallback # REQUIRED + - id: fallback # Any announcement sent without a valid announcement on this announcer will use this + path: fallback.ogg diff --git a/Resources/Prototypes/Announcers/template b/Resources/Prototypes/Announcers/template new file mode 100644 index 00000000000..8cd007956de --- /dev/null +++ b/Resources/Prototypes/Announcers/template @@ -0,0 +1,158 @@ +# This should be getting auto detected as YML if you're using VSCode +# If it's not, you can probably manually set the language mode to YML somehow +# Or just change the filename to `template.yml` temporarily +# The game will complain if I name it template.yaml in an attempt to not load it +# +# This file contains instructions for everything you can do with the announcer system +# This also contains every "needed" announcement for any new announcers and descriptions for what they are +# +# Avoid renaming announcement audio files to keep consistency between announcers for workspace searching +# Keep comments on specific announcements and follow this same formatting for every announcer +# If you don't have an announcement audio, comment the announcemt type instead of deleting it + +- type: announcer + id: Announcer # Localized as "announcer--name" in chat + basePath: /Audio/Codebase/Announcements/Announcer # Where to start looking for audio files + baseAudioParams: # Default audio parameters for all announcements, all options explained in the template announcement + volume: -7 # If this announcer is really loud, lower it to match the others' volume #? Default is 3 + announcements: # List of all announcements this announcer has audio for #! Comment out unused announcements, don't remove them + # Template, delete this in real announcer files + - id: template # Lowercase of the event ID, add "Complete" to the end for post-event announcements (endings) + ignoreBasePath: false # If true, it will ignore the basePath and use the path as is + path: template.ogg # Path to the file relative to basePath/, named with snake_case except for "-complete" + collection: AnnouncerTemplateAnnouncements # Collection of audios to randomly use for this, will ignore path if set #! Ignores basePath automatically + message: announcer-announcement-template # Localization key for the announcement message to use instead of the default one # NOTE this does not pass through previous loc args yet + audioParams: # Overrides baseAudioParams entirely for this specific announcement, numbers are all floats + volume: 3 # We don't want individual announcement volumes to vary too much, normalize them with this #? Default is 3 + pitch: 1 #? Default is 1 + playOffsetSeconds: 0 # How many seconds into the audio to start from #? Default is 0 + variation: 0 # Probably wouldn't sound very good unless very low, 0.15 or less is normally used #? Default is 0 + + # Communications + - id: announce # Communications console + path: comms/announce.ogg + - id: attention # Generic alert sound # Should be different from fallback but it's very similar + path: comms/attention.ogg + - id: commandReport # Station goal, Central Command messages, etc + path: comms/command_report.ogg + - id: spawnAnnounce # Captain join # TODO That system is annoyingly not modular + path: comms/spawn_announce.ogg + - id: war # Nuclear Operative declaration of war + path: comms/war.ogg + - id: nukeCodes # The station has been send nuclear activation codes + path: comms/nuke_codes.ogg # Or command_report.ogg if you want + - id: nukeArm # The nuke is active and ticking + path: comms/nuke_arm.ogg + - id: nukeDisarm # The nuke has been disarmed + path: comms/nuke_disarm.ogg + - id: welcome # The shift has started + path: comms/welcome.ogg + + # Alert levels + - id: alertGreen # Everything is fine + path: alerts/green.ogg + - id: alertBlue # Something is amiss + path: alerts/blue.ogg + - id: alertViolet # Viral infection or misc medical emergencies, listen to Medical + path: alerts/violet.ogg + - id: alertWhite # Glimmer is too high, listen to Epistemics + path: alerts/white.ogg + - id: alertYellow # The station is being largely damaged, listen to Engineering + path: alerts/yellow.ogg + - id: alertRed # Generic many things are bad, listen to Security + path: alerts/red.ogg + - id: alertGamma # There is a massive immediate threat to the station, listen to Central Command + path: alerts/gamma.ogg + - id: alertDelta # The station is being or about to be massively destroyed, run for your life + path: alerts/delta.ogg + - id: alertEpsilon # The station has been terminated, good luck survivors! + path: alerts/epsilon.ogg + + # Events + ## Wizard's Den + ### Mid-Round Antagonists + - id: ninjaHacking # A Ninja is hacking something + path: comms/ninja_hacking.ogg + - id: powersinkExplosion # A power sink is about to overcharge and explode + path: comms/powersink_explosion.ogg + ### Events + - id: anomalySpawn # An anomaly has spawned in a random place + path: events/anomaly.ogg + - id: bluespaceArtifact # An artifact has spawned in a random place + path: events/bluespace_artifact.ogg + - id: bluespaceLocker # Two random lockers now share inventories + path: events/bluespace_locker.ogg + - id: breakerFlip # A few random APCs have been disabled, ask Engineering to fix them + path: events/breaker_flip.ogg + - id: bureaucraticError # Random jobs have been added, removed, or made infinite + path: events/bureaucratic_error.ogg + - id: clericalError # Random crew are removed from the manifest + path: events/clerical_error.ogg + - id: carpRift # A dragon's carp rift is active + path: events/carp_rift.ogg + - id: revenantSpawn # A revenant has spawned (by a prober?) + path: events/revenant_spawn.ogg + - id: gasLeak # A random gas is coming out of a random vent + path: events/gas_leak.ogg + - id: gasLeakComplete # Gas has stopped coming out of a vent + path: events/gas_leak-complete.ogg + - id: kudzuGrowth # Kudzu is growing in a random place + path: events/kudzu_growth.ogg + - id: meteorSwarm # Meteors are flying at the station, stay away from windows + path: events/meteors.ogg + - id: meteorSwarmComplete # Meteors have stopped flying at the station + path: events/meteors-complete.ogg + - id: mouseMigration # Several mice have appeared in a random place + path: events/mouse_migration.ogg + - id: cockroachMigration # Several cockroaches have appeared in a random place + path: events/cockroach_migration.ogg + - id: powerGridCheck # The station's power is offline for some moments + path: events/power_grid_check.ogg + - id: powerGridCheckComplete # The station's power is online again + path: events/power_grid_check-complete.ogg + - id: randomSentience # A random few animals have become sentient + path: events/random_sentience.ogg + - id: solarFlare # A solar flare is nearby, may mess with comms and electronics + path: events/solar_flare.ogg + - id: solarFlareComplete # The solar flare has passed + path: events/solar_flare-complete.ogg + - id: ventClog # A random reagent is coming out of a scrubber + path: events/vent_clog.ogg + - id: slimesSpawn # Some simple slimes are appearing in vents + path: events/slimes_spawn.ogg + - id: spiderSpawn # Some simple spiders are appearing in vents + path: events/spider_spawn.ogg + - id: immovableRodSpawn # The station is moving into an immovable rod, don't die or something, ask Engineering for help repairing it + path: events/immovable_rod_spawn.ogg + - id: ionStorm # AI-controlled equipment are now weird, check their laws + path: events/ion_storm.ogg + ## Delta-V + - id: xenoVents # Xenomorphs are coming out of vents + path: events/xeno_vents.ogg + ## NyanoTrasen + - id: noosphericStorm # A large amount of glimmer has joined the station and made people psionic + path: events/noospheric_storm.ogg + + # Shuttle + - id: shuttleCalled # The shuttle is on its way + path: shuttle/called.ogg + - id: shuttleRecalled # The shuttle is going back to Central Command + path: shuttle/recalled.ogg + - id: shuttleDock # The shuttle has arrived at the station + path: shuttle/dock.ogg + - id: shuttleNearby # The shuttle couldn't dock, it's at a specified location + path: shuttle/nearby.ogg + - id: shuttleGoodLuck # The shuttle could not find its way to the station, good luck crew + path: shuttle/good_luck.ogg + - id: shuttleAuthAdded # One of few have added their acceptance to early launching + path: shuttle/auth_added.ogg + - id: shuttleAuthRevoked # One of few have revoked their acceptance to early launching + path: shuttle/auth_revoked.ogg + - id: shuttleAlmostLaunching # The shuttle will leave to FTL in 10 seconds + path: shuttle/almost_launching.ogg + - id: shuttleLeft # The shuttle has left the station + path: shuttle/left.ogg + + # Fallback # REQUIRED + - id: fallback # Any announcement sent without a valid announcement on this announcer will use this + path: fallback.ogg diff --git a/Resources/Prototypes/Announcers/voxfem.yml b/Resources/Prototypes/Announcers/voxfem.yml new file mode 100644 index 00000000000..bcf518e0a2c --- /dev/null +++ b/Resources/Prototypes/Announcers/voxfem.yml @@ -0,0 +1,132 @@ +- type: announcer + id: VoxFem + basePath: /Audio/Announcers/VoxFem + announcements: + # Communications + - id: announce # Communications console + path: comms/announce.ogg + - id: attention # Generic alert sound # Should be different from fallback but it's very similar + path: comms/attention.ogg + - id: commandReport # Station goal, Central Command messages, etc + path: comms/command_report.ogg + # - id: spawnAnnounceCaptain # Captain arrives on the station # TODO That system is annoyingly not modular + # path: comms/spawn_announce.ogg + # - id: war # Nuclear Operative declaration of war + # path: comms/war.ogg + # - id: nukeCodes # The station has been send nuclear activation codes + # path: comms/nuke_codes.ogg # Or command_report.ogg if you want + # - id: nukeArm # The nuke is active and ticking + # path: comms/nuke_arm.ogg + # - id: nukeDisarm # The nuke has been disarmed + # path: comms/nuke_disarm.ogg + - id: welcome # The shift has started + path: comms/welcome.ogg + + # Alert levels + # - id: alertGreen # Everything is fine + # path: alerts/green.ogg + # - id: alertBlue # Something is amiss + # path: alerts/blue.ogg + # - id: alertViolet # Viral infection or misc medical emergencies, listen to Medical + # path: alerts/violet.ogg + # - id: alertWhite # Glimmer is too high, listen to Epistemics + # path: alerts/white.ogg + # - id: alertYellow # The station is being largely damaged, listen to Engineering + # path: alerts/yellow.ogg + # - id: alertRed # Generic many things are bad, listen to Security + # path: alerts/red.ogg + # - id: alertGamma # There is a massive immediate threat to the station, listen to Central Command + # path: alerts/gamma.ogg + # - id: alertDelta # The station is being or about to be massively destroyed, run for your life + # path: alerts/delta.ogg + # - id: alertEpsilon # The station has been terminated, good luck survivors! + # path: alerts/epsilon.ogg + + # Events + ## Wizard's Den + ### Mid-Round Antagonists + - id: ninjaHacking # A Ninja is hacking something + path: comms/ninja_hacking.ogg + - id: powerSinkExplosion # A power sink is about to overcharge and explode + path: comms/powersink_explosion.ogg + ### Events + # - id: anomalySpawn # An anomaly has spawned in a random place + # path: events/anomaly.ogg + # - id: bluespaceArtifact # An artifact has spawned in a random place + # path: events/bluespace_artifact.ogg + # - id: bluespaceLocker # Two random lockers now share inventories + # path: events/bluespace_locker.ogg + # - id: breakerFlip # A few random APCs have been disabled, ask Engineering to fix them + # path: events/breaker_flip.ogg + # - id: bureaucraticError # Random jobs have been added, removed, or made infinite + # path: events/bureaucratic_error.ogg + # - id: clericalError # Random crew are removed from the manifest + # path: events/clerical_error.ogg + # - id: carpRift # A dragon's carp rift is active + # path: events/carp_rift.ogg + # - id: revenantSpawn # A revenant has spawned (by a prober?) + # path: events/revenant_spawn.ogg + # - id: gasLeak # A random gas is coming out of a random vent + # path: events/gas_leak.ogg + # - id: gasLeakComplete # Gas has stopped coming out of a vent + # path: events/gas_leak-complete.ogg + # - id: kudzuGrowth # Kudzu is growing in a random place + # path: events/kudzu_growth.ogg + - id: meteorSwarm # Meteors are flying at the station, stay away from windows + path: events/meteors.ogg + # - id: meteorSwarmComplete # Meteors have stopped flying at the station + # path: events/meteors-complete.ogg + # - id: mouseMigration # Several mice have appeared in a random place + # path: events/mouse_migration.ogg + # - id: cockroachMigration # Several cockroaches have appeared in a random place + # path: events/cockroach_migration.ogg + - id: powerGridCheck # The station's power is offline for some moments + path: events/power_grid_check.ogg + - id: powerGridCheckComplete # The station's power is online again + path: events/power_grid_check-complete.ogg + # - id: randomSentience # A random few animals have become sentient + # path: events/random_sentience.ogg + # - id: solarFlare # A solar flare is nearby, may mess with comms and electronics + # path: events/solar_flare.ogg + # - id: solarFlareComplete # The solar flare has passed + # path: events/solar_flare-complete.ogg + # - id: ventClog # A random reagent is coming out of a scrubber + # path: events/vent_clog.ogg + # - id: slimesSpawn # Some simple slimes are appearing in vents + # path: events/slimes_spawn.ogg + # - id: spiderSpawn # Some simple spiders are appearing in vents + # path: events/spider_spawn.ogg + # - id: immovableRodSpawn # The station is moving into an immovable rod, don't die or something, ask Engineering for help repairing it + # path: events/immovable_rod_spawn.ogg + - id: ionStorm # AI-controlled equipment are now weird, check their laws + path: events/ion_storm.ogg + ## Delta-V + - id: xenoVents # Xenomorphs are coming out of vents + path: events/aliens.ogg + ## NyanoTrasen + # - id: noosphericStorm # A large amount of glimmer has joined the station and made people psionic + # path: events/noospheric_storm.ogg + + # Shuttle + - id: shuttleCalled # The shuttle is on its way + path: shuttle/called.ogg + - id: shuttleRecalled # The shuttle is going back to Central Command + path: shuttle/recalled.ogg + - id: shuttleDock # The shuttle has arrived at the station + path: shuttle/dock.ogg + # - id: shuttleNearby # The shuttle couldn't dock, it's at a specified location + # path: shuttle/nearby.ogg + # - id: shuttleGoodLuck # The shuttle could not find its way to the station, good luck crew + # path: shuttle/good_luck.ogg + # - id: shuttleAuthAdded # One of few have added their acceptance to early launching + # path: shuttle/auth_added.ogg + # - id: shuttleAuthRevoked # One of few have revoked their acceptance to early launching + # path: shuttle/auth_revoked.ogg + # - id: shuttleAlmostLaunching # The shuttle will leave to FTL in 10 seconds + # path: shuttle/almost_launching.ogg + # - id: shuttleLeft # The shuttle has left the station + # path: shuttle/left.ogg + + # Fallback # REQUIRED + - id: fallback # Any announcement sent without a valid announcement on this announcer will use this + path: fallback.ogg diff --git a/Resources/Prototypes/Catalog/Bounties/bounties.yml b/Resources/Prototypes/Catalog/Bounties/bounties.yml index 62a3a4162f3..c8c35aabfe4 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/Fills/Boxes/general.yml b/Resources/Prototypes/Catalog/Fills/Boxes/general.yml index 7840602362f..e4181d27a21 100644 --- a/Resources/Prototypes/Catalog/Fills/Boxes/general.yml +++ b/Resources/Prototypes/Catalog/Fills/Boxes/general.yml @@ -14,6 +14,15 @@ - 0,0,2,2 - type: Sprite state: box + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/cardboardbox_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/cardboardbox_drop.ogg + - type: EmitSoundOnLand + sound: /Audio/SimpleStation14/Items/Handling/cardboardbox_drop.ogg + - type: Tag + tags: + - BoxCardboard - type: entity name: mousetrap box diff --git a/Resources/Prototypes/Catalog/Fills/Boxes/syndicate.yml b/Resources/Prototypes/Catalog/Fills/Boxes/syndicate.yml index 53c526f0339..7b5b05a49a5 100644 --- a/Resources/Prototypes/Catalog/Fills/Boxes/syndicate.yml +++ b/Resources/Prototypes/Catalog/Fills/Boxes/syndicate.yml @@ -38,14 +38,31 @@ name: observations kit suffix: Filled components: - - type: StorageFill - contents: - - id: SyndiCrewMonitorEmpty - amount: 1 - - id: PowerCellHigh - amount: 1 - - id: ClothingEyesGlassesHiddenSecurity - amount: 1 - - id: SurveillanceCameraMonitorCircuitboard - amount: 1 + - type: StorageFill + contents: + - id: SyndiCrewMonitorEmpty + amount: 1 + - id: PowerCellHigh + amount: 1 + - id: ClothingEyesGlassesHiddenSecurity + amount: 1 + - id: SurveillanceCameraMonitorCircuitboard + amount: 1 +- type: entity + parent: BoxCardboard + id: ThrowingKnivesKit + name: throwing knives kit + description: A set of 4 syndicate branded throwing knives, perfect for embedding into the body of your victims. + components: + - type: Storage + grid: + - 0,0,3,1 + - type: StorageFill + contents: + - id: ThrowingKnife + amount: 4 + - type: Sprite + layers: + - state: box_of_doom + - state: throwing_knives diff --git a/Resources/Prototypes/Catalog/Fills/Crates/fun.yml b/Resources/Prototypes/Catalog/Fills/Crates/fun.yml index cc5e3b1d174..26d0f47315f 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/fun.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/fun.yml @@ -30,6 +30,7 @@ amount: 2 - id: PlushieArachind - id: PlushiePenguin + - id: PlushieArachne - type: entity id: CrateFunLizardPlushieBulk diff --git a/Resources/Prototypes/Catalog/VendingMachines/Advertisements/fitness.yml b/Resources/Prototypes/Catalog/VendingMachines/Advertisements/fitness.yml new file mode 100644 index 00000000000..4e3050c27b5 --- /dev/null +++ b/Resources/Prototypes/Catalog/VendingMachines/Advertisements/fitness.yml @@ -0,0 +1,14 @@ +- type: advertisementsPack + id: FitnessVendAds + advertisements: + - advertisement-fitness-1 + - advertisement-fitness-2 + - advertisement-fitness-3 + - advertisement-fitness-4 + - advertisement-fitness-5 + - advertisement-fitness-6 + - advertisement-fitness-7 + - advertisement-fitness-8 + - advertisement-fitness-9 + thankyous: + - vending-machine-thanks diff --git a/Resources/Prototypes/Catalog/VendingMachines/Advertisements/hotfood.yml b/Resources/Prototypes/Catalog/VendingMachines/Advertisements/hotfood.yml new file mode 100644 index 00000000000..98b017558ef --- /dev/null +++ b/Resources/Prototypes/Catalog/VendingMachines/Advertisements/hotfood.yml @@ -0,0 +1,9 @@ +- type: advertisementsPack + id: HotfoodAds + advertisements: + - advertisement-hotfood-1 + - advertisement-hotfood-2 + - advertisement-hotfood-3 + - advertisement-hotfood-4 + thankyous: + - vending-machine-thanks diff --git a/Resources/Prototypes/Catalog/VendingMachines/Advertisements/solsnack.yml b/Resources/Prototypes/Catalog/VendingMachines/Advertisements/solsnack.yml new file mode 100644 index 00000000000..1e0ddddc046 --- /dev/null +++ b/Resources/Prototypes/Catalog/VendingMachines/Advertisements/solsnack.yml @@ -0,0 +1,8 @@ +- type: advertisementsPack + id: SolsnackAds + advertisements: + - advertisement-solsnack-1 + - advertisement-solsnack-2 + - advertisement-solsnack-3 + thankyous: + - vending-machine-thanks diff --git a/Resources/Prototypes/Catalog/VendingMachines/Advertisements/weebvend.yml b/Resources/Prototypes/Catalog/VendingMachines/Advertisements/weebvend.yml new file mode 100644 index 00000000000..01efe7be696 --- /dev/null +++ b/Resources/Prototypes/Catalog/VendingMachines/Advertisements/weebvend.yml @@ -0,0 +1,8 @@ +- type: advertisementsPack + id: WeebVendAds + advertisements: + - advertisement-weebvend-1 + - advertisement-weebvend-2 + - advertisement-weebvend-3 + thankyous: + - vending-machine-thanks diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml index 04cc2e3e19d..2c4c27137f0 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml @@ -86,10 +86,15 @@ ClothingOuterDenimJacket: 2 # DeltaV - Clothing addition ClothingOuterCorporateJacket: 2 # DeltaV - Clothing addition ClothingOuterCsCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterEECorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterHICorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterHMCorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterEeCorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterHiCorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterHmCorporateJacket: 2 # Einstein Engines - Clothing addition ClothingOuterIdCorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterZhCorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterGeCorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterFaCorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterDdCorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterBcCorporateJacket: 2 # Einstein Engines - Clothing addition ClothingShoesBootsFishing: 2 # Nyano - Clothing addition ClothingHeadTinfoil: 2 # Nyano - Clothing addition ClothingHeadFishCap: 2 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/fitness.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/fitness.yml new file mode 100644 index 00000000000..f0e13aa2780 --- /dev/null +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/fitness.yml @@ -0,0 +1,11 @@ +- type: vendingMachineInventory + id: FitnessVendInventory + startingInventory: + FoodSnackProteinbar: 3 + FoodCondimentPacketProtein: 3 + DrinkMilkCartonMini: 3 + DrinkMilkCartonMiniChocolate: 3 + DrinkWaterBottleFull: 3 + DrinkFitnessShakerBlack: 2 + DrinkFitnessShakerRed: 2 + DrinkFitnessShakerBlue: 2 \ No newline at end of file diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/hotfood.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/hotfood.yml new file mode 100644 index 00000000000..964fa746b33 --- /dev/null +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/hotfood.yml @@ -0,0 +1,8 @@ +- type: vendingMachineInventory + id: HotfoodInventory + startingInventory: + FoodSnackAncientBurger: 1 + FoodSnackAncientPizza: 1 + FoodSnackAncientFries: 1 + FoodSnackAncientHotdog: 1 + FoodSnackAncientTaco: 1 \ No newline at end of file diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/solsnack.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/solsnack.yml new file mode 100644 index 00000000000..5bb5e9e7cf2 --- /dev/null +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/solsnack.yml @@ -0,0 +1,13 @@ +- type: vendingMachineInventory + id: SolsnackInventory + startingInventory: + FoodSnackLunacakeWrapped: 3 + FoodSnackMochicakeWrapped: 3 + FoodSnackMooncakeWrapped: 3 + FoodSnackTidegobs: 3 + FoodSnackSaturnos: 3 + FoodSnackJoveGello: 3 + FoodSnackPlutoniumrods: 3 + FoodSnackMarsFrouka: 3 + FoodSnackVenusianhotcakes: 3 + FoodSnackOortrocks: 3 \ No newline at end of file diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/weebvend.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/weebvend.yml new file mode 100644 index 00000000000..fffe81199a9 --- /dev/null +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/weebvend.yml @@ -0,0 +1,8 @@ +- type: vendingMachineInventory + id: WeebVendInventory + startingInventory: + FoodSnackRedalertnuts: 3 + FoodSnackRicecake: 3 + FoodSnackPokeysticks: 3 + FoodSnackChocobanana: 3 + FoodSnackDango: 3 \ No newline at end of file diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 1e81cdf2dd1..63a748e082d 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -65,6 +65,17 @@ categories: - UplinkWeapons +- type: listing + id: UplinkThrowingKnivesKit + name: uplink-knives-kit-name + description: uplink-knives-kit-desc + icon: { sprite: /Textures/Objects/Storage/boxicons.rsi, state: throwing_knives } + productEntity: ThrowingKnivesKit + cost: + Telecrystal: 6 + categories: + - UplinkWeapons + - type: listing id: UplinkGlovesNorthStar name: uplink-gloves-north-star-name @@ -254,16 +265,6 @@ tags: - NukeOpsUplink -- type: listing - id: UplinkSyndicateBombFake - name: uplink-exploding-syndicate-bomb-fake-name - description: uplink-exploding-syndicate-bomb-fake-desc - productEntity: SyndicateBombFake - cost: - Telecrystal: 4 - categories: - - UplinkExplosives - - type: listing id: UplinkClusterGrenade name: uplink-cluster-grenade-name @@ -776,7 +777,19 @@ cost: Telecrystal: 6 categories: - - UplinkBundles + - UplinkBundles + +- type: listing + id: UplinkSyndicateBombFake + name: uplink-exploding-syndicate-bomb-fake-name + description: uplink-exploding-syndicate-bomb-fake-desc + productEntity: SyndicateBombFake + cost: + Telecrystal: 4 + categories: + - UplinkDeception + +# Disruption - type: listing id: UplinkAmmoBundle @@ -1228,6 +1241,16 @@ # Armor +- type: listing + id: UplinkChestRig + name: uplink-chest-rig-name + description: uplink-chest-rig-desc + productEntity: ClothingBeltMilitaryWebbing + cost: + Telecrystal: 1 + categories: + - UplinkArmor + - type: listing id: UplinkChameleon name: uplink-chameleon-name diff --git a/Resources/Prototypes/DeltaV/Body/Prototypes/harpy.yml b/Resources/Prototypes/DeltaV/Body/Prototypes/harpy.yml index 5b3615c55d8..25988f4a3a8 100644 --- a/Resources/Prototypes/DeltaV/Body/Prototypes/harpy.yml +++ b/Resources/Prototypes/DeltaV/Body/Prototypes/harpy.yml @@ -13,10 +13,10 @@ torso: part: TorsoHarpy connections: - - left arm - right arm - - left leg + - left arm - right leg + - left leg organs: heart: OrganHumanHeart lungs: OrganHarpyLungs @@ -47,4 +47,3 @@ part: RightFootHarpy left foot: part: LeftFootHarpy - diff --git a/Resources/Prototypes/DeltaV/Body/Prototypes/vulpkanin.yml b/Resources/Prototypes/DeltaV/Body/Prototypes/vulpkanin.yml index 3d1552ac81f..cdf787e4736 100644 --- a/Resources/Prototypes/DeltaV/Body/Prototypes/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Body/Prototypes/vulpkanin.yml @@ -1,4 +1,4 @@ -- type: body +- type: body name: "vulpkanin" id: Vulpkanin root: torso @@ -19,10 +19,10 @@ liver: OrganAnimalLiver kidneys: OrganHumanKidneys connections: - - left arm - right arm - - left leg + - left arm - right leg + - left leg right arm: part: RightArmVulpkanin connections: diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml index f3fdeabd107..99021b47e42 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml @@ -234,7 +234,7 @@ sprite: DeltaV/Clothing/Uniforms/Jumpsuit/centcom_officer.rsi - type: entity - parent: ClothingUniformBase + parent: ClothingUniformSkirtBase id: ClothingUniformJumpsuitKilt name: kilt description: A fine bit o' garb for the lad an' lasses. @@ -253,4 +253,4 @@ - type: Sprite sprite: DeltaV/Clothing/Uniforms/Jumpsuit/chemshirtsuit.rsi - type: Clothing - sprite: DeltaV/Clothing/Uniforms/Jumpsuit/chemshirtsuit.rsi \ No newline at end of file + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/chemshirtsuit.rsi diff --git a/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/Random/miningrock.yml b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/Random/miningrock.yml index f4aef8284b8..204901d8bda 100644 --- a/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/Random/miningrock.yml +++ b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/Random/miningrock.yml @@ -17,14 +17,17 @@ - Barricade - MountainRockMining - MountainRock - - RandomCrystalSpawner + - RandomStalagmiteOrCrystal - RandomWallRockSpawner - RandomBasaltRockSpawner + - AsteroidRockOreCrab + - RandomWoodenStructure rareChance: 0.15 - type: entity name: Crystal Spawner id: RandomCrystalSpawner + suffix: 100% parent: MarkerBase components: - type: Sprite @@ -81,4 +84,19 @@ - WallRockBasaltTin - WallRockBasaltUranium - WallRockBasaltArtifactFragment -#Might add chance for no crystal later?? + +- type: entity + id: RandomWoodenStructure + name: wooden wall or support spawner + parent: MarkerBase + components: + - type: Sprite + layers: + - state: red + - sprite: Objects/Decoration/mines.rsi + state: support_wall_broken + - type: RandomSpawner + prototypes: + - RandomWoodenWall + - RandomWoodenSupport + chance: 0.9 diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml index 9118692a082..bd1ad12a326 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml @@ -15,7 +15,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy - type: marking @@ -32,7 +32,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: classicharpy - type: marking @@ -49,7 +49,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpyfolded - type: marking @@ -66,7 +66,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi + - sprite: Mobs/Customization/Harpy/harpy_ears.rsi state: harpy_ears_default - type: marking @@ -83,7 +83,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi + - sprite: Mobs/Customization/Harpy/harpy_tails.rsi state: phoenix_tail - type: marking @@ -99,7 +99,7 @@ fallbackTypes: - !type:SimpleColoring sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi + - sprite: Mobs/Customization/Harpy/harpy_tails.rsi state: rooster_tail @@ -116,8 +116,26 @@ fallbackTypes: - !type:SimpleColoring sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi - state: finch_tail + - sprite: Mobs/Customization/Harpy/harpy_tails36x36.rsi + state: finch_tail + +- type: marking + id: HarpyTailPeacock + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Harpy] + coloring: + default: + type: + !type:CategoryColoring + category: Hair + fallbackTypes: + - !type:SimpleColoring + sprites: + - sprite: Mobs/Customization/Harpy/harpy_tails48x48.rsi + state: peacock_tail_feathers + - sprite: Mobs/Customization/Harpy/harpy_tails48x48.rsi + state: peacock_tail_eyes - type: marking id: HarpyWing2ToneClassic @@ -125,9 +143,9 @@ markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy2tone1 - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy2tone2 - type: marking @@ -136,11 +154,11 @@ markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy3tone1 - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy3tone2 - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy3tone3 - type: marking @@ -149,9 +167,9 @@ markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpyspeckled1 - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpyspeckled2 - type: marking @@ -160,9 +178,9 @@ markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpyundertone1 - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpyundertone2 - type: marking @@ -171,9 +189,9 @@ markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpywingtip1 - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpywingtip2 - type: marking @@ -190,9 +208,9 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi + - sprite: Mobs/Customization/Harpy/harpy_chest.rsi state: upper - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi + - sprite: Mobs/Customization/Harpy/harpy_chest.rsi state: lower - type: marking @@ -209,7 +227,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi + - sprite: Mobs/Customization/Harpy/harpy_legs.rsi state: thighs - type: marking @@ -223,7 +241,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi + - sprite: Mobs/Customization/Harpy/harpy_legs.rsi state: feet - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi + - sprite: Mobs/Customization/Harpy/harpy_legs.rsi state: talons diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml index 92615131f05..dd59d74d3f0 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml @@ -66,6 +66,11 @@ - type: Tag tags: - VimPilot + - type: LanguageKnowledge + speaks: + - Fox + understands: + - Fox - type: entity name: security dog @@ -154,8 +159,6 @@ spawned: - id: FoodMeat amount: 2 - - type: ReplacementAccent - accent: dog - type: InteractionPopup successChance: 0.5 interactSuccessString: petting-success-dog @@ -176,3 +179,9 @@ tags: - DoorBumpOpener - VimPilot + - type: LanguageKnowledge + speaks: + - Dog + understands: + - Dog + - GalacticCommon diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml index 771da36719f..2dad0fe2e65 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml @@ -95,6 +95,11 @@ factions: - PsionicInterloper - NanoTrasen + - type: LanguageKnowledge + speaks: + - GalacticCommon + understands: + - GalacticCommon - type: GhostTakeoverAvailable - type: GhostRole makeSentient: true diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml index 96950317c1f..8968f0e77ad 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml @@ -96,8 +96,12 @@ spawned: - id: FoodMeat amount: 1 - - type: ReplacementAccent - accent: mouse + - type: LanguageKnowledge + speaks: + - Mouse + understands: + - Mouse + - GalacticCommon - type: Tag tags: - VimPilot @@ -163,4 +167,4 @@ interactFailureString: petting-failure-nukie-mouse interactSuccessSpawn: EffectHearts interactSuccessSound: - path: /Audio/Animals/mouse_squeak.ogg \ No newline at end of file + path: /Audio/Animals/mouse_squeak.ogg diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml index a4498299c9a..9b851ffa522 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml @@ -54,7 +54,6 @@ visible: false - map: [ "id" ] - map: [ "gloves" ] - - map: [ "shoes" ] - map: [ "ears" ] - map: [ "outerClothing" ] - map: [ "eyes" ] @@ -122,12 +121,26 @@ - type: MovementSpeedModifier baseWalkSpeed: 2.5 baseSprintSpeed: 5.0 - - type: Inventory + weightlessAcceleration: 2.5 + - type: Inventory speciesId: harpy templateId: digitigrade - type: HarpyVisuals - type: UltraVision - + - type: Tag + tags: + - CanPilot + - FootstepSound + - DoorBumpOpener + - ShoesRequiredStepTriggerImmune + - type: LanguageKnowledge + speaks: + - GalacticCommon + - SolCommon + understands: + - GalacticCommon + - SolCommon + - type: entity save: false name: Urist McHands @@ -138,8 +151,9 @@ components: - type: HumanoidAppearance species: Harpy - - type: Inventory + - type: Inventory speciesId: harpy + templateId: digitigrade - type: Sprite scale: 0.9, 0.9 layers: @@ -160,7 +174,6 @@ - map: ["enum.HumanoidVisualLayers.RHand"] - map: [ "id" ] - map: [ "gloves" ] - - map: [ "shoes" ] - map: [ "ears" ] - map: [ "outerClothing" ] - map: [ "eyes" ] diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml index 4a187d51b33..9e4f80bfb52 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml @@ -97,6 +97,13 @@ Female: FemaleVulpkanin Unsexed: MaleVulpkanin - type: DogVision + - type: LanguageKnowledge + speaks: + - GalacticCommon + - Canilunzt + understands: + - GalacticCommon + - Canilunzt - type: entity save: false diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/cartridges.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/cartridges.yml index e3d5e9d2138..def215cee43 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/cartridges.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/cartridges.yml @@ -17,4 +17,24 @@ icon: sprite: DeltaV/Icons/cri.rsi state: cri - - type: CrimeAssistCartridge + +- type: entity + parent: BaseItem + id: SecWatchCartridge + name: sec watch cartridge + description: A cartridge that tracks the status of currently wanted individuals. + components: + - type: Sprite + sprite: DeltaV/Objects/Devices/cartridge.rsi + state: cart-cri + - type: Icon + sprite: DeltaV/Objects/Devices/cartridge.rsi + state: cart-cri + - type: UIFragment + ui: !type:SecWatchUi + - type: Cartridge + programName: sec-watch-program-name + icon: + sprite: Objects/Weapons/Melee/stunbaton.rsi + state: stunbaton_on + - type: SecWatchCartridge diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml index 6ee3a7543f7..d9607390cd7 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml @@ -20,12 +20,13 @@ map: [ "enum.PdaVisualLayers.IdLight" ] shader: "unshaded" visible: false - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: Pda id: BrigmedicIDCard state: pda-corpsman diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Walls/mountain.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Walls/mountain.yml index 43d56751716..575687336ad 100644 --- a/Resources/Prototypes/DeltaV/Entities/Structures/Walls/mountain.yml +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Walls/mountain.yml @@ -69,7 +69,7 @@ id: MountainRock parent: BaseStructure name: mountain rock - suffix: un-mineable + suffix: Un-mineable description: A craggy mountain wall. It is too hard to mine. components: - type: Sprite @@ -107,7 +107,7 @@ id: AsteroidAltRockMining parent: AsteroidAltRock name: asteroid rock - suffix: higher ore yield + suffix: Higher Ore Yield description: A rocky asteroid. components: - type: Gatherable @@ -117,3 +117,14 @@ - type: OreVein oreChance: 0.33 oreRarityPrototypeId: RandomOreDistributionStandard + +- type: entity + id: AsteroidRockOreCrab + parent: AsteroidAltRock + name: asteroid rock + suffix: Ore Crab + description: A rocky asteroid. + components: + - type: OreVein + oreChance: 0.33 + oreRarityPrototypeId: OreCrab diff --git a/Resources/Prototypes/DeltaV/GameRules/events.yml b/Resources/Prototypes/DeltaV/GameRules/events.yml index 9391756492b..9a2b9a4569d 100644 --- a/Resources/Prototypes/DeltaV/GameRules/events.yml +++ b/Resources/Prototypes/DeltaV/GameRules/events.yml @@ -4,9 +4,7 @@ noSpawn: true components: - type: StationEvent - startAnnouncement: station-event-xeno-vent-start-announcement - startAudio: - path: /Audio/Announcements/aliens.ogg + startAnnouncement: true earliestStart: 20 minimumPlayers: 15 weight: 1 diff --git a/Resources/Prototypes/DeltaV/InventoryTemplates/digitigrade_inventory_template.yml b/Resources/Prototypes/DeltaV/InventoryTemplates/digitigrade_inventory_template.yml index 158541571aa..fc7dbda9321 100644 --- a/Resources/Prototypes/DeltaV/InventoryTemplates/digitigrade_inventory_template.yml +++ b/Resources/Prototypes/DeltaV/InventoryTemplates/digitigrade_inventory_template.yml @@ -1,13 +1,6 @@ - type: inventoryTemplate id: digitigrade slots: - - name: shoes - slotTexture: shoes - slotFlags: FEET - stripTime: 3 - uiWindowPos: 1,0 - strippingWindowPos: 1,3 - displayName: Shoes - name: jumpsuit slotTexture: uniform slotFlags: INNERCLOTHING diff --git a/Resources/Prototypes/DeltaV/SoundCollections/harpy.yml b/Resources/Prototypes/DeltaV/SoundCollections/harpy.yml index d9a3fd92173..68133faac09 100644 --- a/Resources/Prototypes/DeltaV/SoundCollections/harpy.yml +++ b/Resources/Prototypes/DeltaV/SoundCollections/harpy.yml @@ -19,6 +19,10 @@ - /Audio/Voice/Moth/moth_scream.ogg - /Audio/Voice/Skeleton/skeleton_scream.ogg - /Audio/Voice/Reptilian/reptilian_scream.ogg + - /Audio/Voice/Slime/slime_scream_m1.ogg + - /Audio/Voice/Slime/slime_scream_m2.ogg + - /Audio/Voice/Slime/slime_scream_f1.ogg + - /Audio/Voice/Slime/slime_scream_f2.ogg - type: soundCollection id: HarpyLaugh @@ -32,6 +36,9 @@ - /Audio/Animals/lizard_happy.ogg - /Audio/Animals/ferret_happy.ogg - /Audio/Voice/Moth/moth_laugh.ogg + - /Audio/Voice/Slime/slime_laugh_m1.ogg + - /Audio/Voice/Slime/slime_laugh_m2.ogg + - /Audio/Voice/Slime/slime_laugh_f1.ogg - type: soundCollection id: HarpyHisses @@ -217,7 +224,7 @@ - type: soundCollection id: HarpyChitter - files: + files: - /Audio/Voice/Moth/moth_chitter.ogg - /Audio/Machines/circuitprinter.ogg - /Audio/Machines/diagnoser_printing.ogg @@ -226,18 +233,18 @@ - type: soundCollection id: HarpySqueak - files: + files: - /Audio/Voice/Moth/moth_squeak.ogg - /Audio/Animals/mouse_squeak.ogg - type: soundCollection id: HarpyCaws - files: + files: - /Audio/DeltaV/Voice/Harpy/caw1.ogg - type: soundCollection id: HarpyChirps - files: + files: - /Audio/DeltaV/Voice/Harpy/chirp1.ogg - /Audio/Voice/Talk/pai.ogg - /Audio/Voice/Talk/pai_ask.ogg diff --git a/Resources/Prototypes/DeltaV/Species/harpy.yml b/Resources/Prototypes/DeltaV/Species/harpy.yml index bcc4dd22c44..384b327ff24 100644 --- a/Resources/Prototypes/DeltaV/Species/harpy.yml +++ b/Resources/Prototypes/DeltaV/Species/harpy.yml @@ -7,6 +7,12 @@ markingLimits: MobHarpyMarkingLimits dollPrototype: MobHarpyDummy skinColoration: HumanToned + minHeight: 0.6 + defaultHeight: 0.8 + maxHeight: 1.1 + minWidth: 0.55 + defaultWidth: 0.8 + maxWidth: 1.15 - type: speciesBaseSprites id: MobHarpySprites diff --git a/Resources/Prototypes/DeltaV/Traits/altvision.yml b/Resources/Prototypes/DeltaV/Traits/altvision.yml index c361d1b51d8..1257c1eeb09 100644 --- a/Resources/Prototypes/DeltaV/Traits/altvision.yml +++ b/Resources/Prototypes/DeltaV/Traits/altvision.yml @@ -1,13 +1,35 @@ - type: trait id: UltraVision - name: trait-ultravision-name - description: trait-ultravision-desc + category: Visual + points: -1 + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Vulpkanin + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterTraitRequirement + inverted: true + traits: + - DogVision components: - type: UltraVision - type: trait id: DogVision - name: trait-deuteranopia-name - description: trait-deuteranopia-desc + category: Visual + points: -1 + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Vulpkanin + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterTraitRequirement + inverted: true + traits: + - UltraVision components: - type: DogVision diff --git a/Resources/Prototypes/DeltaV/Traits/neutral.yml b/Resources/Prototypes/DeltaV/Traits/neutral.yml index 79a6771a362..6168d7045a9 100644 --- a/Resources/Prototypes/DeltaV/Traits/neutral.yml +++ b/Resources/Prototypes/DeltaV/Traits/neutral.yml @@ -1,7 +1,6 @@ - type: trait id: ScottishAccent - name: trait-scottish-accent-name - description: trait-scottish-accent-desc - traitGear: BagpipeInstrument + category: Speech + points: 0 components: - - type: ScottishAccent \ No newline at end of file + - type: ScottishAccent diff --git a/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml b/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml index fbd5a02fa08..d72006f6c41 100644 --- a/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml +++ b/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml @@ -30,6 +30,7 @@ delay: 0.5 - type: ExplosionResistance damageCoefficient: 0.9 + - type: AllowsSleepInside # DeltaV - enable sleeping inside bags - type: entity parent: ClothingBackpack @@ -258,7 +259,7 @@ - type: Sprite sprite: Clothing/Back/Backpacks/syndicate.rsi - type: ExplosionResistance - damageCoefficient: 0.1 + damageCoefficient: 0.1 #Special - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/Belt/base_clothingbelt.yml b/Resources/Prototypes/Entities/Clothing/Belt/base_clothingbelt.yml index 2f904d3438c..50b1596c725 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/base_clothingbelt.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/base_clothingbelt.yml @@ -10,11 +10,22 @@ - type: Clothing slots: [belt] quickEquip: false + equipSound: + path: /Audio/SimpleStation14/Items/Equip/toolbelt_equip.ogg + clothingVisuals: + belt2: #there should be a cleaner way to do this tbh + - state: equipped-BELT - type: PhysicalComposition materialComposition: Cloth: 50 - type: StaticPrice price: 25 + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/toolbelt_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/toolbelt_drop.ogg + - type: EmitSoundOnLand + sound: /Audio/SimpleStation14/Items/Handling/toolbelt_drop.ogg - type: entity abstract: true diff --git a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml index 1f90b421526..d90945a7eba 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml @@ -514,6 +514,8 @@ name: Sabre insertVerbText: sheath-insert-verb ejectVerbText: sheath-eject-verb + insertSound: /Audio/SimpleStation14/Items/Handling/sword_sheath.ogg + ejectSound: /Audio/SimpleStation14/Items/Handling/sword_unsheath.ogg whitelist: tags: - CaptainSabre @@ -607,6 +609,20 @@ - type: Clothing sprite: Clothing/Belt/securitywebbing.rsi +- type: entity + parent: ClothingBeltSecurityWebbing + id: ClothingBeltSecurityWebbingFilled + name: security webbing + description: Unique and versatile chest rig, can hold security gear. + components: + - type: StorageFill + contents: + - id: GrenadeFlashBang + - id: TearGasGrenade + - id: Stunbaton + - id: Handcuffs + - id: Handcuffs + - type: entity parent: ClothingBeltStorageBase id: ClothingBeltMercWebbing diff --git a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml index bf08db78f71..4cd0c04e2be 100644 --- a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml +++ b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml @@ -231,7 +231,6 @@ - type: FingerprintMask - type: Thieving stripTimeReduction: 1 - stealthy: true - type: NinjaGloves - type: entity @@ -332,7 +331,6 @@ tags: [] # ignore "WhitelistChameleon" tag - type: Thieving stripTimeReduction: 1.5 - stealthy: true - type: entity parent: ClothingHandsGlovesColorWhite diff --git a/Resources/Prototypes/Entities/Clothing/Hands/specific.yml b/Resources/Prototypes/Entities/Clothing/Hands/specific.yml index e6a57319999..db34297b42a 100644 --- a/Resources/Prototypes/Entities/Clothing/Hands/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Hands/specific.yml @@ -29,4 +29,3 @@ components: - type: Thieving stripTimeReduction: 2 - stealthy: true diff --git a/Resources/Prototypes/Entities/Clothing/Head/bandanas.yml b/Resources/Prototypes/Entities/Clothing/Head/bandanas.yml index 8ee6479ee65..51a56f1f1d6 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/Masks/bandanas.yml b/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml index 2d65e67982f..246b47b8003 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/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml index 13524efa9e6..902c57418e4 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml @@ -93,6 +93,9 @@ - Hardsuit - WhitelistChameleon - HidesHarpyWings #DeltaV: Used by harpies to help render their hardsuit sprites + - type: Clothing + equipDelay: 2.5 # Hardsuits are heavy and take a while to put on/off. + unequipDelay: 2.5 - type: entity abstract: true @@ -114,6 +117,9 @@ - type: Tag tags: - HidesHarpyWings #DeltaV: Used by harpies to help render their hardsuit sprites + - type: Clothing + equipDelay: 1.25 # Softsuits are easier to put on and off + unequipDelay: 1 - type: entity parent: ClothingOuterBase diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml index f49f5f4804b..b867abfeed3 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/OuterClothing/wintercoats.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml index d45e8c3f3c2..aa4a7b50e65 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml @@ -32,7 +32,7 @@ - ClothMade - WhitelistChameleon - type: StaticPrice - price: 70 + price: 50 - type: entity parent: ClothingOuterWinterCoat @@ -549,42 +549,42 @@ description: A cozy jacket with the Cybersun logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi - type: entity parent: ClothingOuterWinterCoat - id: ClothingOuterEECorporateJacket + id: ClothingOuterEeCorporateJacket name: Einstein Engines Corporate Jacket description: A cozy jacket with the Einstein Engines logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi - type: entity parent: ClothingOuterWinterCoat - id: ClothingOuterHICorporateJacket + id: ClothingOuterHiCorporateJacket name: Hephaestus Industries Corporate Jacket description: A cozy jacket with the Hephaestus Industries logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi - type: entity parent: ClothingOuterWinterCoat - id: ClothingOuterHMCorporateJacket + id: ClothingOuterHmCorporateJacket name: Hawkmoon Acquisitions Corporate Jacket description: A cozy jacket with the Hawkmoon Acquisitions logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi - type: entity parent: ClothingOuterWinterCoat @@ -593,6 +593,61 @@ description: A cozy jacket with the Interdyne logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi + +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterBcCorporateJacket + name: Bishop Cybernetics Corporate Jacket + description: A cozy jacket with the Bishop Cybernetics logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. + components: + - type: Sprite + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi + - type: Clothing + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi + +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterDdCorporateJacket + name: Discount Dan's Corporate Jacket + description: A cozy jacket with the Discount Dan's logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. + components: + - type: Sprite + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi + - type: Clothing + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi + +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterFaCorporateJacket + name: Five Points Armory Corporate Jacket + description: A cozy jacket with the Five Points Armory logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. + components: + - type: Sprite + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi + - type: Clothing + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi + +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterGeCorporateJacket + name: Gilthari Exports Corporate Jacket + description: A cozy jacket with the Gilthari Exports logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. + components: + - type: Sprite + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi + - type: Clothing + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi + +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterZhCorporateJacket + name: Zeng-Hu Pharmaceuticals Corporate Jacket + description: A cozy jacket with the Zeng-Hu Pharmaceuticals logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. + components: + - type: Sprite + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi + - type: Clothing + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml b/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml index 241fc45352a..fdc49dc0616 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml @@ -202,7 +202,7 @@ - type: FootstepModifier footstepSoundCollection: collection: FootstepSpurs - + - type: entity parent: ClothingShoesBootsCowboyBrown id: ClothingShoesBootsCowboyBlack @@ -212,7 +212,7 @@ sprite: Clothing/Shoes/Boots/cowboybootsblack.rsi - type: Clothing sprite: Clothing/Shoes/Boots/cowboybootsblack.rsi - + - type: entity parent: ClothingShoesBootsCowboyBrown id: ClothingShoesBootsCowboyWhite @@ -222,7 +222,7 @@ sprite: Clothing/Shoes/Boots/cowboybootswhite.rsi - type: Clothing sprite: Clothing/Shoes/Boots/cowboybootswhite.rsi - + - type: entity parent: ClothingShoesBootsCowboyBrown id: ClothingShoesBootsCowboyFancy @@ -231,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/Uniforms/base_clothinguniforms.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/base_clothinguniforms.yml index de9875b3ad6..9c896786c26 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/base_clothinguniforms.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/base_clothinguniforms.yml @@ -50,6 +50,12 @@ - type: WirelessNetworkConnection range: 1200 - type: StationLimitedNetwork + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/cloth_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/cloth_drop.ogg + - type: EmitSoundOnLand + sound: /Audio/SimpleStation14/Items/Handling/cloth_drop.ogg - type: entity abstract: true diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/misc_roles.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/misc_roles.yml index 55ffe34b532..a8147ef7820 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/misc_roles.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/misc_roles.yml @@ -1,5 +1,5 @@ - type: entity - parent: ClothingUniformBase + parent: ClothingUniformSkirtBase id: UniformShortsRed name: boxing shorts description: These are shorts, not boxers. @@ -10,7 +10,7 @@ sprite: Clothing/Uniforms/Shorts/Color/red.rsi - type: entity - parent: ClothingUniformBase + parent: ClothingUniformSkirtBase id: UniformShortsRedWithTop name: boxing shorts with top description: These are shorts, not boxers. diff --git a/Resources/Prototypes/Entities/Clothing/base_clothing.yml b/Resources/Prototypes/Entities/Clothing/base_clothing.yml index 92a698dd301..810ada5429d 100644 --- a/Resources/Prototypes/Entities/Clothing/base_clothing.yml +++ b/Resources/Prototypes/Entities/Clothing/base_clothing.yml @@ -11,6 +11,9 @@ - WhitelistChameleon - type: StaticPrice price: 15 + - type: Clothing + equipDelay: 0.5 + unequipDelay: 0.5 - type: entity abstract: true diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/toy.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/toy.yml index eba1e300edf..d12b85cde41 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/toy.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/toy.yml @@ -36,6 +36,7 @@ - PlushieMoth - PlushieMothRandom # Nyanotrasen Random Moth Plushies - PlushieArachind + - PlushieArachne chance: 0.5 offset: 0.2 diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index dec46df0b53..a75be106f3c 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -213,6 +213,14 @@ visMask: - PsionicInvisibility - Normal + - type: LanguageKnowledge + speaks: + - GalacticCommon + - RobotTalk + understands: + - GalacticCommon + - RobotTalk + - type: CanWalk - type: entity id: BaseBorgChassisNT diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 378b3f8a9d8..9bdfacb81ab 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -13,6 +13,7 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: bat sprite: Mobs/Animals/bat.rsi + - type: Carriable - type: Speech speechSounds: Squeak speechVerb: SmallMob @@ -22,7 +23,7 @@ shape: !type:PhysShapeCircle radius: 0.25 - density: 10 + density: 0.8 mask: - FlyingMobMask layer: @@ -48,8 +49,11 @@ flavorKind: station-event-random-sentience-flavor-organic - type: Bloodstream bloodMaxVolume: 50 - - type: ReplacementAccent - accent: mouse + - type: LanguageKnowledge + speaks: + - Mouse + understands: + - Mouse - type: MeleeWeapon soundHit: path: /Audio/Effects/bite.ogg @@ -61,6 +65,7 @@ - type: Tag tags: - VimPilot + - type: RandomBark - type: entity name: bee @@ -84,7 +89,7 @@ shape: !type:PhysShapeCircle radius: 0.1 - density: 30 + density: 0.1 mask: - FlyingMobMask layer: @@ -129,6 +134,13 @@ - ReagentId: GroundBee Quantity: 5 - type: ZombieImmune + - type: RandomBark + barks: + - Bzzzzz + - Bzzz bzzz + - Bzzzzzzzzzzzz + - Bzz + barkMultiplier: 1.5 - type: entity name: bee @@ -177,6 +189,8 @@ noMovementLayers: movement: state: chicken-0 + - type: Carriable + freeHandsRequired: 1 - type: Fixtures fixtures: fix1: @@ -229,13 +243,17 @@ - type: EggLayer eggSpawn: - id: FoodEgg - - type: ReplacementAccent - accent: chicken + - type: LanguageKnowledge + speaks: + - Chicken + understands: + - Chicken - type: SentienceTarget flavorKind: station-event-random-sentience-flavor-organic - type: NpcFactionMember factions: - Passive + - type: RandomBark - type: entity parent: MobChicken @@ -328,7 +346,7 @@ shape: !type:PhysShapeCircle radius: 0.2 - density: 100 + density: 0.0007 mask: - SmallMobMask layer: @@ -432,7 +450,7 @@ shape: !type:PhysShapeCircle radius: 0.2 - density: 120 + density: 0.007 mask: - SmallMobMask layer: @@ -504,8 +522,11 @@ prob: 0.5 - type: Extractable grindableSolutionName: food - - type: ReplacementAccent - accent: mothroach + - type: LanguageKnowledge + speaks: + - Moffic + understands: + - Moffic - type: ZombieAccentOverride accent: zombieMoth - type: Vocal @@ -562,6 +583,8 @@ - MobMask layer: - MobLayer + - type: Carriable + freeHandsRequired: 1 - type: Tag tags: - DoorBumpOpener @@ -601,13 +624,18 @@ - type: EggLayer eggSpawn: - id: FoodEgg - - type: ReplacementAccent - accent: duck + - type: LanguageKnowledge + speaks: + - Duck + understands: + - Duck - type: SentienceTarget flavorKind: station-event-random-sentience-flavor-organic - type: NpcFactionMember factions: - Passive + - type: RandomBark + barkMultiplier: 0.7 - type: entity name: white duck #Quack @@ -787,6 +815,16 @@ - type: GuideHelp guides: - Chef + - type: RandomBark + barks: + - Mooooooo + - Moo + - Huff + - Mooooooooooo + - Moooooo + - Moooo + barkMultiplier: 3 + - type: entity name: crab @@ -807,6 +845,8 @@ noMovementLayers: movement: state: crab + - type: Carriable + freeHandsRequired: 1 - type: Physics - type: Fixtures fixtures: @@ -839,8 +879,11 @@ interactSuccessSpawn: EffectHearts interactSuccessSound: path: /Audio/Voice/Arachnid/arachnid_chitter.ogg - - type: ReplacementAccent - accent: crab + - type: LanguageKnowledge + speaks: + - Crab + understands: + - Crab - type: Bloodstream bloodMaxVolume: 50 bloodReagent: CopperBlood @@ -852,6 +895,12 @@ task: RuminantCompound - type: Body prototype: AnimalHemocyanin + - type: RandomBark + barks: + - click clack + - clack + - clickity clack + - clack clack - type: entity name: goat @@ -865,6 +914,7 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: goat sprite: Mobs/Animals/goat.rsi + - type: Carriable - type: Fixtures fixtures: fix1: @@ -957,6 +1007,7 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: goose sprite: Mobs/Animals/goose.rsi + - type: Carriable - type: Fixtures fixtures: fix1: @@ -1076,8 +1127,11 @@ - type: Inventory speciesId: kangaroo templateId: kangaroo - - type: ReplacementAccent - accent: kangaroo + - type: LanguageKnowledge + speaks: + - Kangaroo + understands: + - Kangaroo - type: InventorySlots - type: Strippable - type: Butcherable @@ -1200,6 +1254,7 @@ sprite: "Effects/creampie.rsi" state: "creampie_human" visible: false + - type: Carriable - type: Hands - type: GenericVisualizer visuals: @@ -1254,6 +1309,7 @@ tags: - VimPilot - DoorBumpOpener + - type: CanWalk - type: entity name: monkey @@ -1266,7 +1322,12 @@ - type: Speech speechSounds: Monkey speechVerb: Monkey - - type: MonkeyAccent + - type: LanguageKnowledge + speaks: + - Monkey + understands: + - Monkey + - Kobold - type: SentienceTarget flavorKind: station-event-random-sentience-flavor-primate - type: AlwaysRevolutionaryConvertible @@ -1300,7 +1361,13 @@ - type: Speech speechSounds: Monkey speechVerb: Monkey - - type: MonkeyAccent + - type: LanguageKnowledge + speaks: + - Monkey + understands: + - Monkey + - Kobold + - GalacticCommon - type: NpcFactionMember factions: - Syndicate @@ -1339,8 +1406,12 @@ - type: NameIdentifier group: Kobold - type: LizardAccent - - type: ReplacementAccent - accent: kobold + - type: LanguageKnowledge + speaks: + - Kobold + understands: + - Kobold + - Monkey - type: Speech speechSounds: Lizard speechVerb: Reptilian @@ -1446,6 +1517,8 @@ makeSentient: true name: ghost-role-information-kobold-name description: ghost-role-information-kobold-description + - type: RandomBark + barkMultiplier: 0.65 - type: entity name: guidebook monkey @@ -1508,7 +1581,7 @@ shape: !type:PhysShapeCircle radius: 0.2 - density: 100 + density: 0.76 mask: - SmallMobMask layer: @@ -1568,8 +1641,11 @@ spawned: - id: FoodMeatRat amount: 1 - - type: ReplacementAccent - accent: mouse + - type: LanguageKnowledge + speaks: + - Mouse + understands: + - Mouse - type: Tag tags: - Trash @@ -1605,6 +1681,8 @@ - type: BadFood - type: NonSpreaderZombie - type: PreventSpiller + - type: RandomBark + barkMultiplier: 0.3 - type: entity parent: MobMouse @@ -1700,6 +1778,7 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: lizard sprite: Mobs/Animals/lizard.rsi + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -1754,6 +1833,8 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: slug sprite: Mobs/Animals/slug.rsi + - type: Carriable + freeHandsRequired: 1 - type: Physics - type: Fixtures fixtures: @@ -1806,6 +1887,7 @@ noMovementLayers: movement: state: frog + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -1840,6 +1922,18 @@ - type: Tag tags: - VimPilot + - type: RandomBark + barkMultiplier: 1.3 + barks: + - Croooaaaakkk + - Ribbit + - Ribbit + - Ribbit + - Crooaak + - Ribbit + - Ribbit + - Ribbit + - Bibbit # Would be cool to have some functionality for the parrot to be able to sit on stuff - type: entity @@ -1857,6 +1951,8 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: parrot sprite: Mobs/Animals/parrot.rsi + - type: Carriable + freeHandsRequired: 1 - type: Fixtures fixtures: fix1: @@ -1894,6 +1990,11 @@ path: /Audio/Animals/parrot_raught.ogg - type: Bloodstream bloodMaxVolume: 50 + - type: LanguageKnowledge + speaks: + - GalacticCommon + understands: + - GalacticCommon - type: entity name: penguin @@ -1907,6 +2008,7 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: penguin sprite: Mobs/Animals/penguin.rsi + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -1953,6 +2055,10 @@ heatDamage: types: Heat : 0.2 #per second, scales with temperature & other constants + - type: RandomBark + barks: + - Wank + barkMultiplier: 0.6 - type: entity name: grenade penguin @@ -2036,6 +2142,7 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: snake sprite: Mobs/Animals/snake.rsi + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -2068,6 +2175,14 @@ - type: Damageable damageContainer: Biological damageModifierSet: Scale + - type: RandomBark + barkMultiplier: 1.5 + barks: + - Hsssssss + - Hss + - Hsssss + - Hisss + - Hshsss # Code unique spider prototypes or combine them all into one spider and get a # random sprite state when you spawn it. @@ -2090,6 +2205,7 @@ noMovementLayers: movement: state: tarantula + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -2140,8 +2256,11 @@ - type: MeleeChemicalInjector transferAmount: 0.75 solution: melee - - type: ReplacementAccent - accent: xeno + - type: LanguageKnowledge + speaks: + - Xeno + understands: + - Xeno - type: InteractionPopup successChance: 0.5 interactSuccessString: petting-success-tarantula @@ -2192,6 +2311,7 @@ groups: Brute: -0.07 Burn: -0.07 + - type: RandomBark - type: entity name: tarantula @@ -2271,6 +2391,7 @@ layers: - map: ["enum.DamageStateVisualLayers.Base"] state: possum + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -2346,6 +2467,7 @@ layers: - map: ["enum.DamageStateVisualLayers.Base"] state: raccoon + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -2410,6 +2532,7 @@ noMovementLayers: movement: state: fox + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -2417,7 +2540,7 @@ shape: !type:PhysShapeCircle radius: 0.35 - density: 50 #They actually are pretty light, I looked it up + density: 16.66 mask: - MobMask layer: @@ -2472,6 +2595,11 @@ - type: Tag tags: - VimPilot + - type: LanguageKnowledge + speaks: + - Fox + understands: + - Fox - type: entity name: corgi @@ -2485,6 +2613,7 @@ layers: - map: ["enum.DamageStateVisualLayers.Base"] state: corgi + - type: Carriable - type: Physics - type: Speech speechVerb: Canine @@ -2494,7 +2623,7 @@ shape: !type:PhysShapeCircle radius: 0.35 - density: 50 + density: 25.5 mask: - MobMask layer: @@ -2518,8 +2647,11 @@ spawned: - id: FoodMeat amount: 2 - - type: ReplacementAccent - accent: dog + - type: LanguageKnowledge + speaks: + - Dog + understands: + - Dog - type: InteractionPopup interactSuccessString: petting-success-dog interactFailureString: petting-failure-generic @@ -2536,6 +2668,7 @@ - type: Tag tags: - VimPilot + - type: RandomBark - type: entity name: corrupted corgi @@ -2637,6 +2770,7 @@ layers: - map: ["enum.DamageStateVisualLayers.Base"] state: cat + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -2644,7 +2778,7 @@ shape: !type:PhysShapeCircle radius: 0.35 - density: 15 + density: 9 mask: - MobMask layer: @@ -2671,8 +2805,11 @@ spawned: - id: FoodMeat amount: 3 - - type: ReplacementAccent - accent: cat + - type: LanguageKnowledge + speaks: + - Cat + understands: + - Cat - type: InteractionPopup successChance: 0.7 interactSuccessString: petting-success-cat @@ -2692,6 +2829,7 @@ - type: Tag tags: - VimPilot + - type: RandomBark - type: entity name: calico cat @@ -2739,6 +2877,12 @@ - type: NpcFactionMember factions: - Syndicate + - type: LanguageKnowledge + speaks: + - Xeno + understands: + - Xeno + - GalacticCommon - type: entity name: space cat @@ -2787,6 +2931,17 @@ Base: caracal_flop Dead: Base: caracal_dead + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.35 + density: 30 + mask: + - MobMask + layer: + - MobLayer - type: entity name: kitten @@ -2806,6 +2961,8 @@ Base: kitten_dead Dead: Base: kitten_dead + - type: Carriable + freeHandsRequired: 1 - type: Butcherable spawned: - id: FoodMeat @@ -2820,6 +2977,17 @@ thresholds: 0: Alive 25: Dead + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.35 + density: 2 + mask: + - MobMask + layer: + - MobLayer - type: entity name: sloth @@ -2836,6 +3004,7 @@ layers: - map: ["enum.DamageStateVisualLayers.Base"] state: sloth + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -2880,6 +3049,10 @@ - type: Tag tags: - VimPilot + - type: RandomBark + barkMultiplier: 10 + barks: + - Sloth - type: entity name: ferret @@ -2893,6 +3066,7 @@ layers: - map: ["enum.DamageStateVisualLayers.Base"] state: ferret + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -2900,7 +3074,7 @@ shape: !type:PhysShapeCircle radius: 0.35 - density: 5 + density: 4 mask: - MobMask layer: @@ -2977,7 +3151,7 @@ shape: !type:PhysShapeCircle radius: 0.2 - density: 120 + density: 0.8 mask: - SmallMobMask layer: @@ -3034,8 +3208,11 @@ spawned: - id: FoodMeat amount: 1 - - type: ReplacementAccent - accent: mouse + - type: LanguageKnowledge + speaks: + - Mouse + understands: + - Mouse - type: Tag tags: - VimPilot @@ -3076,6 +3253,8 @@ - type: MobPrice price: 60 - type: NonSpreaderZombie + - type: RandomBark + barkMultiplier: 0.45 - type: entity name: pig @@ -3089,13 +3268,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: pig sprite: Mobs/Animals/pig.rsi + - type: Carriable - type: Fixtures fixtures: fix1: shape: !type:PhysShapeCircle radius: 0.35 - density: 250 + density: 750 mask: - MobMask layer: @@ -3141,8 +3321,11 @@ interactSuccessSpawn: EffectHearts interactSuccessSound: path: /Audio/Animals/pig_oink.ogg - - type: ReplacementAccent - accent: pig + - type: LanguageKnowledge + speaks: + - Pig + understands: + - Pig - type: SentienceTarget flavorKind: station-event-random-sentience-flavor-organic - type: NpcFactionMember @@ -3161,6 +3344,7 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: nymph sprite: Mobs/Animals/nymph.rsi + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -3168,7 +3352,7 @@ shape: !type:PhysShapeCircle radius: 0.35 - density: 100 # High, because wood is heavy. + density: 15 mask: - MobMask layer: @@ -3228,6 +3412,12 @@ reformTime: 10 popupText: diona-reform-attempt reformPrototype: MobDionaReformed + - type: LanguageKnowledge + speaks: + - RootSpeak + understands: + - GalacticCommon + - RootSpeak - type: entity parent: MobDionaNymph @@ -3236,3 +3426,4 @@ components: - type: ReplacementAccent accent: nymph + - type: RandomBark diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml b/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml index 39e68b63a78..f8d0497b971 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml @@ -15,8 +15,11 @@ - type: Sprite sprite: Mobs/Aliens/Argocyte/argocyte_common.rsi - type: SolutionContainerManager - - type: ReplacementAccent - accent: xeno + - type: LanguageKnowledge + speaks: + - Xeno + understands: + - Xeno - type: Bloodstream bloodReagent: FerrochromicAcid bloodMaxVolume: 75 #we don't want the map to become pools of blood diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml index 3e6c603626b..2aae27d31ef 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml @@ -22,6 +22,7 @@ layers: - map: [ "enum.DamageStateVisualLayers.Base" ] state: alive + - type: Carriable # This one is for you, deltanedas o7 - type: CombatMode - type: Physics - type: Fixtures diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml b/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml index 01fce382e37..f19879c9eaa 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml @@ -292,6 +292,7 @@ solution: bloodstream - type: DrainableSolution solution: bloodstream + - type: CanWalk - type: entity name: Reagent Slime Spawner diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml index 9981bb8bd92..6eb43fb89ae 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml @@ -36,6 +36,12 @@ - VimPilot - type: StealTarget stealGroup: AnimalIan + - type: LanguageKnowledge + speaks: + - Dog + understands: + - GalacticCommon + - Dog - type: entity name: Old Ian @@ -121,6 +127,12 @@ tags: - CannotSuicide - VimPilot + - type: LanguageKnowledge + speaks: + - Cat + understands: + - GalacticCommon + - Cat - type: entity name: Exception @@ -139,6 +151,12 @@ tags: - CannotSuicide - VimPilot + - type: LanguageKnowledge + speaks: + - Cat + understands: + - GalacticCommon + - Cat - type: entity name: Floppa @@ -288,8 +306,12 @@ spawned: - id: FoodMeat amount: 2 - - type: ReplacementAccent - accent: dog + - type: LanguageKnowledge + speaks: + - Dog + understands: + - GalacticCommon + - Dog - type: InteractionPopup successChance: 0.5 interactSuccessString: petting-success-dog @@ -307,6 +329,8 @@ - VimPilot - type: StealTarget stealGroup: AnimalMcGriff + - type: RandomBark + barkMultiplier: 1.3 - type: entity name: Paperwork @@ -387,8 +411,12 @@ spawned: - id: FoodMeat amount: 3 - - type: ReplacementAccent - accent: dog + - type: LanguageKnowledge + speaks: + - Dog + understands: + - GalacticCommon + - Dog - type: InteractionPopup successChance: 0.7 interactSuccessString: petting-success-dog @@ -406,6 +434,8 @@ - VimPilot - type: StealTarget stealGroup: AnimalWalter + - type: RandomBark + barkMultiplier: 1.1 - type: entity name: Morty @@ -546,6 +576,12 @@ - VimPilot - type: StealTarget stealGroup: AnimalRenault + - type: LanguageKnowledge + speaks: + - Fox + understands: + - GalacticCommon + - Fox - type: entity name: Hamlet @@ -593,6 +629,12 @@ - CannotSuicide - Hamster - VimPilot + - type: LanguageKnowledge + speaks: + - Mouse + understands: + - GalacticCommon + - Mouse - type: entity name: Shiva @@ -765,6 +807,12 @@ attributes: proper: true gender: female + - type: LanguageKnowledge + speaks: + - Bubblish + understands: + - GalacticCommon + - Bubblish - type: entity name: Pun Pun @@ -799,6 +847,13 @@ attributes: proper: true gender: male + - type: LanguageKnowledge + speaks: + - Monkey + understands: + - GalacticCommon + - Monkey + - Kobold - type: entity name: Tropico @@ -826,3 +881,9 @@ # - type: AlwaysRevolutionaryConvertible - type: StealTarget stealGroup: AnimalTropico + - type: LanguageKnowledge + speaks: + - Crab + understands: + - GalacticCommon + - Crab diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index 89a6f16e525..db594873fe3 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -119,6 +119,14 @@ attributes: gender: male - type: PotentialPsionic # Nyano + - type: LanguageKnowledge + speaks: + - GalacticCommon + - Mouse + understands: + - GalacticCommon + - Mouse + - type: CanWalk - type: entity id: MobRatKingBuff @@ -163,6 +171,8 @@ description: He's da mini rat. He don't make da roolz. noSpawn: true #Must be configured to a King or the AI breaks. components: + - type: Carriable + freeHandsRequired: 1 - type: CombatMode - type: MovementSpeedModifier baseWalkSpeed : 3.5 @@ -289,6 +299,12 @@ - type: Food - type: Item size: Tiny # Delta V - Make them eatable and pickable. + - type: LanguageKnowledge + speaks: + - Mouse + understands: + - GalacticCommon + - Mouse - type: weightedRandomEntity id: RatKingLoot diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml b/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml index ec1ed3a58f6..1316aefc50b 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml @@ -97,6 +97,7 @@ - RevenantTheme - type: Speech speechVerb: Ghost + - type: UniversalLanguageSpeaker - type: Tag tags: - NoPaint diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml b/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml index f08fe36544e..08cb776c530 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml @@ -36,7 +36,7 @@ speedModifierThresholds: 60: 0.7 80: 0.5 - + - type: entity name: shadow cat parent: BaseShadowMob @@ -50,8 +50,11 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: cat - type: Physics - - type: ReplacementAccent - accent: cat + - type: LanguageKnowledge + speaks: + - Cat + understands: + - Cat - type: InteractionPopup successChance: 0.01 # you cant pet shadow cat... almost interactSuccessString: petting-success-cat @@ -64,4 +67,4 @@ gender: epicene - type: Tag tags: - - VimPilot \ No newline at end of file + - VimPilot diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml index 42b7ff9e211..f9cf0db5f6f 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml @@ -107,6 +107,13 @@ - type: TypingIndicator proto: robot - type: ZombieImmune + - type: LanguageKnowledge + speaks: + - GalacticCommon + - RobotTalk + understands: + - GalacticCommon + - RobotTalk - type: entity parent: MobSiliconBase diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml index 12ea40b1e3c..8e84f46a693 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml @@ -104,3 +104,4 @@ - type: MobPrice price: 150 - type: FloatingVisuals + - type: Speech diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml index c64479369a6..690a4c5d291 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity name: basic slime id: MobAdultSlimes parent: [ SimpleMobBase, MobCombat ] @@ -17,6 +17,7 @@ layers: - map: [ "enum.DamageStateVisualLayers.Base" ] state: blue_adult_slime + - type: Carriable - type: Fixtures fixtures: fix1: @@ -111,8 +112,11 @@ successChance: 0.5 interactSuccessString: petting-success-slimes interactFailureString: petting-failure-generic - - type: ReplacementAccent - accent: slimes + - type: LanguageKnowledge + speaks: + - Bubblish + understands: + - Bubblish - type: GhostTakeoverAvailable - type: GhostRole makeSentient: true @@ -124,6 +128,7 @@ speechSounds: Slime - type: TypingIndicator proto: slime + - type: CanWalk - type: entity name: blue slime diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml index 0a294805cfd..adf3af93eab 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity name: basic id: MobSpaceBasic parent: SimpleSpaceMobBase @@ -165,8 +165,11 @@ - type: FootstepModifier footstepSoundCollection: collection: FootstepBounce - - type: ReplacementAccent - accent: kangaroo + - type: LanguageKnowledge + speaks: + - Kangaroo + understands: + - Kangaroo - type: InventorySlots - type: Strippable - type: UserInterface @@ -248,8 +251,11 @@ - type: MeleeChemicalInjector solution: melee transferAmount: 4 - - type: ReplacementAccent - accent: xeno + - type: LanguageKnowledge + speaks: + - Xeno + understands: + - Xeno - type: InteractionPopup successChance: 0.20 interactSuccessString: petting-success-tarantula @@ -351,8 +357,11 @@ - type: MeleeChemicalInjector solution: melee transferAmount: 6 - - type: ReplacementAccent - accent: xeno + - type: LanguageKnowledge + speaks: + - Xeno + understands: + - Xeno - type: InteractionPopup successChance: 0.2 interactSuccessString: petting-success-snake @@ -373,4 +382,4 @@ parent: MobCobraSpace suffix: "Salvage Ruleset" components: - - type: SalvageMobRestrictions \ No newline at end of file + - type: SalvageMobRestrictions diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml index d0ac6fc0265..397989643e6 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml @@ -125,6 +125,11 @@ chance: -2 - type: Psionic #Nyano - Summary: makes psionic by default. removable: false + - type: LanguageKnowledge + speaks: + - Xeno + understands: + - Xeno - type: entity name: Praetorian @@ -234,6 +239,13 @@ - type: Tag tags: - CannotSuicide + - type: LanguageKnowledge + speaks: + - GalacticCommon + - Xeno + understands: + - GalacticCommon + - Xeno - type: entity name: Ravager diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index 80e87d3670c..9bdfb18830e 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -85,8 +85,8 @@ range: 500 - type: StationLimitedNetwork - type: Thieving - stripTimeReduction: 9999 - stealthy: true + stripTimeMultiplier: 0 + ignoreStripHidden: true - type: Stripping - type: SolutionScanner - type: IgnoreUIRange diff --git a/Resources/Prototypes/Entities/Mobs/Player/observer.yml b/Resources/Prototypes/Entities/Mobs/Player/observer.yml index 8f3e6c13466..0086be81d9a 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/observer.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/observer.yml @@ -53,6 +53,7 @@ - type: Tag tags: - BypassInteractionRangeChecks + - type: UniversalLanguageSpeaker # Ghosts should understand any language. - type: entity id: ActionGhostBoo diff --git a/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml b/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml index ad9b37f63e1..07deef857c3 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml @@ -7,3 +7,4 @@ - type: MovementSpeedModifier baseSprintSpeed: 24 baseWalkSpeed: 16 + - type: UniversalLanguageSpeaker diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index a610e04d6dd..1b9e9674f44 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -141,7 +141,7 @@ - Pacified - StaminaModifier - PsionicsDisabled #Nyano - Summary: PCs can have psionics disabled. - - PsionicallyInsulated #Nyano - Summary: PCs can be made insulated from psionic powers. + - PsionicallyInsulated #Nyano - Summary: PCs can be made insulated from psionic powers. - type: Reflect enabled: false reflectProb: 0 @@ -218,12 +218,18 @@ - type: MobPrice price: 1500 # Kidnapping a living person and selling them for cred is a good move. deathPenalty: 0.01 # However they really ought to be living and intact, otherwise they're worth 100x less. - - type: CanEscapeInventory # Carrying system from nyanotrasen. + - type: CanEscapeInventory # Carrying system from nyanotrasen. + - type: LanguageKnowledge # This is here so even if species doesn't have a defined language, they at least speak GC + speaks: + - GalacticCommon + understands: + - GalacticCommon - type: Tag tags: - CanPilot - FootstepSound - DoorBumpOpener + - type: CanWalk - type: entity save: false @@ -304,6 +310,8 @@ Asphyxiation: -1.0 - type: FireVisuals alternateState: Standing + - type: OfferItem + - type: LayingDown - type: entity save: false diff --git a/Resources/Prototypes/Entities/Mobs/Species/diona.yml b/Resources/Prototypes/Entities/Mobs/Species/diona.yml index 3d405c4dd91..de9928f0d67 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/diona.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/diona.yml @@ -102,6 +102,13 @@ actionPrototype: DionaGibAction allowedStates: - Dead + - type: LanguageKnowledge + speaks: + - GalacticCommon + - RootSpeak + understands: + - GalacticCommon + - RootSpeak - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml index fe36754b9b5..b38ea2634fd 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml @@ -21,7 +21,6 @@ - type: Sprite noRot: true drawdepth: Mobs - scale: 1, 0.8 - type: Body prototype: Dwarf requiredLegs: 2 @@ -52,11 +51,15 @@ accent: dwarf - type: Speech speechSounds: Bass + - type: LanguageKnowledge + speaks: + - GalacticCommon + - SolCommon + understands: + - GalacticCommon + - SolCommon - type: entity parent: BaseSpeciesDummy id: MobDwarfDummy noSpawn: true - components: - - type: Sprite - scale: 1, 0.8 diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index 7bf96efe2cc..e00e06279e5 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -17,6 +17,13 @@ - id: FoodMeatHuman amount: 5 - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. + - type: LanguageKnowledge + speaks: + - GalacticCommon + - SolCommon + understands: + - GalacticCommon + - SolCommon - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/moth.yml b/Resources/Prototypes/Entities/Mobs/Species/moth.yml index 1680dd6cda6..1c55dcf0df1 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/moth.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/moth.yml @@ -23,6 +23,13 @@ accent: zombieMoth - type: Speech speechVerb: Moth + - type: LanguageKnowledge + speaks: + - GalacticCommon + - Moffic + understands: + - GalacticCommon + - Moffic - type: TypingIndicator proto: moth - type: Butcherable @@ -44,9 +51,7 @@ Female: UnisexMoth Unsexed: UnisexMoth - type: MovementSpeedModifier - weightlessAcceleration: 1.5 # Move around more easily in space. - weightlessFriction: 1 - weightlessModifier: 1 + weightlessAcceleration: 2.5 # Move around more easily in space. - type: Flammable damage: types: diff --git a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml index 09e86b19968..35f9e9fa393 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml @@ -59,6 +59,13 @@ types: Heat : 1.5 #per second, scales with temperature & other constants - type: Wagging + - type: LanguageKnowledge + speaks: + - GalacticCommon + - Draconic + understands: + - GalacticCommon + - Draconic - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/slime.yml b/Resources/Prototypes/Entities/Mobs/Species/slime.yml index 481afd06a3c..6c3dc952957 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/slime.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/slime.yml @@ -74,6 +74,13 @@ types: Asphyxiation: -1.0 maxSaturation: 15 + - type: LanguageKnowledge + speaks: + - GalacticCommon + - Bubblish + understands: + - GalacticCommon + - Bubblish - type: entity parent: MobHumanDummy diff --git a/Resources/Prototypes/Entities/Mobs/base.yml b/Resources/Prototypes/Entities/Mobs/base.yml index ac9aabbeadb..40cb0da95a1 100644 --- a/Resources/Prototypes/Entities/Mobs/base.yml +++ b/Resources/Prototypes/Entities/Mobs/base.yml @@ -1,4 +1,4 @@ -# The progenitor. This should only container the most basic components possible. +# The progenitor. This should only container the most basic components possible. # Only put things on here if every mob *must* have it. This includes ghosts. - type: entity save: false @@ -43,6 +43,9 @@ - type: MovementSpeedModifier - type: Polymorphable - type: StatusIcon + - type: LanguageSpeaker # Einstein Engines. This component is required to support speech, although it does not define known languages. + - type: RequireProjectileTarget + active: False # Used for mobs that have health and can take damage. - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml index f232bf1d34d..4bdd6245c5d 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml @@ -17,7 +17,7 @@ - type: Sprite state: icon - type: Item - size: Normal + size: Small - type: MeleeWeapon soundNoDamage: path: "/Audio/Effects/Fluids/splat.ogg" @@ -39,6 +39,18 @@ - type: TrashOnSolutionEmpty solution: drink +- type: entity + parent: DrinkCartonBaseFull + id: DrinkCartonBaseLargeFull + abstract: true + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 100 + - type: Item + size: Normal + - type: entity id: DrinkCartonVisualsOpenable abstract: true @@ -116,7 +128,7 @@ sprite: Objects/Consumable/Drinks/cream.rsi - type: entity - parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseLargeFull] id: DrinkMilkCarton name: milk description: An opaque white liquid produced by the mammary glands of mammals. @@ -124,7 +136,6 @@ - type: SolutionContainerManager solutions: drink: - maxVol: 100 reagents: - ReagentId: Milk Quantity: 100 @@ -132,7 +143,7 @@ sprite: Objects/Consumable/Drinks/milk.rsi - type: entity - parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseLargeFull] id: DrinkSoyMilkCarton name: soy milk description: White and nutritious soy goodness! @@ -140,7 +151,6 @@ - type: SolutionContainerManager solutions: drink: - maxVol: 100 reagents: - ReagentId: MilkSoy Quantity: 100 @@ -148,7 +158,7 @@ sprite: Objects/Consumable/Drinks/soymilk.rsi - type: entity - parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseLargeFull] id: DrinkOatMilkCarton name: oat milk description: It's oat milk. Tan and nutritious goodness! @@ -156,9 +166,52 @@ - type: SolutionContainerManager solutions: drink: - maxVol: 100 reagents: - ReagentId: MilkOat Quantity: 100 - type: Sprite sprite: Objects/Consumable/Drinks/oatmilk.rsi + +- type: entity + parent: DrinkCartonBaseFull + id: DrinkCartonBaseSmallFull + abstract: true + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 25 + +- type: entity + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] + id: DrinkMilkCartonMini + name: mini milk + description: An opaque white liquid produced by the mammary glands of mammals. + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 25 + reagents: + - ReagentId: Milk + Quantity: 25 + - type: Sprite + sprite: Objects/Consumable/Drinks/milkmini.rsi + state: icon + +- type: entity + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] + id: DrinkMilkCartonMiniChocolate + name: mini choco milk + description: A milk drink flavored with chocolate. + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 25 + reagents: + - ReagentId: MilkChoco + Quantity: 25 + - type: Sprite + sprite: Objects/Consumable/Drinks/milkminichoco.rsi + state: icon diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml index 33646b50bbe..17e2a4df5ee 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml @@ -33,6 +33,12 @@ interfaces: - key: enum.TransferAmountUiKey.Key type: TransferAmountBoundUserInterface + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/drinkglass_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg + - type: EmitSoundOnLand + sound: /Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg - type: entity parent: DrinkBase @@ -369,6 +375,9 @@ - type: Icon sprite: Objects/Consumable/Drinks/beerglass.rsi state: icon + - type: Tag + tags: + - Beer - type: entity parent: DrinkGlass @@ -943,6 +952,9 @@ - type: Icon sprite: Objects/Consumable/Drinks/iced_beerglass.rsi state: icon + - type: Tag + tags: + - Beer - type: entity parent: DrinkGlass @@ -2121,3 +2133,62 @@ - type: Icon sprite: Objects/Consumable/Drinks/bloodglass.rsi state: icon + +- type: entity + parent: DrinkBase + id: DrinkBasePlastic + abstract: true + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 50 + - type: PhysicalComposition + materialComposition: + Plastic: 100 + +- type: entity + parent: DrinkBasePlastic + id: DrinkFitnessShakerBlack + name: fitness shaker + description: Big enough to contain enough protein to get perfectly swole. Don't mind the bits. + components: + - type: Sprite + sprite: Objects/Consumable/Drinks/shakerblack.rsi + state: icon + +- type: entity + parent: DrinkFitnessShakerBlack + id: DrinkFitnessShakerRed + components: + - type: Sprite + sprite: Objects/Consumable/Drinks/shakerred.rsi + state: icon + +- type: entity + parent: DrinkFitnessShakerBlack + id: DrinkFitnessShakerBlue + components: + - type: Sprite + sprite: Objects/Consumable/Drinks/shakerblue.rsi + state: icon + +- type: reagent + id: MilkChoco + name: reagent-name-milk-choco + group: Drinks + desc: reagent-desc-milk-choco + physicalDesc: reagent-physical-desc-opaque + flavor: chocolate + color: "#664300" + recognizable: true + plantMetabolism: + - !type:PlantAdjustNutrition + amount: 0.1 + - !type:PlantAdjustWater + amount: 0.9 + metabolisms: + Drink: + effects: + - !type:SatiateThirst + factor: 4 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml index 07828ff5ba5..face999df82 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 38ebc132c9f..192be68c8c7 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml @@ -62,6 +62,12 @@ - type: Tag tags: - DrinkCan + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/drinkglass_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg + - type: EmitSoundOnLand + sound: /Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg - type: entity parent: DrinkCanBaseFull @@ -182,6 +188,9 @@ sprite: Objects/Consumable/Drinks/rootbeer.rsi - type: Item sprite: Objects/Consumable/Drinks/rootbeer.rsi + - type: Tag + tags: + - Beer - type: entity parent: DrinkCanBaseFull @@ -480,6 +489,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 @@ -499,3 +511,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/Drinks/drinks_cups.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml index 4fc2e170d5b..c4693c6a719 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml @@ -37,6 +37,12 @@ damage: types: Blunt: 0 + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/drinkglass_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg + - type: EmitSoundOnLand + sound: /Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg - type: entity parent: DrinkBaseCup diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml index c80398e3496..9a523c997b9 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml @@ -31,6 +31,12 @@ - type: PhysicalComposition materialComposition: Steel: 50 + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/drinkglass_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg + - type: EmitSoundOnLand + sound: /Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg - type: entity parent: DrinkGlassBase diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml index f6dd7222611..3cf2e77e8b6 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml @@ -8,6 +8,8 @@ components: - type: Sprite state: icon + - type: Item + size: Normal - type: SolutionContainerManager solutions: drink: @@ -72,6 +74,19 @@ Glass: 100 - type: SpaceGarbage +- type: entity + name: base empty bottle + id: DrinkBottleBaseSmallEmpty + parent: DrinkBottleBaseEmpty + abstract: true + components: + - type: Item + size: Small + - type: SolutionContainerManager + solutions: + drink: + maxVol: 50 + - type: entity name: base empty carton id: DrinkCartonBaseEmpty @@ -121,6 +136,25 @@ materialComposition: Cardboard: 20 - type: SpaceGarbage + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/drinkglass_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg + - type: EmitSoundOnLand + sound: /Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg + +- type: entity + name: base empty bottle + id: DrinkCartonBaseLargeEmpty + parent: DrinkCartonBaseEmpty + abstract: true + components: + - type: Item + size: Normal + - type: SolutionContainerManager + solutions: + drink: + maxVol: 100 # Containers - type: entity @@ -143,28 +177,20 @@ - type: entity name: ale bottle - parent: DrinkBottleBaseEmpty + parent: DrinkBottleBaseSmallEmpty id: DrinkBottleAle components: - type: Sprite sprite: Objects/Consumable/TrashDrinks/alebottle_empty.rsi - - type: SolutionContainerManager - solutions: - drink: - maxVol: 50 - type: entity name: beer bottle - parent: DrinkBottleBaseEmpty + parent: DrinkBottleBaseSmallEmpty id: DrinkBottleBeer components: - type: Sprite sprite: Objects/Consumable/TrashDrinks/beer_empty.rsi - - type: SolutionContainerManager - solutions: - drink: - maxVol: 50 - type: entity @@ -283,7 +309,6 @@ - type: Sprite sprite: Objects/Consumable/TrashDrinks/winebottle_empty.rsi - - type: entity name: lime juice carton parent: DrinkCartonBaseEmpty @@ -322,7 +347,7 @@ - type: entity name: milk carton - parent: DrinkCartonBaseEmpty + parent: DrinkCartonBaseLargeEmpty id: DrinkCartonMilk components: - type: Sprite @@ -332,27 +357,18 @@ drink: maxVol: 100 - - type: entity name: soy milk carton - parent: DrinkCartonBaseEmpty + parent: DrinkCartonBaseLargeEmpty id: DrinkCartonSoyMilk components: - type: Sprite sprite: Objects/Consumable/Drinks/soymilk.rsi - - type: SolutionContainerManager - solutions: - drink: - maxVol: 100 - type: entity name: oat milk carton - parent: DrinkCartonBaseEmpty + parent: DrinkCartonBaseLargeEmpty id: DrinkCartonOatMilk components: - type: Sprite sprite: Objects/Consumable/Drinks/oatmilk.rsi - - type: SolutionContainerManager - solutions: - drink: - maxVol: 100 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml index fe888595847..8cd1c5dfab6 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml @@ -156,6 +156,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/ingredients.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml index 1df6615a9fb..c6c7e5677e5 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml @@ -648,3 +648,23 @@ reagents: - ReagentId: CocoaPowder Quantity: 2 + +- type: entity + parent: BaseFoodCondimentPacket + id: FoodCondimentPacketProtein + name: protein powder packet + description: Contains 10u of powdered protein. Mix with 20u of water + components: + - type: SolutionContainerManager + solutions: + food: + maxVol: 10 + reagents: + - ReagentId: Protein + Quantity: 10 + - type: Icon + state: packet-greygoo + - type: Appearance + - type: SolutionContainerVisuals + maxFillLevels: 2 + fillBaseName: packet-solid- diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml index 5fbfe9c09b2..74277cf7ff4 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml @@ -609,3 +609,24 @@ Quantity: 4 - ReagentId: Vitamin Quantity: 4 + +- type: entity + name: harpy wings + parent: FoodMealBase + id: FoodHarpyWings + description: It's a bit stringy. + components: + - type: FlavorProfile + flavors: + - chicken + - type: Sprite + state: harpywings + - type: SolutionContainerManager + solutions: + food: + maxVol: 25 + reagents: + - ReagentId: Nutriment + Quantity: 13 + - ReagentId: Protein + Quantity: 7 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml index 85de407988b..58af9cf3bd8 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml @@ -718,6 +718,7 @@ tags: - Cooked - Meat + - Steak - type: Sprite layers: - state: plain-cooked @@ -774,6 +775,7 @@ tags: - Cooked - Meat + - Steak - type: Sprite layers: - state: product-cooked @@ -942,6 +944,7 @@ tags: - Cooked - Meat + - Steak - type: Sprite layers: - state: goliath-cooked @@ -971,6 +974,7 @@ tags: - Cooked - Meat + - Steak - type: Sprite layers: - state: rouny-cooked @@ -996,6 +1000,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 eec7711d4af..21eb0fb9423 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,6 +261,7 @@ - type: Tag tags: - Fruit + - Banana - type: entity name: mimana @@ -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 @@ -1822,3 +1864,4 @@ - type: Tag tags: - ClothMade + - CottonBoll diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml index 8e52630ac87..e88a641c7c0 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml @@ -626,3 +626,533 @@ - Trash - type: Sprite state: mre-wrapper + +# Snacks +- type: entity + parent: FoodSnackBase + id: FoodSnackProteinbar + name: protein bar + description: SwoleMAX brand protein bars, guaranteed to get you feeling perfectly overconfident. + components: + - type: FlavorProfile + flavors: + - chalky + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: proteinbar + - type: Item + - type: Food + trash: FoodPacketProteinbarTrash + - type: SolutionContainerManager + solutions: + food: + maxVol: 15 + reagents: + - ReagentId: Nutriment + Quantity: 4 + - ReagentId: Protein + Quantity: 4 + - ReagentId: CocoaPowder + Quantity: 1 + - ReagentId: Theobromine + Quantity: 1 + +# Sol Vend / Mars Mart +- type: entity + parent: BaseItem + id: FoodSnackLunacakeWrapped + name: wrapped lunacake + description: Now with 20% less lawsuit enabling rhegolith! + components: + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: lunacake_wrapped + - type: Item + heldPrefix: lunacake_wrapped + size: Tiny + - type: Tag + tags: + - FoodSnack + - type: SpawnItemsOnUse + items: + - id: FoodPacketLunacakeTrash + - id: FoodSnackLunacake + sound: + path: /Audio/Effects/unwrap.ogg + +- type: entity + parent: FoodSnackBase + id: FoodSnackLunacake + name: lunacake + description: Now with 20% less lawsuit enabling rhegolith! + components: + - type: FlavorProfile + flavors: + - vanilla + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: lunacake + - type: Item + +- type: entity + parent: BaseItem + id: FoodSnackMochicakeWrapped + name: wrapped mochicake + description: Konnichiwa! Many go lucky rice cakes in future! + components: + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: mochicake_wrapped + - type: Item + heldPrefix: mochicake_wrapped + size: Tiny + - type: Tag + tags: + - FoodSnack + - type: SpawnItemsOnUse + items: + - id: FoodPacketMochicakeTrash + - id: FoodSnackMochicake + sound: + path: /Audio/Effects/unwrap.ogg + +- type: entity + parent: FoodSnackBase + id: FoodSnackMochicake + name: mochicake + description: Konnichiwa! Many go lucky rice cakes in future! + components: + - type: FlavorProfile + flavors: + - rice + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: lunacake + - type: Item + +- type: entity + parent: BaseItem + id: FoodSnackMooncakeWrapped + name: wrapped mooncake + description: Explore the dark side! May contain trace amounts of reconstituted cocoa. + components: + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: mooncake_wrapped + - type: Item + heldPrefix: mooncake_wrapped + size: Tiny + - type: Tag + tags: + - FoodSnack + - type: SpawnItemsOnUse + items: + - id: FoodPacketMooncakeTrash + - id: FoodSnackMooncake + sound: + path: /Audio/Effects/unwrap.ogg + +- type: entity + parent: FoodSnackBase + id: FoodSnackMooncake + name: mooncake + description: Explore the dark side! May contain trace amounts of reconstituted cocoa. + components: + - type: FlavorProfile + flavors: + - chocolate + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: lunacake + - type: Item + +- type: entity + parent: FoodSnackBase + id: FoodSnackTidegobs + name: tide gobs + description: Contains over 9000% of your daily recommended intake of salt. + components: + - type: FlavorProfile + flavors: + - salty + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: tidegobs + - type: Item + - type: Food + trash: FoodPacketTidegobsTrash + +- type: entity + parent: FoodSnackBase + id: FoodSnackSaturnos + name: saturn-os + description: A day ration of salt, styrofoam and possibly sawdust. + components: + - type: FlavorProfile + flavors: + - salty + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: saturno + - type: Item + - type: Food + trash: FoodPacketSaturnosTrash + +- type: entity + parent: FoodSnackBase + id: FoodSnackJoveGello + name: jove gello + description: By Joove! It's some kind of gel. + components: + - type: FlavorProfile + flavors: + - sweet + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: jupiter + - type: Item + - type: Food + trash: FoodPacketJoveGelloTrash + +- type: entity + parent: FoodSnackBase + id: FoodSnackPlutoniumrods + name: plutonium rods + description: Baseless tasteless nutrithick rods to get you through the day. Now even less rash inducing! + components: + - type: FlavorProfile + flavors: + - chalky + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: pluto + - type: Item + - type: Food + trash: FoodPacketPlutoniumrodsTrash + +- type: entity + parent: FoodSnackBase + id: FoodSnackMarsFrouka + name: frouka + description: Celebrate founding day with a steaming self-heated bowl of sweet eggs and taters! + components: + - type: FlavorProfile + flavors: + - egg + - potatoes + - mustard + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: mars + - type: Item + - type: Food + trash: FoodPacketMarsFroukaTrash + +- type: entity + parent: FoodSnackBase + id: FoodSnackVenusianhotcakes + name: venusian hot cakes + description: Hot takes on hot cakes, a timeless classic now finally fit for human consumption! + components: + - type: FlavorProfile + flavors: + - spicy + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: venus + - type: Item + - type: Food + trash: FoodPacketVenusTrash + +- type: entity + parent: FoodSnackBase + id: FoodSnackOortrocks + name: oort cloud rocks + description: Pop rocks themed on the most important industrial sector in Sol, new formula guarantees fewer shrapnel induced oral injury. + components: + - type: FlavorProfile + flavors: + - fizzy + - sweet + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: oort + - type: Item + - type: Food + trash: FoodPacketOortrocksTrash + +# Weeb Vend +- type: entity + parent: FoodSnackBase + id: FoodSnackRedalertnuts + name: red alert nuts + description: A bag of Red Alert! brand spicy nuts. Goes well with your beer! + components: + - type: FlavorProfile + flavors: + - spicy + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: weebonuts + - type: Item + - type: Food + trash: FoodPacketRedalertnutsTrash + +- type: entity + parent: FoodSnackBase + id: FoodSnackRicecake + name: rice cake + description: Ancient earth snack food made from balled up rice. + components: + - type: FlavorProfile + flavors: + - rice + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: ricecake + - type: Item + +- type: entity + parent: FoodSnackBase + id: FoodSnackPokeysticks + name: pokey sticks + description: A bundle of chocolate coated bisquit sticks. + components: + - type: FlavorProfile + flavors: + - sweet + - chocolate + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: pokeys + - type: Item + +- type: entity + parent: FoodSnackBase + id: FoodSnackChocobanana + name: chocobanana + description: A chocolate and sprinkles coated banana. On a stick + components: + - type: FlavorProfile + flavors: + - sweet + - chocolate + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: chocobanana + - type: Item + - type: Food + trash: FoodPacketStickTrash + +- type: entity + parent: FoodSnackBase + id: FoodSnackDango + name: dango + description: Food dyed rice dumplings on a stick. + components: + - type: FlavorProfile + flavors: + - rice + - sweet + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: dango + - type: Item + - type: Food + trash: FoodPacketStickTrash + +# Old food +- type: entity + parent: FoodSnackBase + id: FoodSnackAncientBurger + name: space burger + suffix: ancient + description: At some point in time this probably looked delicious. + components: + - type: FlavorProfile + flavors: + - terrible + - type: Sprite + sprite: Objects/Consumable/Food/bay_food.rsi + state: ancient_burger + - type: Item + - type: SolutionContainerManager + solutions: + food: + maxVol: 20 + reagents: + - ReagentId: Nutriment + Quantity: 3 + - type: RandomFillSolution + solution: food + weightedRandomId: RandomFillSpaceshroom + +- type: entity + parent: FoodSnackAncientBurger + id: FoodSnackAncientPizza + name: space pizza + description: At some point in time this probably looked delicious. + components: + - type: Sprite + state: ancient_pizza + +- type: entity + parent: FoodSnackAncientBurger + id: FoodSnackAncientFries + name: space fries + description: The salt appears to have preserved these, still stale and gross. + components: + - type: Sprite + state: ancient_fries + +- type: entity + parent: FoodSnackAncientBurger + id: FoodSnackAncientHotdog + name: space dog + description: This one is probably only marginally less safe to eat than when it was first created.. + components: + - type: Sprite + state: ancient_hotdog + +- type: entity + parent: FoodSnackAncientBurger + id: FoodSnackAncientTaco + name: space taco + description: Interestingly, the shell has gone soft and the contents have gone stale. + components: + - type: Sprite + state: ancient_taco + +# trash +- type: entity + noSpawn: true + parent: FoodPacketTrash + id: FoodPacketLunacakeTrash + name: lunacake wrapper + components: + - type: Sprite + sprite: Objects/Consumable/Food/bay_trash.rsi + state: cakewrap + - type: Item + +- type: entity + noSpawn: true + parent: FoodPacketLunacakeTrash + id: FoodPacketMochicakeTrash + name: mochicake wrapper + components: + - type: Sprite + state: mochicakewrap + - type: Item + +- type: entity + noSpawn: true + parent: FoodPacketLunacakeTrash + id: FoodPacketMooncakeTrash + name: mooncake wrapper + components: + - type: Sprite + state: mooncakewrap + - type: Item + +- type: entity + noSpawn: true + parent: FoodPacketLunacakeTrash + id: FoodPacketTidegobsTrash + name: tidegobs trash + components: + - type: Sprite + state: tidegobs + - type: Item + +- type: entity + noSpawn: true + parent: FoodPacketLunacakeTrash + id: FoodPacketSaturnosTrash + name: saturn-os trash + components: + - type: Sprite + state: saturno + - type: Item + +- type: entity + noSpawn: true + parent: FoodPacketLunacakeTrash + id: FoodPacketJoveGelloTrash + name: jove gello trash + components: + - type: Sprite + state: jupiter + - type: Item + +- type: entity + noSpawn: true + parent: FoodPacketLunacakeTrash + id: FoodPacketPlutoniumrodsTrash + name: plutonium rods trash + components: + - type: Sprite + state: pluto + - type: Item + +- type: entity + noSpawn: true + parent: FoodPacketLunacakeTrash + id: FoodPacketMarsFroukaTrash + name: mars frouka trash + components: + - type: Sprite + state: mars + - type: Item + +- type: entity + noSpawn: true + parent: FoodPacketLunacakeTrash + id: FoodPacketVenusTrash + name: venus hot cakes trash + components: + - type: Sprite + state: venus + - type: Item + +- type: entity + noSpawn: true + parent: FoodPacketLunacakeTrash + id: FoodPacketOortrocksTrash + name: oort rocks trash + components: + - type: Sprite + state: oort + - type: Item + +# weebo vend +- type: entity + noSpawn: true + parent: FoodPacketLunacakeTrash + id: FoodPacketRedalertnutsTrash + name: red alert nuts packet + components: + - type: Sprite + state: weebonuts + - type: Item + +- type: entity + noSpawn: true + parent: FoodPacketLunacakeTrash + id: FoodPacketStickTrash + name: stick + components: + - type: Sprite + state: stick + - type: Item + +# +- type: entity + noSpawn: true + parent: FoodPacketLunacakeTrash + id: FoodPacketProteinbarTrash + name: protein bar wrapper + components: + - type: Sprite + state: proteinbar + - type: Item diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml index 3b080e843b4..6b96f3bcb36 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml @@ -806,6 +806,10 @@ Quantity: 4 - ReagentId: Allicin Quantity: 3 + - type: Tag + tags: + - ChiliBowl + - type: entity name: cold chili @@ -830,6 +834,9 @@ Quantity: 8 - ReagentId: Vitamin Quantity: 4 + - type: Tag + tags: + - ChiliBowl - type: entity name: chili con carnival @@ -860,6 +867,9 @@ Quantity: 4 - ReagentId: Allicin Quantity: 3 + - type: Tag + tags: + - ChiliBowl - type: entity name: monkey's delight diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/cigarette.yml b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/cigarette.yml index 659cbaa28a2..18ea198697e 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/cigarette.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/cigarette.yml @@ -80,7 +80,7 @@ - ReagentId: Nicotine Quantity: 10 - ReagentId: Omnizine - Quantity: 30 + Quantity: 5 - type: entity id: CigaretteOmnizine diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/packs.yml b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/packs.yml index bc9079fb2db..eb8e0a1ffe6 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/packs.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/packs.yml @@ -182,7 +182,7 @@ id: CigPackSyndicate parent: CigPackBase name: Interdyne herbals packet - description: Elite cigarettes for elite syndicate agents. Infused with medicine for when you need to do more than calm your nerves. + description: Premium medicinal cigarettes from the Interdyne Corporation. Not endorsed by the Terra-Gov Surgeon General. components: - type: Sprite sprite: Objects/Consumable/Smokeables/Cigarettes/Packs/syndicate.rsi diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml index c2a1fe6e7dc..4cd8a850993 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml @@ -1175,9 +1175,9 @@ materialRequirements: Glass: 2 Cable: 2 - - type: ReverseEngineering # Nyano - recipes: - - MicrowaveMachineCircuitboard + - type: Tag + tags: + - MicrowaveMachineBoard - type: entity id: FatExtractorMachineCircuitboard @@ -1433,7 +1433,7 @@ materialRequirements: Steel: 5 CableHV: 5 - + - type: entity id: ShuttleGunPerforatorCircuitboard parent: BaseMachineCircuitboard @@ -1450,7 +1450,7 @@ materialRequirements: Steel: 10 CableHV: 5 - + - type: entity id: ShuttleGunFriendshipCircuitboard parent: BaseMachineCircuitboard @@ -1466,8 +1466,8 @@ Manipulator: 2 materialRequirements: Steel: 7 - CableHV: 5 - + CableHV: 5 + - type: entity id: ShuttleGunDusterCircuitboard parent: BaseMachineCircuitboard @@ -1485,7 +1485,7 @@ Steel: 10 CableHV: 5 Uranium: 2 - + - type: entity id: ShuttleGunKineticCircuitboard parent: BaseMachineCircuitboard @@ -1502,4 +1502,3 @@ materialRequirements: Steel: 5 CableHV: 2 - \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml index 706cbd5dbbf..7155be68d74 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml @@ -173,12 +173,13 @@ accentVColor: "#A32D26" - type: Icon state: pda-interncadet - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: entity parent: BasePDA @@ -430,12 +431,13 @@ borderColor: "#6f6192" - type: Icon state: pda-lawyer - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: entity parent: BasePDA @@ -643,12 +645,13 @@ accentHColor: "#447987" - type: Icon state: pda-hos - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: entity parent: BasePDA @@ -664,12 +667,13 @@ accentVColor: "#949137" - type: Icon state: pda-warden - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: entity parent: BasePDA @@ -684,12 +688,13 @@ borderColor: "#A32D26" - type: Icon state: pda-security - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: entity parent: BasePDA @@ -979,12 +984,13 @@ borderColor: "#774705" - type: Icon state: pda-detective - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: entity parent: BaseMedicalPDA @@ -1001,12 +1007,13 @@ accentVColor: "#d7d7d0" - type: Icon state: pda-brigmedic - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: entity parent: ClownPDA @@ -1092,12 +1099,13 @@ accentVColor: "#DFDFDF" - type: Icon state: pda-seniorofficer - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: entity parent: SyndiPDA diff --git a/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml b/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml new file mode 100644 index 00000000000..da42b2774b1 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml @@ -0,0 +1,128 @@ +- type: entity + parent: BaseSubdermalImplant + id: BasicGalacticCommonTranslatorImplant + name: basic common translator implant + description: Provides your illiterate friends the ability to understand the common galactic tongue. + noSpawn: true + components: + - type: TranslatorImplant + understood: + - GalacticCommon + +- type: entity + parent: BaseSubdermalImplant + id: GalacticCommonTranslatorImplant + name: advanced common translator implant + description: A more advanced version of the translator implant, teaches your illiterate friends the ability to both speak and understand the galactic tongue! + noSpawn: true + components: + - type: TranslatorImplant + understood: + - GalacticCommon + spoken: + - GalacticCommon + +- type: entity + parent: BaseSubdermalImplant + id: BubblishTranslatorImplant + name: bubblish translator implant + description: An implant that helps you speak and understand the language of slimes! Special vocal chords not included. + noSpawn: true + components: + - type: TranslatorImplant + understood: + - Bubblish + spoken: + - Bubblish + requires: + - GalacticCommon + +- type: entity + parent: BaseSubdermalImplant + id: NekomimeticTranslatorImplant + name: nekomimetic translator implant + description: A translator implant intially designed to help domestic cat owners understand their pets, now granting the ability to understand and speak to Felinids! + noSpawn: true + components: + - type: TranslatorImplant + understood: + - Nekomimetic + spoken: + - Nekomimetic + requires: + - GalacticCommon + +- type: entity + parent: BaseSubdermalImplant + id: DraconicTranslatorImplant + name: draconic translator implant + description: A translator implant giving the ability to speak to dragons! Subsequently, also allows to communicate with the Unathi. + noSpawn: true + components: + - type: TranslatorImplant + understood: + - Draconic + spoken: + - Draconic + requires: + - GalacticCommon + +- type: entity + parent: BaseSubdermalImplant + id: CanilunztTranslatorImplant + name: canilunzt translator implant + description: A translator implant that helps you communicate with your local yeepers. Yeep! + noSpawn: true + components: + - type: TranslatorImplant + understood: + - Canilunzt + spoken: + - Canilunzt + requires: + - GalacticCommon + +- type: entity + parent: BaseSubdermalImplant + id: SolCommonTranslatorImplant + name: sol-common translator implant + description: An implant giving the ability to understand and speak SolCommon. Raaagh! + noSpawn: true + components: + - type: TranslatorImplant + understood: + - SolCommon + spoken: + - SolCommon + requires: + - GalacticCommon + +- type: entity + parent: BaseSubdermalImplant + id: RootSpeakTranslatorImplant + name: root-speak translator implant + description: An implant that lets you speak for the trees. Or to the trees. + noSpawn: true + components: + - type: TranslatorImplant + understood: + - RootSpeak + spoken: + - RootSpeak + requires: + - GalacticCommon + +- type: entity + parent: BaseSubdermalImplant + id: MofficTranslatorImplant + name: Moffic translator implant + description: An implant designed to help domesticate mothroaches. Subsequently, allows you to communicate with the moth people. + noSpawn: true + components: + - type: TranslatorImplant + understood: + - Moffic + spoken: + - Moffic + requires: + - GalacticCommon diff --git a/Resources/Prototypes/Entities/Objects/Devices/translators.yml b/Resources/Prototypes/Entities/Objects/Devices/translators.yml new file mode 100644 index 00000000000..d75b7af7fd6 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Devices/translators.yml @@ -0,0 +1,220 @@ +# Translator that doesn't need power to work +- type: entity + noSpawn: true + id: TranslatorUnpowered + parent: BaseItem + name: translator + description: Translates speech. + components: + - type: Sprite + sprite: Objects/Devices/translator.rsi + state: icon + layers: + - state: icon + - state: translator + shader: unshaded + visible: false + map: [ "enum.ToggleVisuals.Layer", "enum.PowerDeviceVisualLayers.Powered" ] + - type: Appearance + - type: GenericVisualizer + visuals: + enum.ToggleVisuals.Toggled: + enum.ToggleVisuals.Layer: + True: { visible: true } + False: { visible: false } + - type: HandheldTranslator + enabled: false + - type: Clothing # To allow equipping translators on the neck slot + slots: [neck] + equipDelay: 0.3 + unequipDelay: 0.3 + quickEquip: false # Would conflict + +# Base translator that uses a power cell. Starts with an empty slot. +- type: entity + noSpawn: true + id: TranslatorPoweredBase + parent: [ TranslatorUnpowered, PowerCellSlotMediumItem ] + components: + - type: PowerCellDraw + drawRate: 1 + - type: ItemSlots + slots: + cell_slot: + name: power-cell-slot-component-slot-name-default + +# Normal translator with medium power cell in it +- type: entity + noSpawn: true + id: Translator + parent: [ PowerCellSlotMediumItem, TranslatorPoweredBase ] + suffix: Powered + +# Normal translator with a high power cell and special appearance +- type: entity + noSpawn: true + id: TranslatorForeigner + parent: [ PowerCellSlotHighItem, TranslatorPoweredBase ] + name: foreigner's translator + description: A special-issue translator that helps foreigner's speak and understand this station's primary language. + + +- type: entity + id: CanilunztTranslator + parent: [ TranslatorPoweredBase ] + name: Canilunzt translator + description: Translates speech between Canilunzt and Galactic Common, allowing your local yeepers to communicate with the locals and vice versa! + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - Canilunzt + understood: + - GalacticCommon + - Canilunzt + requires: + - GalacticCommon + - Canilunzt + +- type: entity + id: BubblishTranslator + parent: [ TranslatorPoweredBase ] + name: Bubblish translator + description: Translates speech between Bubblish and Galactic Common, helping communicate with slimes and slime people. + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - Bubblish + understood: + - GalacticCommon + - Bubblish + requires: + - GalacticCommon + - Bubblish + +- type: entity + id: NekomimeticTranslator + parent: [ TranslatorPoweredBase ] + name: Nekomimetic translator + description: Translates speech between Nekomimetic and Galactic Common, enabling you to communicate with your pet cats. + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - Nekomimetic + understood: + - GalacticCommon + - Nekomimetic + requires: + - GalacticCommon + - Nekomimetic + +- type: entity + id: DraconicTranslator + parent: [ TranslatorPoweredBase ] + name: Draconic translator + description: Translates speech between Draconic and Galactic Common, making it easier to understand your local Uniathi. + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - Draconic + understood: + - GalacticCommon + - Draconic + requires: + - GalacticCommon + - Draconic + +- type: entity + id: SolCommonTranslator + parent: [ TranslatorPoweredBase ] + name: Sol Common translator + description: Translates speech between Sol Common and Galactic Common. Like a true Earthman! + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - SolCommon + understood: + - GalacticCommon + - SolCommon + requires: + - GalacticCommon + - SolCommon + +- type: entity + id: RootSpeakTranslator + parent: [ TranslatorPoweredBase ] + name: RootSpeak translator + description: Translates speech between RootSpeak and Galactic Common. You may now speak for the trees. + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - RootSpeak + understood: + - GalacticCommon + - RootSpeak + requires: + - GalacticCommon + - RootSpeak + +- type: entity + id: MofficTranslator + parent: [ TranslatorPoweredBase ] + name: Moffic translator + description: Translates speech between Moffic and Galactic Common, helping you understand the buzzes of your pet mothroach! + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - Moffic + understood: + - GalacticCommon + - Moffic + requires: + - GalacticCommon + - Moffic + +- type: entity + id: XenoTranslator + parent: [ TranslatorPoweredBase ] + name: Xeno translator + description: Translates speech between Xeno and Galactic Common. This will probably not help you survive an encounter, though. + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - Xeno + understood: + - GalacticCommon + - Xeno + requires: + - GalacticCommon + +- type: entity + id: AnimalTranslator + parent: [ TranslatorPoweredBase ] + name: Animal translator + description: Translates all the cutes noises that most animals make into a more understandable form! + components: + - type: HandheldTranslator + understood: + - Cat + - Dog + - Fox + - Monkey + - Mouse + - Chicken + - Duck + - Cow + - Sheep + - Kangaroo + - Pig + - Crab + - Kobold + requires: + - GalacticCommon + setLanguageOnInteract: false diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/base_instruments.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/base_instruments.yml index 07d918b5765..09b41d6e5d7 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/base_instruments.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/base_instruments.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity abstract: true parent: BaseItem id: BaseHandheldInstrument @@ -71,6 +71,7 @@ - BulletImpassable - type: StaticPrice price: 300 + - type: RequireProjectileTarget - type: entity parent: BasePlaceableInstrument diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml index 7224efa9e02..fab8b56b06f 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml @@ -183,6 +183,13 @@ - type: Tag tags: - StringInstrument + - type: MeleeWeapon + soundHit: + path: /Audio/SimpleStation14/Weapons/Melee/banjohit.ogg + damage: + types: + Blunt: 7 + bluntStaminaDamageFactor: 1.5 - type: entity parent: BaseHandheldInstrument diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index 67c6e1194b7..9ced5539417 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -750,6 +750,34 @@ sound: path: /Audio/Voice/Human/malescream_5.ogg +- type: entity + parent: BasePlushie + id: PlushieArachne + name: Arachne plushie + description: A plushie of an Arachne, a half human, half spider creature. Why does it look familiar? + components: + - type: Sprite + state: plushie_arachne + - type: EmitSoundOnUse + sound: + path: /Audio/Voice/Human/womanlaugh.ogg + - type: EmitSoundOnLand + sound: + path: /Audio/Voice/Human/female_sigh.ogg + - type: EmitSoundOnActivate + sound: + path: /Audio/Voice/Human/womanlaugh.ogg + - type: Food + requiresSpecialDigestion: true + useSound: + path: /Audio/Voice/Human/femalescream_4.ogg + - type: MeleeWeapon + soundHit: + path: /Audio/Voice/Human/femalescream_2.ogg + - type: EmitSoundOnTrigger + sound: + path: /Audio/Voice/Human/femalescream_5.ogg + - type: entity parent: BasePlushie id: PlushieMoth @@ -1432,6 +1460,9 @@ reagents: - ReagentId: Nothing Quantity: 100 + - type: Tag + tags: + - Banana - type: entity parent: DrinkBase diff --git a/Resources/Prototypes/Entities/Objects/Magic/books.yml b/Resources/Prototypes/Entities/Objects/Magic/books.yml index 89acd9e7dab..4d1c585e4b8 100644 --- a/Resources/Prototypes/Entities/Objects/Magic/books.yml +++ b/Resources/Prototypes/Entities/Objects/Magic/books.yml @@ -12,6 +12,12 @@ - type: Tag tags: - Spellbook + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/book_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/book_drop.ogg + - type: EmitSoundOnLand + sound: /Audio/SimpleStation14/Items/Handling/book_drop.ogg - type: entity id: SpawnSpellbook diff --git a/Resources/Prototypes/Entities/Objects/Misc/bedsheets.yml b/Resources/Prototypes/Entities/Objects/Misc/bedsheets.yml index 209d0b8cc2d..0b9f00be65c 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/books.yml b/Resources/Prototypes/Entities/Objects/Misc/books.yml index ab6beb70af1..635f0888a1b 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/books.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/books.yml @@ -25,6 +25,12 @@ backgroundImagePath: "/Textures/Interface/Paper/paper_background_book.svg.96dpi.png" backgroundPatchMargin: 23.0, 16.0, 14.0, 15.0 contentMargin: 20.0, 20.0, 20.0, 20.0 + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/book_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/book_drop.ogg + - type: EmitSoundOnLand + sound: /Audio/SimpleStation14/Items/Handling/book_drop.ogg - type: entity id: BookSpaceEncyclopedia diff --git a/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml b/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml index e389bc6b378..f4b4f4c96cd 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml @@ -22,6 +22,12 @@ - HighRiskItem - type: StealTarget stealGroup: NukeDisk + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/disk_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/disk_drop.ogg + - type: EmitSoundOnLand + sound: /Audio/SimpleStation14/Items/Handling/disk_drop.ogg - type: entity name: nuclear authentication disk @@ -35,3 +41,9 @@ state: icon - type: StaticPrice price: 1 # it's worth even less than normal items. Perfection. + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/disk_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/disk_drop.ogg + - type: EmitSoundOnLand + sound: /Audio/SimpleStation14/Items/Handling/disk_drop.ogg diff --git a/Resources/Prototypes/Entities/Objects/Misc/handcuffs.yml b/Resources/Prototypes/Entities/Objects/Misc/handcuffs.yml index 5f970da1840..527233920d5 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/handcuffs.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/handcuffs.yml @@ -52,6 +52,7 @@ path: /Audio/Items/Handcuffs/rope_breakout.ogg startBreakoutSound: path: /Audio/Items/Handcuffs/rope_takeoff.ogg + uncuffEasierWhenLarge: true - type: Construction graph: makeshifthandcuffs node: cuffscable @@ -93,6 +94,7 @@ path: /Audio/Items/Handcuffs/rope_breakout.ogg startBreakoutSound: path: /Audio/Items/Handcuffs/rope_takeoff.ogg + uncuffEasierWhenLarge: true - type: Sprite sprite: Objects/Misc/zipties.rsi state: cuff diff --git a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml index 0b86677a8e5..f797ad5cead 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml @@ -35,7 +35,11 @@ - type: Sprite layers: - state: default - - state: idpassenger + - state: department + color: "#878787" + - state: subdepartment + color: "#878787" + - state: passenger - type: PresetIdCard job: Passenger @@ -49,7 +53,11 @@ - type: Sprite layers: - state: default - - state: idintern-tech + - state: department + color: "#F39F27" + - state: subdepartment + color: "#F39F27" + - state: assistant - type: entity parent: PassengerIDCard @@ -61,7 +69,11 @@ - type: Sprite layers: - state: default - - state: idintern-med + - state: department + color: "#5B97BC" + - state: subdepartment + color: "#5B97BC" + - state: assistant - type: entity parent: PassengerIDCard @@ -73,7 +85,11 @@ - type: Sprite layers: - state: default - - state: idintern-sci + - state: department + color: "#C96DBF" + - state: subdepartment + color: "#C96DBF" + - state: assistant - type: entity parent: PassengerIDCard @@ -85,7 +101,11 @@ - type: Sprite layers: - state: default - - state: idintern-cadet + - state: department + color: "#CB0000" + - state: subdepartment + color: "#CB0000" + - state: assistant - type: entity parent: PassengerIDCard @@ -97,7 +117,11 @@ - type: Sprite layers: - state: default - - state: idintern-service + - state: department + color: "#58C800" + - state: subdepartment + color: "#58C800" + - state: assistant - type: entity parent: IDCardStandard @@ -107,7 +131,11 @@ - type: Sprite layers: - state: gold - - state: idcaptain + - state: departmenthead + color: "#1B67A5" + - state: subdepartment + color: "#1B67A5" + - state: captain - type: Item heldPrefix: gold - type: PresetIdCard @@ -128,7 +156,11 @@ - type: Sprite layers: - state: default - - state: idsecurityofficer + - state: department + color: "#CB0000" + - state: subdepartment + color: "#CB0000" + - state: securityofficer - type: PresetIdCard job: SecurityOfficer @@ -137,12 +169,16 @@ id: WardenIDCard name: warden ID card components: - - type: Sprite - layers: - - state: default - - state: idwarden - - type: PresetIdCard - job: Warden + - type: Sprite + layers: + - state: default + - state: department + color: "#CB0000" + - state: subdepartment + color: "#CB0000" + - state: warden + - type: PresetIdCard + job: Warden - type: entity parent: IDCardStandard @@ -152,7 +188,11 @@ - type: Sprite layers: - state: default - - state: idstationengineer + - state: department + color: "#F39F27" + - state: subdepartment + color: "#F39F27" + - state: stationengineer - type: PresetIdCard job: StationEngineer @@ -164,7 +204,11 @@ - type: Sprite layers: - state: default - - state: idmedicaldoctor + - state: department + color: "#5B97BC" + - state: subdepartment + color: "#5B97BC" + - state: medicaldoctor - type: PresetIdCard job: MedicalDoctor @@ -176,7 +220,11 @@ - type: Sprite layers: - state: default - - state: idparamedic + - state: department + color: "#5B97BC" + - state: subdepartment + color: "#5B97BC" + - state: paramedic - type: PresetIdCard job: Paramedic @@ -188,7 +236,11 @@ - type: Sprite layers: - state: default - - state: idchemist + - state: department + color: "#5B97BC" + - state: subdepartment + color: "#5B97BC" + - state: chemist - type: PresetIdCard job: Chemist @@ -200,7 +252,11 @@ - type: Sprite layers: - state: default - - state: idcargotechnician + - state: department + color: "#B18644" + - state: subdepartment + color: "#B18644" + - state: cargotechnician - type: PresetIdCard job: CargoTechnician @@ -212,7 +268,11 @@ - type: Sprite layers: - state: default - - state: idshaftminer + - state: department + color: "#B18644" + - state: subdepartment + color: "#C96DBF" + - state: shaftminer - type: PresetIdCard job: SalvageSpecialist @@ -221,14 +281,18 @@ id: QuartermasterIDCard name: logistics officer ID card # DeltaV - Logistics Department replacing Cargo components: - - type: Sprite - layers: - - state: silver - - state: idquartermaster - - type: Item - heldPrefix: silver - - type: PresetIdCard - job: Quartermaster + - type: Sprite + layers: + - state: silver + - state: departmenthead + color: "#1B67A5" + - state: subdepartment + color: "#B18644" + - state: cargotechnician + - type: Item + heldPrefix: silver + - type: PresetIdCard + job: Quartermaster - type: entity parent: IDCardStandard @@ -238,7 +302,11 @@ - type: Sprite layers: - state: default - - state: idscientist + - state: department + color: "#C96DBF" + - state: subdepartment + color: "#C96DBF" + - state: scientist - type: PresetIdCard job: Scientist @@ -249,8 +317,12 @@ components: - type: Sprite layers: - - state: default - - state: idclown + - state: rainbow + - state: department + color: "#FF00FF" + - state: subdepartment + color: "#58C800" + - state: clown - type: PresetIdCard job: Clown @@ -262,7 +334,10 @@ - type: Sprite layers: - state: default - - state: idmime + - state: department + color: "#878787" + - state: subdepartment + - state: mime - type: PresetIdCard job: Mime @@ -271,11 +346,14 @@ id: ChaplainIDCard name: chaplain ID card components: - - type: Sprite - layers: - - state: default - - sprite: DeltaV/Objects/Misc/id_cards.rsi # DeltaV - Give Chaplain ID Epistemics colors - state: idchaplain + - type: Sprite + layers: + - state: default + - state: department + color: "#C96DBF" + - state: subdepartment + color: "#58C800" + - state: chaplain - type: PresetIdCard job: Chaplain @@ -287,7 +365,11 @@ - type: Sprite layers: - state: default - - state: idjanitor + - state: department + color: "#58C800" + - state: subdepartment + color: "#58C800" + - state: janitor - type: PresetIdCard job: Janitor @@ -299,22 +381,22 @@ - type: Sprite layers: - state: default - - state: idbartender + - state: department + color: "#58C800" + - state: subdepartment + color: "#58C800" + - state: bartender - type: PresetIdCard job: Bartender - type: entity - parent: IDCardStandard + parent: BartenderIDCard id: PunPunIDCard name: pun pun ID card components: - - type: Sprite - layers: - - state: default - - state: idbartender - - type: PresetIdCard - job: Bartender - name: Pun Pun + - type: PresetIdCard + job: Bartender + name: Pun Pun - type: entity parent: IDCardStandard @@ -324,7 +406,11 @@ - type: Sprite layers: - state: default - - state: idcook + - state: department + color: "#58C800" + - state: subdepartment + color: "#58C800" + - state: cook - type: PresetIdCard job: Chef @@ -333,36 +419,48 @@ id: BotanistIDCard name: botanist ID card components: - - type: Sprite - layers: - - state: default - - state: idbotanist - - type: PresetIdCard - job: Botanist + - type: Sprite + layers: + - state: default + - state: department + color: "#58C800" + - state: subdepartment + color: "#58C800" + - state: botanist + - type: PresetIdCard + job: Botanist - type: entity parent: IDCardStandard id: LibrarianIDCard name: librarian ID card components: - - type: Sprite - layers: - - state: default - - state: idcurator - - type: PresetIdCard - job: Librarian + - type: Sprite + layers: + - state: default + - state: department + color: "#58C800" + - state: subdepartment + color: "#58C800" + - state: curator + - type: PresetIdCard + job: Librarian - type: entity parent: IDCardStandard id: LawyerIDCard name: lawyer ID card components: - - type: Sprite - layers: - - state: default - - state: idlawyer - - type: PresetIdCard - job: Lawyer + - type: Sprite + layers: + - state: default + - state: department + color: "#878787" + - state: subdepartment + color: "#CB0000" + - state: lawyer + - type: PresetIdCard + job: Lawyer - type: entity parent: IDCardStandard @@ -372,7 +470,11 @@ - type: Sprite layers: - state: silver - - state: idheadofpersonnel + - state: departmenthead + color: "#1B67A5" + - state: subdepartment + color: "#58C800" + - state: headofpersonnel - type: Item heldPrefix: silver - type: PresetIdCard @@ -386,7 +488,11 @@ - type: Sprite layers: - state: silver - - state: idchiefengineer + - state: departmenthead + color: "#1B67A5" + - state: subdepartment + color: "#F39F27" + - state: stationengineer - type: Item heldPrefix: silver - type: PresetIdCard @@ -400,7 +506,11 @@ - type: Sprite layers: - state: silver - - state: idchiefmedicalofficer + - state: departmenthead + color: "#1B67A5" + - state: subdepartment + color: "#5B97BC" + - state: medicaldoctor - type: Item heldPrefix: silver - type: PresetIdCard @@ -414,7 +524,11 @@ - type: Sprite layers: - state: silver - - state: idresearchdirector + - state: departmenthead + color: "#1B67A5" + - state: subdepartment + color: "#C96DBF" + - state: scientist - type: Item heldPrefix: silver - type: PresetIdCard @@ -428,7 +542,11 @@ - type: Sprite layers: - state: silver - - state: idheadofsecurity + - state: departmenthead + color: "#1B67A5" + - state: subdepartment + color: "#CB0000" + - state: securityofficer - type: Item heldPrefix: silver - type: PresetIdCard @@ -442,7 +560,11 @@ - type: Sprite layers: - state: default - - state: idbrigmedic + - state: department + color: "#CB0000" + - state: subdepartment + color: "#5B97BC" + - state: medicaldoctor - type: PresetIdCard # Delta V - Brigmedic, see Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml job: Brigmedic @@ -454,7 +576,11 @@ - type: Sprite layers: - state: centcom - - state: idcentcom + - state: departmenthead + color: "#1B67A5" + - state: subdepartment + color: "#1B67A5" + - state: cc - type: Item heldPrefix: blue - type: IdCard @@ -473,8 +599,12 @@ components: - type: Sprite layers: - - state: gold - - state: ert_commander + - state: centcom + - state: departmenthead + color: "#1B67A5" + - state: subdepartment + color: "#1B67A5" + - state: captain - type: IdCard jobTitle: ERT Company Commander - type: Item @@ -487,8 +617,12 @@ components: - type: Sprite layers: - - state: gold - - state: ert_chaplain # we have the sprite for the id but dont have chaplain ERT equipment for now. + - state: centcom + - state: departmenthead + color: "#1B67A5" + - state: subdepartment + color: "#C96DBF" + - state: chaplain - type: IdCard jobTitle: ERT Soul Officer - type: Item @@ -501,8 +635,12 @@ components: - type: Sprite layers: - - state: gold - - state: ert_engineer + - state: centcom + - state: departmenthead + color: "#1B67A5" + - state: subdepartment + color: "#F39F27" + - state: stationengineer - type: IdCard jobTitle: ERT Field Engineer @@ -513,8 +651,12 @@ components: - type: Sprite layers: - - state: gold - - state: ert_janitor + - state: centcom + - state: departmenthead + color: "#1B67A5" + - state: subdepartment + color: "#58C800" + - state: janitor - type: IdCard jobTitle: ERT Custodian @@ -525,8 +667,12 @@ components: - type: Sprite layers: - - state: gold - - state: ert_medic + - state: centcom + - state: departmenthead + color: "#1B67A5" + - state: subdepartment + color: "#5B97BC" + - state: medicaldoctor - type: IdCard jobTitle: ERT Medical Doctor @@ -537,8 +683,12 @@ components: - type: Sprite layers: - - state: gold - - state: ert_security + - state: centcom + - state: departmenthead + color: "#1B67A5" + - state: subdepartment + color: "#CB0000" + - state: securityofficer - type: IdCard jobTitle: ERT Field Officer @@ -551,7 +701,11 @@ - type: Sprite layers: - state: centcom - - state: idcentcom + - state: departmenthead + color: "#1B67A5" + - state: subdepartment + color: "#1B67A5" + - state: cc - type: Item heldPrefix: blue - type: IdCard @@ -565,12 +719,16 @@ id: MusicianIDCard name: musician ID card components: - - type: Sprite - layers: - - state: default - - state: idmusician - - type: PresetIdCard - job: Musician + - type: Sprite + layers: + - state: default + - state: department + color: "#878787" + - state: subdepartment + color: "#878787" + - state: musician + - type: PresetIdCard + job: Musician - type: entity parent: CentcomIDCard @@ -580,6 +738,11 @@ - type: Sprite layers: - state: centcom + - state: departmenthead + color: "#CB0000" + - state: subdepartment + color: "#CB0000" + - state: death - type: Item heldPrefix: blue - type: IdCard @@ -600,7 +763,11 @@ - type: Sprite layers: - state: default - - state: idpassenger + - state: department + color: "#878787" + - state: subdepartment + color: "#878787" + - state: passenger - type: AgentIDCard icons: # TODO figure out a better way of doing this. @@ -691,8 +858,12 @@ components: - type: Sprite layers: - - state: orange - - state: idatmospherictechnician + - state: default + - state: department + color: "#F39F27" + - state: subdepartment + color: "#F39F27" + - state: atmospherictechnician - type: PresetIdCard job: AtmosphericTechnician @@ -703,7 +874,12 @@ components: - type: Sprite layers: - - state: syndie + - state: black + - state: department + color: "#CB0000" + - state: subdepartment + color: "#CB0000" + - state: syndicate - type: Access tags: - NuclearOperative @@ -716,7 +892,12 @@ components: - type: Sprite layers: - - state: pirate + - state: black + - state: department + color: "#878787" + - state: subdepartment + color: "#878787" + - state: death - type: Access tags: - NuclearOperative @@ -730,7 +911,11 @@ - type: Sprite layers: - state: default - - state: idpsychologist + - state: department + color: "#5B97BC" + - state: subdepartment + color: "#5B97BC" + - state: psychologist - type: PresetIdCard job: Psychologist @@ -742,7 +927,11 @@ - type: Sprite layers: - state: default - - state: idreporter + - state: department + color: "#58C800" + - state: subdepartment + color: "#58C800" + - state: headofpersonnel - type: PresetIdCard job: Reporter @@ -754,7 +943,11 @@ - type: Sprite layers: - state: default - - state: idboxer + - state: department + color: "#878787" + - state: subdepartment + color: "#878787" + - state: boxer - type: PresetIdCard job: Boxer @@ -766,7 +959,11 @@ - type: Sprite layers: - state: default - - state: idzookeeper + - state: department + color: "#58C800" + - state: subdepartment + color: "#58C800" + - state: zookeeper - type: PresetIdCard job: Zookeeper @@ -778,7 +975,11 @@ - type: Sprite layers: - state: default - - state: iddetective + - state: department + color: "#CB0000" + - state: subdepartment + color: "#CB0000" + - state: detective - type: PresetIdCard job: Detective @@ -791,6 +992,11 @@ - type: Sprite layers: - state: centcom + - state: departmenthead + color: "#CB0000" + - state: subdepartment + color: "#CB0000" + - state: cc - type: Item heldPrefix: blue - type: IdCard @@ -804,8 +1010,13 @@ components: - type: Sprite layers: - - state: default - - state: idcluwne + - state: rainbow + - state: department + color: "#5DC574" + - state: subdepartment + color: "#5DC574" + - state: clown + color: "#7C0A0A" - type: IdCard jobTitle: Cluwne - type: Unremoveable @@ -818,7 +1029,11 @@ - type: Sprite layers: - state: default - - state: idseniorengineer + - state: department + color: "#F39F27" + - state: subdepartment + color: "#F39F27" + - state: senior - type: PresetIdCard job: SeniorEngineer @@ -830,7 +1045,11 @@ - type: Sprite layers: - state: default - - state: idseniorresearcher + - state: department + color: "#C96DBF" + - state: subdepartment + color: "#C96DBF" + - state: senior - type: PresetIdCard job: SeniorResearcher @@ -842,7 +1061,11 @@ - type: Sprite layers: - state: default - - state: idseniorphysician + - state: department + color: "#5B97BC" + - state: subdepartment + color: "#5B97BC" + - state: senior - type: PresetIdCard job: SeniorPhysician @@ -854,6 +1077,10 @@ - type: Sprite layers: - state: default - - state: idseniorofficer + - state: department + color: "#CB0000" + - state: subdepartment + color: "#CB0000" + - state: senior - type: PresetIdCard job: SeniorOfficer diff --git a/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml b/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml index 9088edc8159..a3e3485bc65 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml @@ -35,9 +35,13 @@ - !type:DoActsBehavior acts: [ "Destruction" ] - type: LandMine - - type: TriggerOnStepTrigger + sound: + path: /Audio/Effects/beep_landmine.ogg + params: + maxDistance: 10 - type: StepTrigger requiredTriggeredSpeed: 0 + stepOn: true - type: entity name: kick mine @@ -57,7 +61,6 @@ - type: Construction graph: ModularMineGraph node: emptyCase - - type: LandMine - type: entity name: explosive mine @@ -71,4 +74,3 @@ intensitySlope: 3 totalIntensity: 120 # about a ~4 tile radius canCreateVacuum: false - - type: DeleteOnTrigger diff --git a/Resources/Prototypes/Entities/Objects/Misc/machine_parts.yml b/Resources/Prototypes/Entities/Objects/Misc/machine_parts.yml index 592f8be693b..341acb52f0b 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/machine_parts.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/machine_parts.yml @@ -7,8 +7,17 @@ components: - type: Sprite sprite: Objects/Misc/stock_parts.rsi + scale: 0.8, 0.8 - type: Item size: Tiny + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/component_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/component_drop.ogg + - type: EmitSoundOnLand + sound: /Audio/SimpleStation14/Items/Handling/component_drop.ogg + +# Rating 1 - type: entity id: CapacitorStockPart diff --git a/Resources/Prototypes/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/Entities/Objects/Misc/paper.yml index 58457ebb7fa..1767a956c8c 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/paper.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/paper.yml @@ -70,6 +70,12 @@ reagents: - ReagentId: Fiber Quantity: 1 + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/paper_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/paper_drop.ogg + - type: EmitSoundOnLand + sound: /Audio/SimpleStation14/Items/Handling/paper_drop.ogg - type: entity name: paper scrap @@ -255,6 +261,19 @@ components: - type: NukeCodePaper +- type: entity + parent: Paper + id: StationGoalPaper + name: station goal + description: It looks like you have a lot of work to do. + components: + - type: Paper + stampState: paper_stamp-centcom + stampedBy: + - stampedName: stamp-component-stamped-name-centcom + stampedColor: "#bb3232" + + - type: entity name: pen parent: BaseItem diff --git a/Resources/Prototypes/Entities/Objects/Misc/translator_implanters.yml b/Resources/Prototypes/Entities/Objects/Misc/translator_implanters.yml new file mode 100644 index 00000000000..8b5b262ff8a --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Misc/translator_implanters.yml @@ -0,0 +1,77 @@ +- type: entity + id: BaseTranslatorImplanter + abstract: true + parent: BaseImplantOnlyImplanter + name: basic translator implanter + +- type: entity + id: BasicGalaticCommonTranslatorImplanter + parent: BaseTranslatorImplanter + name: basic common translator implanter + components: + - type: Implanter + implant: BasicGalacticCommonTranslatorImplant + +- type: entity + id: AdvancedGalaticCommonTranslatorImplanter + parent: BaseTranslatorImplanter + name: advanced common translator implanter + components: + - type: Implanter + implant: GalacticCommonTranslatorImplant + +- type: entity + id: BubblishTranslatorImplanter + parent: BaseTranslatorImplanter + name: bubblish translator implant + components: + - type: Implanter + implant: BubblishTranslatorImplant + +- type: entity + id: NekomimeticTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: nekomimetic translator implant + components: + - type: Implanter + implant: NekomimeticTranslatorImplant + +- type: entity + id: DraconicTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: draconic translator implant + components: + - type: Implanter + implant: DraconicTranslatorImplant + +- type: entity + id: CanilunztTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: canilunzt translator implant + components: + - type: Implanter + implant: CanilunztTranslatorImplant + +- type: entity + id: SolCommonTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: sol-common translator implant + components: + - type: Implanter + implant: SolCommonTranslatorImplant + +- type: entity + id: RootSpeakTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: root-speak translator implant + components: + - type: Implanter + implant: RootSpeakTranslatorImplant + +- type: entity + id: MofficTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: moffic translator implant + components: + - type: Implanter + implant: MofficTranslatorImplant diff --git a/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml b/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml index 925e036e09e..c628d199a90 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/Chapel/bibles.yml b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml index 748ab123185..5a8726ff5ce 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml @@ -52,6 +52,12 @@ - Book - type: StealTarget stealGroup: Bible + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/book_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/book_drop.ogg + - type: EmitSoundOnLand + sound: /Audio/SimpleStation14/Items/Handling/book_drop.ogg - type: entity parent: Bible diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml index 8d3c83e3e1e..2ddb21b9e6c 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml @@ -230,6 +230,7 @@ - type: StepTrigger intersectRatio: 0.2 requiredTriggeredSpeed: 0 + stepOn: true - type: CollisionWake enabled: false - type: Physics @@ -251,6 +252,10 @@ mask: - ItemMask - type: LandMine + sound: + path: /Audio/Effects/beep_landmine.ogg + params: + maxDistance: 10 - type: ExplodeOnTrigger - type: Explosive explosionType: HardBomb # normally Default and max 5 total 60 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml b/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml index 5a2587ff710..ffa4e7ade7a 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml @@ -95,6 +95,7 @@ - type: GuideHelp guides: - Robotics + - type: CanWalk - type: entity id: MechRipley diff --git a/Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml b/Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml index 0cb605cee64..fa1b75530b6 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml @@ -11,6 +11,12 @@ - type: GuideHelp guides: - Science + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/disk_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/disk_drop.ogg + - type: EmitSoundOnLand + sound: /Audio/SimpleStation14/Items/Handling/disk_drop.ogg - type: entity parent: ResearchDisk @@ -69,3 +75,9 @@ components: - type: TechnologyDisk tierWeightPrototype: RareTechDiskTierWeights + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/disk_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/disk_drop.ogg + - type: EmitSoundOnLand + sound: /Audio/SimpleStation14/Items/Handling/disk_drop.ogg diff --git a/Resources/Prototypes/Entities/Objects/Tools/matches.yml b/Resources/Prototypes/Entities/Objects/Tools/matches.yml index e8601fcf355..561e478d93a 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/matches.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/matches.yml @@ -59,6 +59,10 @@ id: Matchbox description: A small box of Almost But Not Quite Plasma Premium Matches. components: + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/matchbox_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/matchbox_drop.ogg - type: EmitSoundOnLand sound: path: /Audio/Items/matchbox_drop.ogg diff --git a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml index 667d8559971..eee102bfbd7 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml @@ -7,6 +7,10 @@ layers: - map: [ base ] state: icon + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/toolbox_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/toolbox_drop.ogg - type: EmitSoundOnLand sound: path: /Audio/Items/toolbox_drop.ogg diff --git a/Resources/Prototypes/Entities/Objects/Tools/tools.yml b/Resources/Prototypes/Entities/Objects/Tools/tools.yml index f1bf2ff98e7..04afa1a3778 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/tools.yml @@ -4,6 +4,10 @@ id: Wirecutter description: This kills the wire. components: + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/wirecutter_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/wirecutter_drop.ogg - type: EmitSoundOnLand sound: path: /Audio/Items/wirecutter_drop.ogg @@ -50,6 +54,10 @@ id: Screwdriver description: Industrial grade torque in a small screwdriving package. components: + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/screwdriver_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/screwdriver_drop.ogg - type: EmitSoundOnLand sound: path: /Audio/Items/screwdriver_drop.ogg @@ -94,6 +102,10 @@ id: Wrench description: 'A common tool for assembly and disassembly. Remember: righty tighty, lefty loosey.' components: + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/wrench_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/wrench_drop.ogg - type: EmitSoundOnLand sound: path: /Audio/Items/wrench_drop.ogg @@ -133,6 +145,10 @@ id: Crowbar description: A multipurpose tool to pry open doors and fight interdimensional invaders. components: + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/crowbar_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/crowbar_drop.ogg - type: EmitSoundOnLand sound: path: /Audio/Items/crowbar_drop.ogg @@ -191,6 +207,10 @@ id: Multitool description: An advanced tool to copy, store, and send electrical pulses and signals through wires and machines components: + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/multitool_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/multitool_drop.ogg - type: EmitSoundOnLand sound: path: /Audio/Items/multitool_drop.ogg diff --git a/Resources/Prototypes/Entities/Objects/Tools/welders.yml b/Resources/Prototypes/Entities/Objects/Tools/welders.yml index 9bf3f2e2cb9..e141f35caeb 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/welders.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/welders.yml @@ -4,6 +4,10 @@ id: Welder description: "Melts anything as long as it's fueled, don't forget your eye protection!" components: + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/welder_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/welder_drop.ogg - type: EmitSoundOnLand sound: path: /Audio/Items/welder_drop.ogg diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/funny.yml b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/funny.yml index 4aff7363a45..630354f23d9 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/Guns/Ammunition/Boxes/base_ammo.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/base_ammo.yml new file mode 100644 index 00000000000..eceec8ac3e8 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/base_ammo.yml @@ -0,0 +1,11 @@ +- type: entity + abstract: true + parent: BaseItem + id: BaseMagazineBox + components: + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/ammobox_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/ammobox_drop.ogg + - type: EmitSoundOnLand + sound: /Audio/SimpleStation14/Items/Handling/ammobox_drop.ogg diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.yml index 063268d8b53..f1550cf9a8f 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.yml @@ -1,6 +1,6 @@ - type: entity abstract: true - parent: BaseItem + parent: BaseMagazineBox id: BaseMagazineBoxCaselessRifle name: ammunition box (.25 caseless) components: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/light_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/light_rifle.yml index 0670e376360..22eeeff859d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/light_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/light_rifle.yml @@ -1,6 +1,6 @@ - type: entity abstract: true - parent: BaseItem + parent: BaseMagazineBox id: BaseMagazineBoxLightRifle name: ammunition box (.30 rifle) components: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/magnum.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/magnum.yml index 65f6bff00eb..c304f0af111 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/magnum.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/magnum.yml @@ -1,6 +1,6 @@ - type: entity abstract: true - parent: BaseItem + parent: BaseMagazineBox id: BaseMagazineBoxMagnum components: - type: BallisticAmmoProvider diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/pistol.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/pistol.yml index 9f6a8e8257d..b78551b99bd 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/pistol.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/pistol.yml @@ -1,6 +1,6 @@ - type: entity abstract: true - parent: BaseItem + parent: BaseMagazineBox id: BaseMagazineBoxPistol name: ammunition box (.35 auto) components: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/rifle.yml index c321b77d10b..8e6c79dfe57 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/rifle.yml @@ -1,6 +1,6 @@ - type: entity abstract: true - parent: BaseItem + parent: BaseMagazineBox id: BaseMagazineBoxRifle components: - type: BallisticAmmoProvider diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/toy.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/toy.yml index 11649f3db3c..a3b1855a746 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/toy.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/toy.yml @@ -1,6 +1,6 @@ - type: entity abstract: true - parent: BaseItem + parent: BaseMagazineBox id: BoxDonkSoftBase name: foamdart box components: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/base_cartridge.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/base_cartridge.yml index e188ee8c658..3bef413dffa 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/base_cartridge.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/base_cartridge.yml @@ -11,10 +11,10 @@ shape: !type:PhysShapeAabb bounds: "-0.10,-0.05,0.10,0.05" - density: 20 + density: 0.5 mask: - ItemMask - restitution: 0.3 # fite me + restitution: 0.7 # Small and bouncy friction: 0.2 - type: Tag tags: @@ -23,6 +23,11 @@ size: Tiny - type: SpaceGarbage - type: EmitSoundOnLand + sound: + path: /Audio/Weapons/Guns/Casings/casing_fall_1.ogg + params: + volume: -1 + - type: EmitSoundOnCollide sound: path: /Audio/Weapons/Guns/Casings/casing_fall_2.ogg params: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml index f85e93b893f..93621bc3a28 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml @@ -22,6 +22,7 @@ - SemiAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/kinetic_accel.ogg + fireOnDropChance: 1 - type: AmmoCounter - type: Appearance - type: GenericVisualizer 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 202604b8bf0..bf0c51849a3 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml @@ -18,6 +18,7 @@ selectedMode: SemiAuto availableModes: - SemiAuto + fireOnDropChance: 0.15 soundGunshot: path: /Audio/Weapons/Guns/Gunshots/laser.ogg - type: Battery diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml index 16cacb79dfa..410664e46e4 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml @@ -99,6 +99,15 @@ containers: gun_magazine: !type:ContainerSlot gun_chamber: !type:ContainerSlot + - type: Gun + fireRate: 6 + selectedMode: SemiAuto + availableModes: + - SemiAuto + - FullAuto + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/pistol.ogg + fireOnDropChance: 0.3 - type: entity name: cobra @@ -125,6 +134,7 @@ volume: -14 availableModes: - SemiAuto + fireOnDropChance: 0.1 - type: ItemSlots slots: gun_magazine: @@ -169,6 +179,7 @@ - SemiAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/mk58.ogg + fireOnDropChance: 0.5 - type: entity id: WeaponPistolMk58Nonlethal @@ -198,7 +209,7 @@ name: N1984 parent: BaseWeaponPistol id: WeaponPistolN1984 # the spaces in description are for formatting. - description: The sidearm of any self respecting officer. Comes in .45 magnum, the lord's caliber. + description: The sidearm of any self respecting officer. Comes in .45 magnum, the lord's caliber. components: - type: Sprite sprite: Objects/Weapons/Guns/Pistols/N1984.rsi @@ -219,6 +230,7 @@ - SemiAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/mk58.ogg + fireOnDropChance: 0.6 - type: ItemSlots slots: gun_magazine: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml index bd043c997da..c5237cdad9a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml @@ -29,6 +29,7 @@ - SemiAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/revolver.ogg + fireOnDropChance: 0.5 - type: UseDelay delay: 0.66 - type: ContainerContainer @@ -127,6 +128,7 @@ path: /Audio/Weapons/Guns/Gunshots/revolver.ogg params: volume: 2.25 + fireOnDropChance: 0.3 - type: entity name: Python @@ -155,6 +157,7 @@ sprite: Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi - type: Gun fireRate: 1 + fireOnDropChance: 1 - type: ContainerContainer containers: revolver-ammo: !type:Container diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml index 5bc8125ebaa..c55b2b6b091 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml @@ -67,6 +67,7 @@ fireRate: 5 soundGunshot: path: /Audio/Weapons/Guns/Gunshots/rifle2.ogg + fireOnDropChance: 0.5 - type: ChamberMagazineAmmoProvider soundRack: path: /Audio/Weapons/Guns/Cock/ltrifle_cock.ogg @@ -159,6 +160,7 @@ - type: Gun soundGunshot: path: /Audio/Weapons/Guns/Gunshots/ltrifle.ogg + fireOnDropChance: 0.2 - type: ItemSlots slots: gun_magazine: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml index b693bdba370..2dfc833badf 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml @@ -72,6 +72,7 @@ fireRate: 10 soundGunshot: path: /Audio/Weapons/Guns/Gunshots/atreides.ogg + fireOnDropChance: 0.3 - type: MagazineVisuals magState: mag steps: 1 @@ -96,6 +97,7 @@ - type: Gun soundGunshot: path: /Audio/Weapons/Guns/Gunshots/c-20r.ogg + fireOnDropChance: 0.3 - type: ChamberMagazineAmmoProvider autoEject: true - type: MagazineVisuals @@ -126,6 +128,7 @@ path: /Audio/Weapons/Guns/Gunshots/atreides.ogg availableModes: - FullAuto + fireOnDropChance: 0.2 - type: ItemSlots slots: gun_magazine: @@ -173,6 +176,7 @@ path: /Audio/Weapons/Guns/Gunshots/atreides.ogg availableModes: - FullAuto + fireOnDropChance: 0.1 - type: ItemSlots slots: gun_magazine: @@ -225,6 +229,7 @@ selectedMode: FullAuto availableModes: - FullAuto + fireOnDropChance: 0.1 - type: ItemSlots slots: gun_magazine: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml index a8d9f539917..52b05b6d60b 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml @@ -28,6 +28,7 @@ path: /Audio/Weapons/Guns/Gunshots/shotgun.ogg soundEmpty: path: /Audio/Weapons/Guns/Empty/empty.ogg + fireOnDropChance: 0.2 - type: BallisticAmmoProvider whitelist: tags: @@ -75,6 +76,7 @@ path: /Audio/Weapons/Guns/Gunshots/shotgun.ogg soundEmpty: path: /Audio/Weapons/Guns/Empty/empty.ogg + fireOnDropChance: 0.3 - type: ItemSlots slots: gun_magazine: @@ -115,6 +117,7 @@ heldPrefix: db - type: Gun fireRate: 2 + fireOnDropChance: 0.5 - type: BallisticAmmoProvider capacity: 2 - type: Construction @@ -190,6 +193,7 @@ heldPrefix: sawn - type: Gun fireRate: 4 + fireOnDropChance: 0.5 - type: BallisticAmmoProvider capacity: 2 - type: Construction @@ -226,6 +230,7 @@ sprite: Objects/Weapons/Guns/Shotguns/hm_pistol.rsi - type: Gun fireRate: 4 + fireOnDropChance: 1 - type: BallisticAmmoProvider capacity: 1 - type: Construction @@ -250,6 +255,7 @@ sprite: Objects/Weapons/Guns/Shotguns/blunderbuss.rsi - type: Gun fireRate: 2 + fireOnDropChance: 1 - type: BallisticAmmoProvider capacity: 1 - type: StaticPrice @@ -273,6 +279,7 @@ heldPrefix: improvised - type: Gun fireRate: 4 #No reason to stifle the firerate since you have to manually reload every time anyways. + fireOnDropChance: 1 - type: BallisticAmmoProvider capacity: 1 proto: null diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml index c97459629cf..adb8e323f4a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml @@ -46,6 +46,14 @@ components: - type: Sprite sprite: Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi + - type: Gun + fireRate: 0.75 + selectedMode: SemiAuto + availableModes: + - SemiAuto + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/sniper.ogg + fireOnDropChance: 1 - type: entity name: Hristov @@ -82,6 +90,7 @@ selectedMode: SemiAuto availableModes: - SemiAuto + fireOnDropChance: 1 - type: UseDelayOnShoot - type: UseDelay delay: 8 #it's a musket @@ -111,6 +120,7 @@ - type: Gun minAngle: 0 maxAngle: 30 #miss him entirely because the barrel is smoothbore + fireOnDropChance: 1 - type: Item size: Small storedRotation: 90 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml index b5d597715aa..03654061ced 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml @@ -252,3 +252,32 @@ sprite: Objects/Weapons/Melee/uranium_shiv.rsi - type: Sprite sprite: Objects/Weapons/Melee/uranium_shiv.rsi + +- type: entity + name: throwing knife + parent: BaseKnife + id: ThrowingKnife + description: This bloodred knife is very aerodynamic and easy to throw, but good luck trying to fight someone hand-to-hand. + components: + - type: Tag + tags: + - CombatKnife + - Knife + - type: Sprite + sprite: Objects/Weapons/Melee/throwing_knife.rsi + state: icon + - type: MeleeWeapon + wideAnimationRotation: -135 + attackRate: 2 + damage: + types: + Slash: 5 + - type: EmbeddableProjectile + sound: /Audio/Weapons/star_hit.ogg + - type: DamageOtherOnHit + damage: + types: + Slash: 10 + Piercing: 15 + - type: Item + sprite: Objects/Weapons/Melee/throwing_knife.rsi diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml index 426be1386a9..17e31e5893c 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml @@ -11,11 +11,11 @@ - type: MeleeWeapon wideAnimationRotation: -135 attackRate: 1.5 + soundHit: + path: /Audio/SimpleStation14/Weapons/Melee/rapierhit.ogg damage: types: Slash: 17 #cmon, it has to be at least BETTER than the rest. - soundHit: - path: /Audio/Weapons/bladeslice.ogg - type: Reflect enabled: true reflectProb: .5 @@ -43,11 +43,11 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 + soundHit: + path: /Audio/SimpleStation14/Weapons/Melee/rapierhit.ogg damage: types: Slash: 15 - soundHit: - path: /Audio/Weapons/bladeslice.ogg - type: Item size: Normal sprite: DeltaV/Objects/Weapons/Melee/katana.rsi #DeltaV diff --git a/Resources/Prototypes/Entities/Structures/Decoration/curtains.yml b/Resources/Prototypes/Entities/Structures/Decoration/curtains.yml index 85c9bdae3df..77b03d36f5d 100644 --- a/Resources/Prototypes/Entities/Structures/Decoration/curtains.yml +++ b/Resources/Prototypes/Entities/Structures/Decoration/curtains.yml @@ -50,6 +50,8 @@ MaterialCloth1: min: 1 max: 2 + - type: WallMount + arc: 360 - type: entity id: HospitalCurtains @@ -350,4 +352,4 @@ graph: Curtains node: CurtainsWhiteOpen - type: Physics - canCollide: false \ No newline at end of file + canCollide: false diff --git a/Resources/Prototypes/Entities/Structures/Dispensers/base_structuredispensers.yml b/Resources/Prototypes/Entities/Structures/Dispensers/base_structuredispensers.yml index d87c5e700ab..fa814e8ed3a 100644 --- a/Resources/Prototypes/Entities/Structures/Dispensers/base_structuredispensers.yml +++ b/Resources/Prototypes/Entities/Structures/Dispensers/base_structuredispensers.yml @@ -1,7 +1,7 @@ - type: entity abstract: true id: ReagentDispenserBase - parent: ConstructibleMachine + parent: SmallConstructibleMachine placement: mode: SnapgridCenter components: diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml index 4bc43b5559e..476e715175e 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml @@ -104,7 +104,6 @@ - key: enum.WiresUiKey.Key type: WiresBoundUserInterface - type: Airtight - fixVacuum: true noAirWhenFullyAirBlocked: false - type: RadiationBlocker resistance: 3 diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml index d799558df75..a26226c9578 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml @@ -1,105 +1,104 @@ -- type: entity - id: HighSecDoor - parent: BaseStructure - name: high security door - description: Keeps the bad out and keeps the good in. - placement: - mode: SnapgridCenter - components: - - type: InteractionOutline - - type: Sprite - sprite: Structures/Doors/Airlocks/highsec/highsec.rsi - layers: - - state: closed - map: ["enum.DoorVisualLayers.Base"] - - state: closed_unlit - shader: unshaded - map: ["enum.DoorVisualLayers.BaseUnlit"] - - state: welded - map: ["enum.WeldableLayers.BaseWelded"] - - state: bolted_unlit - shader: unshaded - map: ["enum.DoorVisualLayers.BaseBolted"] - - state: emergency_unlit - map: ["enum.DoorVisualLayers.BaseEmergencyAccess"] - shader: unshaded - - state: panel_open - map: ["enum.WiresVisualLayers.MaintenancePanel"] - - type: AnimationPlayer - - type: Physics - - type: Fixtures - fixtures: - fix1: - shape: - !type:PhysShapeAabb - bounds: "-0.49,-0.49,0.49,0.49" # don't want this colliding with walls or they won't close - density: 100 - mask: - - FullTileMask - layer: - - WallLayer - - type: ContainerFill - containers: - board: [ DoorElectronics ] - - type: ContainerContainer - containers: - board: !type:Container - - type: Door - crushDamage: - types: - Blunt: 50 - openSound: - path: /Audio/Machines/airlock_open.ogg - closeSound: - path: /Audio/Machines/airlock_close.ogg - denySound: - path: /Audio/Machines/airlock_deny.ogg - - type: Weldable - time: 10 - - type: Airlock - - type: NavMapDoor - - type: DoorBolt - - type: AccessReader - - type: Appearance - - type: WiresVisuals - - type: ApcPowerReceiver - powerLoad: 20 - - type: ExtensionCableReceiver - - type: Electrified - enabled: false - usesApcPower: true - - type: WiresPanel - - type: WiresPanelSecurity - securityLevel: maxSecurity - - type: Wires - boardName: wires-board-name-highsec - layoutId: HighSec - alwaysRandomize: true - - type: UserInterface - interfaces: - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface - - type: Airtight - fixVacuum: true - - type: Occluder - - type: Damageable - damageContainer: StructuralInorganic - damageModifierSet: StrongMetallic - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 1500 - behaviors: - - !type:DoActsBehavior - acts: ["Destruction"] - - type: IconSmooth - key: walls - mode: NoSprite - - type: Construction - graph: Airlock - node: highSecDoor - - type: Tag - tags: - - HighSecDoor - # This tag is used to nagivate the Airlock construction graph. It's needed because this construction graph is shared between Airlock, AirlockGlass, and HighSecDoor +- type: entity + id: HighSecDoor + parent: BaseStructure + name: high security door + description: Keeps the bad out and keeps the good in. + placement: + mode: SnapgridCenter + components: + - type: InteractionOutline + - type: Sprite + sprite: Structures/Doors/Airlocks/highsec/highsec.rsi + layers: + - state: closed + map: ["enum.DoorVisualLayers.Base"] + - state: closed_unlit + shader: unshaded + map: ["enum.DoorVisualLayers.BaseUnlit"] + - state: welded + map: ["enum.WeldableLayers.BaseWelded"] + - state: bolted_unlit + shader: unshaded + map: ["enum.DoorVisualLayers.BaseBolted"] + - state: emergency_unlit + map: ["enum.DoorVisualLayers.BaseEmergencyAccess"] + shader: unshaded + - state: panel_open + map: ["enum.WiresVisualLayers.MaintenancePanel"] + - type: AnimationPlayer + - type: Physics + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.49,-0.49,0.49,0.49" # don't want this colliding with walls or they won't close + density: 100 + mask: + - FullTileMask + layer: + - WallLayer + - type: ContainerFill + containers: + board: [ DoorElectronics ] + - type: ContainerContainer + containers: + board: !type:Container + - type: Door + crushDamage: + types: + Blunt: 50 + openSound: + path: /Audio/Machines/airlock_open.ogg + closeSound: + path: /Audio/Machines/airlock_close.ogg + denySound: + path: /Audio/Machines/airlock_deny.ogg + - type: Weldable + time: 10 + - type: Airlock + - type: NavMapDoor + - type: DoorBolt + - type: AccessReader + - type: Appearance + - type: WiresVisuals + - type: ApcPowerReceiver + powerLoad: 20 + - type: ExtensionCableReceiver + - type: Electrified + enabled: false + usesApcPower: true + - type: WiresPanel + - type: WiresPanelSecurity + securityLevel: maxSecurity + - type: Wires + boardName: wires-board-name-highsec + layoutId: HighSec + alwaysRandomize: true + - type: UserInterface + interfaces: + - key: enum.WiresUiKey.Key + type: WiresBoundUserInterface + - type: Airtight + - type: Occluder + - type: Damageable + damageContainer: StructuralInorganic + damageModifierSet: StrongMetallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 1500 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] + - type: IconSmooth + key: walls + mode: NoSprite + - type: Construction + graph: Airlock + node: highSecDoor + - type: Tag + tags: + - HighSecDoor + # This tag is used to nagivate the Airlock construction graph. It's needed because this construction graph is shared between Airlock, AirlockGlass, and HighSecDoor diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml index 21d485be0c8..9771f633888 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml @@ -57,7 +57,6 @@ denySound: path: /Audio/Machines/airlock_deny.ogg - type: Airtight - fixVacuum: true noAirWhenFullyAirBlocked: false - type: Tag tags: diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml index dccc76e96c1..e677ef185be 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml @@ -93,7 +93,6 @@ - type: Physics canCollide: false - type: Airtight - fixVacuum: true airBlocked: false noAirWhenFullyAirBlocked: true - type: RadiationBlocker @@ -158,7 +157,6 @@ sprite: Structures/Doors/edge_door_hazard.rsi snapCardinals: false - type: Airtight - fixVacuum: true airBlocked: false noAirWhenFullyAirBlocked: false airBlockedDirection: diff --git a/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml b/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml index 644976eb9c4..3709b739a3e 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml @@ -40,7 +40,6 @@ path: /Audio/Effects/stonedoor_openclose.ogg - type: Appearance - type: Airtight - fixVacuum: true - type: Damageable damageContainer: Inorganic damageModifierSet: Metallic diff --git a/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml b/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml index 2c54d3cd418..d6c087af0a5 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml @@ -38,7 +38,6 @@ - type: Weldable time: 2 - type: Airtight - fixVacuum: true - type: Damageable damageContainer: Inorganic damageModifierSet: Metallic diff --git a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml index 7d3af93a64d..55010eea512 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml @@ -59,7 +59,6 @@ - key: enum.WiresUiKey.Key type: WiresBoundUserInterface - type: Airtight - fixVacuum: true - type: RadiationBlocker resistance: 2 - type: Damageable diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml index 56167c178e2..d03765d4fc9 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml @@ -130,7 +130,6 @@ - type: Appearance - type: WiresVisuals - type: Airtight - fixVacuum: true noAirWhenFullyAirBlocked: false airBlockedDirection: - South diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml index a5e26463b99..204e06c8600 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml @@ -60,3 +60,4 @@ ents: [] - type: LightningTarget priority: 1 + - type: RequireProjectileTarget diff --git a/Resources/Prototypes/Entities/Structures/Machines/Medical/chemistry_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/Medical/chemistry_machines.yml index e2c210e7e6b..7b1e89bcc10 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Medical/chemistry_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Medical/chemistry_machines.yml @@ -1,6 +1,6 @@ - type: entity id: BaseTabletopChemicalMachine - parent: [ BaseMachinePowered, ConstructibleMachine ] + parent: [ BaseMachinePowered, SmallConstructibleMachine ] abstract: true components: - type: Transform diff --git a/Resources/Prototypes/Entities/Structures/Machines/Medical/disease_diagnoser.yml b/Resources/Prototypes/Entities/Structures/Machines/Medical/disease_diagnoser.yml index e46c62053a9..ad98f47e36a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Medical/disease_diagnoser.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Medical/disease_diagnoser.yml @@ -1,6 +1,6 @@ - type: entity id: DiseaseDiagnoser - parent: [ BaseMachinePowered, ConstructibleMachine ] + parent: [ BaseMachinePowered, SmallConstructibleMachine ] name: Disease Diagnoser Delta Extreme description: A machine that analyzes disease samples. placement: @@ -43,5 +43,3 @@ contentMargin: 12.0, 0.0, 12.0, 0.0 # This is a narrow piece of paper maxWritableArea: 128.0, 0.0 - - diff --git a/Resources/Prototypes/Entities/Structures/Machines/Medical/vaccinator.yml b/Resources/Prototypes/Entities/Structures/Machines/Medical/vaccinator.yml index 041bca7c905..53542cdfa91 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Medical/vaccinator.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Medical/vaccinator.yml @@ -24,3 +24,4 @@ containers: machine_board: !type:Container machine_parts: !type:Container + - type: RequireProjectileTarget diff --git a/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml b/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml index 1b183661f51..e6b4f77fa8b 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml @@ -1,6 +1,6 @@ - type: entity id: MachineArtifactAnalyzer - parent: [ BaseMachinePowered, ConstructibleMachine ] + parent: [ BaseMachinePowered, SmallConstructibleMachine ] name: artifact analyzer description: A platform capable of performing analysis on various types of artifacts. components: @@ -35,6 +35,7 @@ - Impassable - MidImpassable - LowImpassable + - BulletImpassable hard: False - type: Transform anchored: true diff --git a/Resources/Prototypes/Entities/Structures/Machines/base_structuremachines.yml b/Resources/Prototypes/Entities/Structures/Machines/base_structuremachines.yml index 621d9a1a7ec..fb5ed4440a9 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/base_structuremachines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/base_structuremachines.yml @@ -70,3 +70,10 @@ - machine_board - type: LightningTarget priority: 1 + +- type: entity + abstract: true + parent: ConstructibleMachine + id: SmallConstructibleMachine + components: + - type: RequireProjectileTarget diff --git a/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml b/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml index af15034257b..e8439f82131 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml @@ -65,6 +65,7 @@ deviceNetId: Wireless receiveFrequencyId: Fax transmitFrequencyId: Fax + - type: RequireProjectileTarget # Special - type: entity @@ -108,5 +109,7 @@ - type: FaxMachine name: "Captain's Office" receiveNukeCodes: true + receiveStationGoal: true - type: StealTarget stealGroup: FaxMachineCaptain + diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 011f2a3b649..c632116612a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -157,6 +157,7 @@ - APCElectronics - SMESMachineCircuitboard - SubstationMachineCircuitboard + - WallmountSubstationElectronics - CellRechargerCircuitboard - BorgChargerCircuitboard - WeaponCapacitorRechargerCircuitboard @@ -341,6 +342,24 @@ - FauxTileAstroSnow - OreBagOfHolding - DeviceQuantumSpinInverter + - CanilunztTranslator + - BubblishTranslator + - NekomimeticTranslator + - DraconicTranslator + - SolCommonTranslator + - RootSpeakTranslator + - XenoTranslator + - BasicGalaticCommonTranslatorImplanter + - AdvancedGalaticCommonTranslatorImplanter + - BubblishTranslatorImplanter + - NekomimeticTranslatorImplanter + - DraconicTranslatorImplanter + - CanilunztTranslatorImplanter + - SolCommonTranslatorImplanter + - RootSpeakTranslatorImplanter + - AnimalTranslator + - MofficTranslatorImplanter + - MofficTranslator - type: EmagLatheRecipes emagDynamicRecipes: - ExplosivePayload @@ -500,6 +519,7 @@ - Sheet - RawMaterial - Ingot + - type: RequireProjectileTarget - type: entity id: ExosuitFabricator @@ -723,6 +743,7 @@ - ShellShotgunPractice - WeaponLaserCarbinePractice - WeaponDisablerPractice + - ShockCollar # DeltaV - .38 special ammo - Add various .38 special ammo to security techfab - MagazineBoxSpecial - MagazineBoxSpecialPractice diff --git a/Resources/Prototypes/Entities/Structures/Machines/microwave.yml b/Resources/Prototypes/Entities/Structures/Machines/microwave.yml index 37b5e50d31d..55dfe296a61 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/microwave.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/microwave.yml @@ -1,6 +1,6 @@ -- type: entity +- type: entity id: KitchenMicrowave - parent: [ BaseMachinePowered, ConstructibleMachine ] + parent: [ BaseMachinePowered, SmallConstructibleMachine ] name: microwave description: It's magic. components: diff --git a/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml b/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml index d19e2379972..12fec44e4f4 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml @@ -1,6 +1,6 @@ - type: entity id: KitchenReagentGrinder - parent: [ BaseMachinePowered, ConstructibleMachine ] + parent: [ BaseMachinePowered, SmallConstructibleMachine ] name: reagent grinder description: From BlenderTech. Will It Blend? Let's find out! suffix: grinder/juicer diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index efbdb05d1c5..c9d9cfbf2c2 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -14,7 +14,7 @@ path: /Audio/Ambience/Objects/vending_machine_hum.ogg - type: Sprite sprite: Structures/Machines/VendingMachines/empty.rsi - snapCardinals: true + snapCardinals: false - type: Physics bodyType: Static - type: Transform @@ -89,7 +89,10 @@ - type: PointLight enabled: false castShadows: false - radius: 1.5 + radius: 2 + energy: 1.5 + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: LitOnPowered - type: ApcPowerReceiver powerLoad: 200 @@ -101,6 +104,15 @@ price: 100 - type: Appearance - type: WiresVisuals + - type: LanguageKnowledge + speaks: + - GalacticCommon + - RobotTalk + understands: + - GalacticCommon + - RobotTalk + - type: VendingMachine + soundVend: /Audio/SimpleStation14/Machines/machine_vend.ogg - type: entity parent: VendingMachine @@ -205,7 +217,8 @@ ejectState: eject-unshaded denyState: deny-unshaded - type: Sprite - sprite: Structures/Machines/VendingMachines/cart.rsi + noRot: true + sprite: Structures/Machines/VendingMachines/laptop.rsi layers: - state: "off" map: ["enum.VendingMachineVisualLayers.Base"] @@ -215,11 +228,18 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1 + radius: 2 energy: 1.3 color: "#ffb0b0" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: AccessReader access: [["HeadOfPersonnel"]] + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true - type: entity parent: VendingMachine @@ -248,9 +268,11 @@ - type: AccessReader access: [["Service"]] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#4b93ad" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: entity parent: VendingMachine @@ -271,6 +293,7 @@ pack: CigaretteMachineAds - type: Speech - type: Sprite + noRot: true sprite: Structures/Machines/VendingMachines/cigs.rsi layers: - state: "off" @@ -280,6 +303,11 @@ shader: unshaded - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true - type: entity parent: VendingMachine @@ -307,9 +335,11 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.8 + radius: 2 energy: 1.6 color: "#3db83b" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: entity parent: VendingMachine @@ -337,9 +367,11 @@ - state: panel map: [ "enum.WiresVisualLayers.MaintenancePanel" ] - type: PointLight - radius: 1.8 + radius: 2 energy: 1.6 color: "#3db83b" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: entity parent: VendingMachine @@ -364,6 +396,7 @@ pack: HotDrinksMachineAds - type: Speech - type: Sprite + noRot: true sprite: Structures/Machines/VendingMachines/coffee.rsi layers: - state: "off" @@ -377,9 +410,16 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.3 color: "#ad7c4b" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true - type: entity parent: VendingMachine @@ -402,6 +442,7 @@ pack: RobustSoftdrinksAds - type: Speech - type: Sprite + noRot: true sprite: Structures/Machines/VendingMachines/cola.rsi layers: - state: "off" @@ -412,9 +453,16 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#3c5eb5" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true - type: entity parent: VendingMachineCola @@ -422,7 +470,7 @@ suffix: Black components: - type: Sprite - sprite: Structures/Machines/VendingMachines/cola-black.rsi + sprite: Structures/Machines/VendingMachines/soda2.rsi layers: - state: "off" map: ["enum.VendingMachineVisualLayers.Base"] @@ -432,9 +480,11 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#423438" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: entity parent: VendingMachineCola @@ -443,7 +493,7 @@ description: It vends cola, in space. components: - type: Sprite - sprite: Structures/Machines/VendingMachines/cola-red.rsi + sprite: Structures/Machines/VendingMachines/cola.rsi layers: - state: "off" map: ["enum.VendingMachineVisualLayers.Base"] @@ -453,18 +503,22 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#A50824" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: entity - parent: VendingMachineCola + parent: VendingMachine id: VendingMachineSpaceUp name: Space-Up! Vendor description: Indulge in an explosion of flavor. components: - type: VendingMachine pack: SpaceUpInventory + offState: off + normalState: normal-unshaded - type: Sprite sprite: Structures/Machines/VendingMachines/spaceup.rsi layers: @@ -476,9 +530,11 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#44964A" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: entity parent: VendingMachineCola @@ -487,7 +543,12 @@ components: - type: VendingMachine pack: SodaInventory + offState: off + normalState: normal-unshaded + denyState: deny-unshaded + ejectState: eject-unshaded - type: Sprite + noRot: true sprite: Structures/Machines/VendingMachines/soda.rsi layers: - state: "off" @@ -498,18 +559,27 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#CBC6BE" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true - type: entity - parent: VendingMachineCola + parent: VendingMachine id: VendingMachineStarkist name: Star-kist Vendor description: The taste of a star in liquid form. components: - type: VendingMachine pack: StarkistInventory + offState: off + normalState: normal-unshaded - type: Sprite sprite: Structures/Machines/VendingMachines/starkist.rsi layers: @@ -521,9 +591,13 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#D3A44D" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + - type: Transform + noRot: true - type: entity parent: VendingMachine @@ -556,9 +630,11 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#66538F" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: entity parent: VendingMachine @@ -591,9 +667,11 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#6927C5" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: entity parent: VendingMachine @@ -626,9 +704,11 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#D82929" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: entity parent: VendingMachine @@ -642,9 +722,11 @@ brokenState: broken normalState: normal-unshaded ejectState: eject-unshaded + denyState: deny-unshaded - type: Advertise pack: DinnerwareAds - type: Sprite + noRot: true sprite: Structures/Machines/VendingMachines/dinnerware.rsi layers: - state: "off" @@ -657,9 +739,16 @@ - type: AccessReader access: [["Service"]] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#4b93ad" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true - type: entity parent: VendingMachine @@ -672,9 +761,12 @@ offState: off brokenState: broken normalState: normal-unshaded + denyState: deny-unshaded + ejectState: eject-unshaded - type: Advertise pack: MagiVendAds - type: Sprite + noRot: true sprite: Structures/Machines/VendingMachines/magivend.rsi layers: - state: "off" @@ -685,9 +777,16 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#9a18d6" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true - type: entity parent: VendingMachine @@ -717,9 +816,11 @@ - texture: Structures/Machines/VendingMachines/maintenance_panel.png map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#6148c7" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: entity parent: VendingMachine @@ -735,6 +836,7 @@ ejectState: eject-unshaded denyState: deny-unshaded - type: Sprite + noRot: true sprite: Structures/Machines/VendingMachines/engivend.rsi layers: - state: "off" @@ -747,9 +849,16 @@ - type: AccessReader access: [["Engineering"]] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#b89e2a" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true - type: entity parent: VendingMachine @@ -768,7 +877,8 @@ - type: Advertise pack: NanoMedAds - type: Sprite - sprite: Structures/Machines/VendingMachines/medical.rsi + sprite: Structures/Machines/VendingMachines/medivend.rsi + noRot: true layers: - state: "off" map: ["enum.VendingMachineVisualLayers.Base"] @@ -780,12 +890,19 @@ - type: AccessReader access: [["Medical"]] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#9dc5c9" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: GuideHelp guides: - Medical Doctor + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true - type: entity parent: VendingMachine @@ -803,7 +920,7 @@ - type: Advertise pack: NutriMaxAds - type: Sprite - sprite: Structures/Machines/VendingMachines/nutri.rsi + sprite: Structures/Machines/VendingMachines/nutri_green.rsi layers: - state: "off" map: ["enum.VendingMachineVisualLayers.Base"] @@ -815,9 +932,11 @@ - type: AccessReader access: [["Hydroponics"]] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#326e3f" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: entity parent: VendingMachine @@ -835,7 +954,8 @@ - type: Advertise pack: SecTechAds - type: Sprite - sprite: Structures/Machines/VendingMachines/sec.rsi + sprite: Structures/Machines/VendingMachines/security.rsi + noRot: true layers: - state: "off" map: ["enum.VendingMachineVisualLayers.Base"] @@ -847,12 +967,19 @@ - type: AccessReader access: [["Security"]] - type: PointLight - radius: 1 - energy: 1.2 + radius: 2 + energy: 1.8 color: "#78645c" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: GuideHelp guides: - Security + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true - type: entity parent: VendingMachine @@ -871,7 +998,7 @@ - type: Advertise pack: MegaSeedAds - type: Sprite - sprite: Structures/Machines/VendingMachines/seeds.rsi + sprite: Structures/Machines/VendingMachines/seeds_green.rsi layers: - state: "off" map: ["enum.VendingMachineVisualLayers.Base"] @@ -881,9 +1008,11 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#326e3f" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: entity parent: VendingMachineSeedsUnlocked @@ -913,6 +1042,7 @@ pack: GetmoreChocolateCorpAds - type: Speech - type: Sprite + noRot: true sprite: Structures/Machines/VendingMachines/snack.rsi layers: - state: "off" @@ -923,9 +1053,16 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#c73434" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true - type: entity parent: VendingMachineSnack @@ -953,9 +1090,11 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#737785" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: entity parent: VendingMachineSnack @@ -973,9 +1112,11 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#3c5eb5" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: entity parent: VendingMachineSnack @@ -993,9 +1134,11 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#CE3401" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: entity parent: VendingMachineSnack @@ -1013,9 +1156,11 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#5F6A1C" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: entity parent: VendingMachineSnack @@ -1033,9 +1178,11 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#207E79" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: entity parent: VendingMachine @@ -1057,7 +1204,8 @@ pack: BodaAds - type: Speech - type: Sprite - sprite: Structures/Machines/VendingMachines/sovietsoda.rsi + sprite: Structures/Machines/VendingMachines/sodasoviet.rsi + noRot: true layers: - state: "off" map: ["enum.VendingMachineVisualLayers.Base"] @@ -1067,9 +1215,16 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 - color: "#389690" + color: "#B80F0A" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true - type: entity parent: VendingMachine @@ -1090,6 +1245,7 @@ - type: Speech - type: Sprite sprite: Structures/Machines/VendingMachines/theater.rsi + noRot: true layers: - state: "off" map: ["enum.VendingMachineVisualLayers.Base"] @@ -1102,9 +1258,16 @@ map: ["enum.VendingMachineVisualLayers.Screen"] shader: unshaded - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#c73434" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true - type: entity parent: VendingMachine @@ -1123,6 +1286,7 @@ pack: VendomatAds - type: Speech - type: Sprite + noRot: true sprite: Structures/Machines/VendingMachines/vendomat.rsi layers: - state: "off" @@ -1133,9 +1297,16 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#9dc5c9" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true - type: entity parent: VendingMachine @@ -1154,6 +1325,7 @@ pack: VendomatAds - type: Speech - type: Sprite + noRot: true sprite: Structures/Machines/VendingMachines/robotics.rsi layers: - state: "off" @@ -1166,9 +1338,16 @@ - type: AccessReader access: [["Research"]] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#B0ADA9" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true - type: GuideHelp guides: - Robotics @@ -1187,6 +1366,7 @@ ejectState: eject-unshaded denyState: deny-unshaded - type: Sprite + noRot: true sprite: Structures/Machines/VendingMachines/youtool.rsi layers: - state: "off" @@ -1197,9 +1377,16 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#d4ab33" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true - type: entity parent: VendingMachine @@ -1217,6 +1404,7 @@ - type: Advertise pack: GoodCleanFunAds - type: Sprite + noRot: true sprite: Structures/Machines/VendingMachines/games.rsi layers: - state: "off" @@ -1227,9 +1415,16 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#326e3f" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true - type: entity parent: VendingMachine @@ -1244,12 +1439,15 @@ offState: off brokenState: broken normalState: normal-unshaded + denyState: deny-unshaded + ejectState: eject-unshaded initialStockQuality: 0.33 - type: Advertise pack: ChangAds - type: Speech - type: Sprite - sprite: Structures/Machines/VendingMachines/changs.rsi + noRot: true + sprite: Structures/Machines/VendingMachines/snix.rsi layers: - state: "off" map: ["enum.VendingMachineVisualLayers.Base"] @@ -1259,9 +1457,16 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#ffe599" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true - type: entity parent: VendingMachine @@ -1286,9 +1491,11 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#9dc5c9" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: AccessReader access: [["Salvage"]] - type: GuideHelp @@ -1323,9 +1530,11 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#d4ab33" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true # wallmounted machines @@ -1345,11 +1554,13 @@ - type: Sprite drawdepth: WallMountedItems snapCardinals: false - - type: Rotatable - type: WallMount arc: 175 - type: Transform noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true - type: entity parent: VendingMachineWallmount @@ -1363,7 +1574,9 @@ brokenState: broken normalState: normal-unshaded denyState: deny-unshaded + ejectState: eject-unshaded - type: Sprite + noRot: true sprite: Structures/Machines/VendingMachines/wallmed.rsi layers: - state: "off" @@ -1378,6 +1591,17 @@ - type: GuideHelp guides: - Medical + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true + - type: PointLight + radius: 2 + energy: 1.6 + color: "#9dc5c9" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true # job clothing @@ -1509,9 +1733,11 @@ - type: AccessReader access: [["Chapel"]] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#CCCCCC" #The holy C + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: entity parent: VendingMachine @@ -1732,10 +1958,12 @@ offState: off brokenState: broken normalState: normal-unshaded + denyState: deny-unshaded + ejectState: eject-unshaded - type: Advertise pack: JaniDrobeAds - type: Sprite - sprite: Structures/Machines/VendingMachines/janidrobe.rsi + sprite: Structures/Machines/VendingMachines/lavatory.rsi layers: - state: "off" map: ["enum.VendingMachineVisualLayers.Base"] @@ -1746,6 +1974,12 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: AccessReader access: [["Janitor"]] + - type: PointLight + radius: 2 + energy: 1.6 + color: "#9dc5c9" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: entity parent: VendingMachine @@ -1899,9 +2133,11 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#48CF48" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: AccessReader access: [["CentralCommand"]] @@ -1933,9 +2169,11 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 + radius: 2 energy: 1.6 color: "#3c5eb5" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true - type: Advertise pack: HappyHonkAds - type: AccessReader @@ -2015,3 +2253,158 @@ - type: AccessReader access: [["SyndicateAgent"]] +- type: entity + id: VendingMachineFitness + parent: VendingMachine + name: SweatMAX + description: An exercise aid and nutrition supplement vendor that preys on your inadequacy. + components: + - type: Sprite + noRot: true + sprite: Structures/Machines/VendingMachines/fitness.rsi + layers: + - state: "off" + map: ["enum.VendingMachineVisualLayers.Base"] + - state: "off" + map: ["enum.VendingMachineVisualLayers.BaseUnshaded"] + shader: unshaded + - state: "screen" + map: ["enum.VendingMachineVisualLayers.Screen"] + shader: unshaded + - state: panel + map: ["enum.WiresVisualLayers.MaintenancePanel"] + - type: VendingMachine + pack: FitnessVendInventory + offState: off + brokenState: broken + normalState: normal-unshaded + denyState: deny-unshaded + ejectState: eject-unshaded + screenState: screen + - type: Advertise + pack: FitnessVendAds + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true + - type: PointLight + radius: 2 + energy: 1.6 + color: "#9dc5c9" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + +- type: entity + id: VendingMachineHotfood + parent: VendingMachine + name: hot foods + description: An old vending machine promising 'hot foods'. You doubt any of its contents are still edible. + components: + - type: Sprite + noRot: true + sprite: Structures/Machines/VendingMachines/hotfood.rsi + layers: + - state: "off" + map: ["enum.VendingMachineVisualLayers.Base"] + - state: "off" + map: ["enum.VendingMachineVisualLayers.BaseUnshaded"] + shader: unshaded + - state: panel + map: ["enum.WiresVisualLayers.MaintenancePanel"] + - state: heater + - type: VendingMachine + pack: HotfoodInventory + offState: off + brokenState: broken + normalState: normal-unshaded + denyState: deny-unshaded + ejectState: eject-unshaded + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true + - type: Advertise + pack: HotfoodAds + - type: PointLight + radius: 2 + energy: 1.6 + color: "#9dc5c9" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + +- type: entity + id: VendingMachineSolsnack + parent: VendingMachine + name: Mars Mart + description: A SolCentric vending machine dispensing treats from home. + components: + - type: Sprite + noRot: true + sprite: Structures/Machines/VendingMachines/solsnack.rsi + layers: + - state: "off" + map: ["enum.VendingMachineVisualLayers.Base"] + - state: "off" + map: ["enum.VendingMachineVisualLayers.BaseUnshaded"] + shader: unshaded + - state: panel + map: ["enum.WiresVisualLayers.MaintenancePanel"] + - type: VendingMachine + pack: SolsnackInventory + offState: off + brokenState: broken + normalState: normal-unshaded + ejectState: eject-unshaded + denyState: deny-unshaded + - type: Advertise + pack: SolsnackAds + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true + - type: PointLight + radius: 2 + energy: 1.6 + color: "#9dc5c9" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + +- type: entity + id: VendingMachineWeeb + parent: VendingMachine + name: Nippon-tan + description: A distressingly ethnic vending machine loaded with high sucrose low calorie for lack of better words snacks. + components: + - type: Sprite + noRot: true + sprite: Structures/Machines/VendingMachines/weeb.rsi + layers: + - state: "off" + map: ["enum.VendingMachineVisualLayers.Base"] + - state: "off" + map: ["enum.VendingMachineVisualLayers.BaseUnshaded"] + shader: unshaded + - state: panel + map: ["enum.WiresVisualLayers.MaintenancePanel"] + - state: fan + - type: VendingMachine + pack: WeebVendInventory + offState: off + brokenState: broken + normalState: normal-unshaded + denyState: deny-unshaded + ejectState: eject-unshaded + - type: Advertise + pack: WeebVendAds + - type: Transform + noRot: false + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true + - type: PointLight + radius: 2 + energy: 1.6 + color: "#9dc5c9" + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true diff --git a/Resources/Prototypes/Entities/Structures/Machines/wireless_surveillance_camera.yml b/Resources/Prototypes/Entities/Structures/Machines/wireless_surveillance_camera.yml index d69eb96f623..0a145177713 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/wireless_surveillance_camera.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/wireless_surveillance_camera.yml @@ -1,6 +1,6 @@ - type: entity abstract: true - parent: [ BaseStructureDynamic, ConstructibleMachine ] + parent: [ BaseStructureDynamic, SmallConstructibleMachine ] id: SurveillanceWirelessCameraBase name: wireless camera description: A camera. It's watching you. Kinda. @@ -23,6 +23,8 @@ density: 80 mask: - MachineMask + layer: + - BulletImpassable - type: SurveillanceCameraMicrophone blacklist: components: diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/portable.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/portable.yml index 0e2a5f6fe5d..7f994b237ac 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/portable.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/portable.yml @@ -1,6 +1,6 @@ - type: entity id: PortableScrubber - parent: [BaseMachinePowered, ConstructibleMachine] + parent: [BaseMachinePowered, SmallConstructibleMachine] name: portable scrubber description: It scrubs, portably! components: @@ -120,7 +120,7 @@ layer: - MachineLayer - type: ApcPowerReceiver - powerDisabled: true #starts off + powerDisabled: true #starts off - type: Sprite sprite: Structures/Piping/Atmospherics/Portable/portable_sheater.rsi noRot: true @@ -195,4 +195,4 @@ suffix: Anchored, Enabled components: - type: ApcPowerReceiver - powerDisabled: false \ No newline at end of file + powerDisabled: false diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml index 06f2fb2d181..6858f0433de 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml @@ -390,7 +390,7 @@ board: HellfireHeaterMachineCircuitBoard - type: entity - parent: [ BaseMachinePowered, ConstructibleMachine ] + parent: [ BaseMachinePowered, SmallConstructibleMachine ] id: BaseGasCondenser name: condenser description: Condenses gases into liquids. Now we just need some plumbing. diff --git a/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml b/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml index 1193182d09f..a9ea8261371 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml @@ -91,6 +91,7 @@ - key: enum.DisposalUnitUiKey.Key type: DisposalUnitBoundUserInterface - type: RatKingRummageable + - type: RequireProjectileTarget - type: entity id: MailingUnit diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/emitter.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/emitter.yml index 52698f62cc0..6cfbc04ee1b 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/emitter.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/emitter.yml @@ -1,7 +1,7 @@ - type: entity id: Emitter name: emitter - parent: ConstructibleMachine + parent: SmallConstructibleMachine description: A heavy duty industrial laser. Shoots non-stop when turned on. placement: mode: SnapgridCenter diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml index b606c01f1dd..26f0a1de6db 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml @@ -1,4 +1,4 @@ -# +# # You can use this Desmos sheet to calculate fuel burn rate values: # https://www.desmos.com/calculator/qcektq5dqs # @@ -6,7 +6,7 @@ - type: entity abstract: true id: PortableGeneratorBase - parent: [ BaseMachine, ConstructibleMachine ] + parent: [ BaseMachine, SmallConstructibleMachine] components: # Basic properties - type: Transform diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/solar.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/solar.yml index 5a28c4962c1..c512266e974 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/solar.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/solar.yml @@ -49,6 +49,7 @@ onBump: false requirePower: true highVoltageNode: output + - type: RequireProjectileTarget - type: entity id: SolarPanel @@ -157,6 +158,7 @@ graph: SolarPanel node: solarassembly defaultTarget: solarpanel + - type: RequireProjectileTarget - type: entity id: SolarTracker @@ -201,3 +203,4 @@ - type: Construction graph: SolarPanel node: solartracker + - type: RequireProjectileTarget diff --git a/Resources/Prototypes/Entities/Structures/Power/chargers.yml b/Resources/Prototypes/Entities/Structures/Power/chargers.yml index 388cc3c9874..9f322dc5926 100644 --- a/Resources/Prototypes/Entities/Structures/Power/chargers.yml +++ b/Resources/Prototypes/Entities/Structures/Power/chargers.yml @@ -58,12 +58,15 @@ density: 500 mask: - TabletopMachineMask + layer: + - BulletImpassable - type: PowerChargerVisuals - type: ContainerContainer containers: charger_slot: !type:ContainerSlot machine_board: !type:Container machine_parts: !type:Container + - type: RequireProjectileTarget - type: entity parent: BaseItemRecharger diff --git a/Resources/Prototypes/Entities/Structures/Power/substation.yml b/Resources/Prototypes/Entities/Structures/Power/substation.yml index 94de12be185..04c83bd991e 100644 --- a/Resources/Prototypes/Entities/Structures/Power/substation.yml +++ b/Resources/Prototypes/Entities/Structures/Power/substation.yml @@ -244,6 +244,16 @@ - type: Battery maxCharge: 2000000 startingCharge: 2000000 + - type: ContainerFill + containers: + board: [ WallmountSubstationElectronics ] + capacitor: [ CapacitorStockPart ] + powercell: [ PowerCellSmall ] + - type: ContainerContainer + containers: + board: !type:Container + capacitor: !type:Container + powercell: !type:Container # Construction Frame - type: entity diff --git a/Resources/Prototypes/Entities/Structures/Specific/bay12barbershop.yml b/Resources/Prototypes/Entities/Structures/Specific/bay12barbershop.yml new file mode 100644 index 00000000000..e66ae347d97 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Specific/bay12barbershop.yml @@ -0,0 +1,36 @@ +- type: entity + parent: SeatBase + id: ChairBarber + name: barbers chair + components: + - type: Transform + anchored: true + - type: Physics + bodyType: Static + - type: Anchorable + - type: Rotatable + - type: Sprite + sprite: Structures/Specific/barbershop.rsi + state: barberchair + +- type: entity + parent: BaseSign + id: BarberSignPole + name: barber pole + description: Hypnotic. + components: + - type: Sprite + sprite: Structures/Specific/barbershop.rsi + state: pole + snapCardinals: false + +- type: entity + parent: BarberSignPole + id: BarberSignThesnip + name: the snip + description: Let's hope it's not a medical practice... + components: + - type: Sprite + sprite: Structures/Specific/barbershop.rsi + state: thesnip + snapCardinals: false diff --git a/Resources/Prototypes/Entities/Structures/Specific/bay12fitness.yml b/Resources/Prototypes/Entities/Structures/Specific/bay12fitness.yml new file mode 100644 index 00000000000..1da1d85da02 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Specific/bay12fitness.yml @@ -0,0 +1,80 @@ +- type: entity + parent: SeatBase + id: FitnessWeightsBench1 + name: weights bench + components: + - type: Transform + anchored: true + - type: Physics + bodyType: Static + - type: Anchorable + - type: Rotatable + - type: Sprite + sprite: Structures/Specific/fitness.rsi + state: fitnessweight + +- type: entity + parent: FitnessWeightsBench1 + id: FitnessWeightLifter + name: weight lifter + components: + - type: Sprite + sprite: Structures/Specific/fitness.rsi + state: fitnesslifter + + +# Bags +# TODO: Need a way to change to animation state on trigger in world (click) or use damage state visualiser and instant healing to change state on attack. +#soundOnTrigger ? +#TriggerOnActivate ? +#TriggerOnCollide ? + +- type: entity + id: FitnessPunchingBagBopClown + parent: BaseStructure + name: clown bop bag + description: A fitness training bag with a clown printed on it. + components: + - type: Sprite + sprite: Structures/Specific/fitness.rsi + state: bopbag + +- type: entity + id: FitnessPunchingBag + parent: BaseStructure + name: punching bag + description: A fitness training bag. + components: + - type: Sprite + sprite: Structures/Specific/fitness.rsi + state: punchingbag + +- type: entity + id: FitnessPunchingBagCaptain + parent: FitnessPunchingBag + suffix: captain + description: A fitness training bag with a captain printed on it. + components: + - type: Sprite + sprite: Structures/Specific/fitness.rsi + state: punchingbagcaptain + +- type: entity + id: FitnessPunchingBagSyndicate + parent: FitnessPunchingBag + suffix: syndicate + description: A fitness training bag with a syndicate agent printed on it. + components: + - type: Sprite + sprite: Structures/Specific/fitness.rsi + state: punchingbagsyndie + +- type: entity + id: FitnessPunchingBagWizard + parent: FitnessPunchingBag + suffix: wizard + description: A fitness training bag with a wizard printed on it. + components: + - type: Sprite + sprite: Structures/Specific/fitness.rsi + state: punchingbagwizard diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml index 0ef99b9f47e..23b1efdf535 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml @@ -48,6 +48,10 @@ layer: - MachineLayer - type: EntityStorage + closeSound: + path: /Audio/Effects/closet_close.ogg + openSound: + path: /Audio/Effects/closet_open.ogg - type: ContainerContainer containers: entity_storage: !type:Container diff --git a/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml b/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml index 403e20b43c7..6299abef89a 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml @@ -74,6 +74,7 @@ node: crategenericsteel containers: - entity_storage + - type: RequireProjectileTarget - type: entity parent: CrateGeneric diff --git a/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml b/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml index d341c017a70..d6becda9cc5 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml @@ -156,6 +156,7 @@ node: chestDrawer - type: StaticPrice price: 15 + - type: RequireProjectileTarget - type: entity abstract: true diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/base_structuresigns.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/base_structuresigns.yml index e7d938a3c9a..04289371228 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/base_structuresigns.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/base_structuresigns.yml @@ -32,6 +32,7 @@ - type: Sprite drawdepth: WallTops sprite: Structures/Wallmounts/signs.rsi - snapCardinals: true + snapCardinals: false + noRot: true - type: StaticPrice price: 20 diff --git a/Resources/Prototypes/Entities/Structures/Walls/fence_wood.yml b/Resources/Prototypes/Entities/Structures/Walls/fence_wood.yml index f2b03aaeb8f..7277af64ca5 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/fence_wood.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/fence_wood.yml @@ -69,7 +69,7 @@ acts: [ "Destruction" ] - type: Climbable delay: 2.5 - + - type: RequireProjectileTarget #High - type: entity @@ -93,8 +93,10 @@ mask: - FullTileMask layer: + - Opaque - MidImpassable - LowImpassable + - BulletImpassable - type: Construction graph: FenceWood node: straight @@ -120,8 +122,10 @@ mask: - FullTileMask layer: + - Opaque - MidImpassable - LowImpassable + - BulletImpassable - type: Construction graph: FenceWood node: end @@ -156,8 +160,10 @@ mask: - TableMask layer: + - Opaque - MidImpassable - LowImpassable + - BulletImpassable - type: Construction graph: FenceWood node: corner @@ -192,8 +198,10 @@ mask: - TableMask layer: + - Opaque - MidImpassable - LowImpassable + - BulletImpassable - type: Construction graph: FenceWood node: tjunction @@ -218,8 +226,10 @@ mask: - FullTileMask layer: + - Opaque - MidImpassable - LowImpassable + - BulletImpassable - type: InteractionOutline - type: Door openSpriteState: door_opened @@ -268,6 +278,7 @@ layer: - MidImpassable - LowImpassable + - BulletImpassable - type: Construction graph: FenceWood node: straight_small @@ -295,6 +306,7 @@ layer: - MidImpassable - LowImpassable + - BulletImpassable - type: Construction graph: FenceWood node: end_small @@ -331,6 +343,7 @@ layer: - MidImpassable - LowImpassable + - BulletImpassable - type: Construction graph: FenceWood node: corner_small @@ -367,6 +380,7 @@ layer: - MidImpassable - LowImpassable + - BulletImpassable - type: Construction graph: FenceWood node: tjunction_small @@ -393,6 +407,7 @@ layer: - MidImpassable - LowImpassable + - BulletImpassable - type: InteractionOutline - type: Door openSpriteState: door_opened_small @@ -415,4 +430,4 @@ path: /Audio/Effects/door_close.ogg - type: Construction graph: FenceWood - node: gate_small \ No newline at end of file + node: gate_small diff --git a/Resources/Prototypes/Entities/Structures/hydro_tray.yml b/Resources/Prototypes/Entities/Structures/hydro_tray.yml index 43b8bd197a5..6dac2e656e4 100644 --- a/Resources/Prototypes/Entities/Structures/hydro_tray.yml +++ b/Resources/Prototypes/Entities/Structures/hydro_tray.yml @@ -1,6 +1,6 @@ - type: entity name: hydroponics tray - parent: [ hydroponicsSoil, ConstructibleMachine] + parent: [ hydroponicsSoil, SmallConstructibleMachine] id: hydroponicsTray description: An interstellar-grade space farmplot allowing for rapid growth and selective breeding of crops. Just... keep in mind the space weeds. components: @@ -14,6 +14,8 @@ hard: true mask: - MachineMask + layer: + - BulletImpassable - type: Anchorable - type: Pullable - type: Sprite diff --git a/Resources/Prototypes/Entities/Structures/plastic_flaps.yml b/Resources/Prototypes/Entities/Structures/plastic_flaps.yml index 8c53daf3b60..bf49eb1be35 100644 --- a/Resources/Prototypes/Entities/Structures/plastic_flaps.yml +++ b/Resources/Prototypes/Entities/Structures/plastic_flaps.yml @@ -83,7 +83,6 @@ - !type:DoActsBehavior acts: ["Destruction"] - type: Airtight - fixVacuum: true - type: entity id: PlasticFlapsAirtightOpaque @@ -101,4 +100,3 @@ - !type:DoActsBehavior acts: ["Destruction"] - type: Airtight - fixVacuum: true diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index c9af55042e9..e9c7e5fbad7 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -49,7 +49,7 @@ noSpawn: true components: - type: StationEvent - startAnnouncement: station-event-bureaucratic-error-announcement + startAnnouncement: true minimumPlayers: 25 weight: 5 duration: 1 @@ -61,7 +61,7 @@ noSpawn: true components: - type: StationEvent - startAnnouncement: station-event-clerical-error-announcement + startAnnouncement: true minimumPlayers: 15 weight: 5 duration: 1 @@ -134,10 +134,8 @@ noSpawn: true components: - type: StationEvent - startAnnouncement: station-event-gas-leak-start-announcement - startAudio: - path: /Audio/Announcements/gas_leak.ogg # DeltaV - custom announcer - endAnnouncement: station-event-gas-leak-end-announcement + startAnnouncement: true + endAnnouncement: true earliestStart: 10 minimumPlayers: 5 weight: 10 @@ -166,12 +164,8 @@ earliestStart: 30 weight: 7.5 minimumPlayers: 10 #Enough to hopefully have at least one engineering guy - startAnnouncement: station-event-meteor-swarm-start-announcement - endAnnouncement: station-event-meteor-swarm-end-announcement - startAudio: - path: /Audio/Announcements/meteors.ogg - params: - volume: -4 + startAnnouncement: true + endAnnouncement: true duration: null #ending is handled by MeteorSwarmRule startDelay: 30 - type: MeteorSwarmRule @@ -182,9 +176,7 @@ noSpawn: true components: - type: StationEvent - startAnnouncement: station-event-vent-creatures-start-announcement - startAudio: - path: /Audio/Announcements/attention.ogg + startAnnouncement: true startDelay: 10 earliestStart: 30 minimumPlayers: 35 @@ -210,9 +202,7 @@ noSpawn: true components: - type: StationEvent - startAnnouncement: station-event-vent-creatures-start-announcement - startAudio: - path: /Audio/Announcements/attention.ogg + startAnnouncement: true startDelay: 10 weight: 5 duration: 50 @@ -230,12 +220,8 @@ components: - type: StationEvent weight: 10 - startAnnouncement: station-event-power-grid-check-start-announcement - endAnnouncement: station-event-power-grid-check-end-announcement - startAudio: - path: /Audio/Announcements/power_off.ogg - params: - volume: -4 + startAnnouncement: true + endAnnouncement: true startDelay: 24 duration: 60 maxDuration: 120 @@ -249,8 +235,6 @@ # - type: StationEvent # weight: 10 # duration: 1 -# startAudio: -# path: /Audio/Announcements/attention.ogg # - type: RandomSentienceRule - type: entity @@ -260,10 +244,8 @@ components: - type: StationEvent weight: 10 - startAnnouncement: station-event-solar-flare-start-announcement - endAnnouncement: station-event-solar-flare-end-announcement - startAudio: - path: /Audio/Announcements/attention.ogg + startAnnouncement: true + endAnnouncement: true duration: 120 maxDuration: 240 - type: SolarFlareRule @@ -301,9 +283,7 @@ noSpawn: true components: - type: StationEvent - startAnnouncement: station-event-vent-clog-start-announcement - startAudio: - path: /Audio/Announcements/ventclog.ogg # DeltaV - custom announcer + startAnnouncement: true earliestStart: 15 minimumPlayers: 15 weight: 5 @@ -317,9 +297,7 @@ noSpawn: true components: - type: StationEvent - startAnnouncement: station-event-vent-creatures-start-announcement - startAudio: - path: /Audio/Announcements/attention.ogg + startAnnouncement: true startDelay: 10 earliestStart: 15 minimumPlayers: 15 @@ -340,9 +318,7 @@ noSpawn: true components: - type: StationEvent - startAnnouncement: station-event-vent-creatures-start-announcement - startAudio: - path: /Audio/Announcements/attention.ogg + startAnnouncement: true startDelay: 10 earliestStart: 20 minimumPlayers: 15 @@ -363,9 +339,7 @@ noSpawn: true components: - type: StationEvent - startAnnouncement: station-event-vent-creatures-start-announcement - startAudio: - path: /Audio/Announcements/attention.ogg + startAnnouncement: true startDelay: 10 earliestStart: 20 minimumPlayers: 15 @@ -382,9 +356,7 @@ # noSpawn: true # components: # - type: StationEvent -# startAnnouncement: station-event-vent-creatures-start-announcement -# startAudio: -# path: /Audio/Announcements/attention.ogg +# startAnnouncement: true # startDelay: 10 # earliestStart: 20 # minimumPlayers: 15 @@ -418,9 +390,9 @@ noSpawn: true components: - type: StationEvent - earliestStart: 60 # DeltaV - was 45 - weight: 3 # DeltaV - was 5 - minimumPlayers: 10 + earliestStart: 60 + weight: 3 + minimumPlayers: 20 reoccurrenceDelay: 30 duration: 1 - type: LoneOpsSpawnRule @@ -447,9 +419,7 @@ # noSpawn: true # components: # - type: StationEvent -# startAnnouncement: station-event-immovable-rod-start-announcement -# startAudio: -# path: /Audio/Announcements/attention.ogg +# startAnnouncement: true # weight: 5 # duration: 1 # earliestStart: 45 diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml index 9ed1889154d..8e518ab2f18 100644 --- a/Resources/Prototypes/GameRules/roundstart.yml +++ b/Resources/Prototypes/GameRules/roundstart.yml @@ -132,6 +132,16 @@ components: - type: RampingStationEventScheduler +- type: entity + id: HellshiftStationEventScheduler + parent: BaseGameRule + noSpawn: true + components: + - type: RampingStationEventScheduler + chaosModifier: 4 # By default, one event each 30-10 seconds after two hours. Changing CVars will cause this to deviate. + startingChaosRatio: 0.025 # Starts as slow as survival, but quickly ramps up + shiftLengthModifier: 2.5 + # variation passes - type: entity id: BasicRoundstartVariation diff --git a/Resources/Prototypes/Language/languages.yml b/Resources/Prototypes/Language/languages.yml new file mode 100644 index 00000000000..048fdc6f24c --- /dev/null +++ b/Resources/Prototypes/Language/languages.yml @@ -0,0 +1,569 @@ +# The universal language, assumed if the entity has a UniversalLanguageSpeakerComponent. +# Do not use otherwise. Making an entity explicitly understand/speak this language will NOT have the desired effect. +- type: language + id: Universal + obfuscation: + !type:ReplacementObfuscation + replacement: + - "*incomprehensible*" # Never actually used + +# The common galactic tongue. +- type: language + id: GalacticCommon + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 + replacement: + - blah + - blah + - blah + - dingle-doingle + - dingle + - dangle + - jibber-jabber + - jubber + - bleh + - zippity + - zoop + - wibble + - wobble + - wiggle + - yada + - meh + - neh + - nah + - wah + +# Spoken by slimes. +- type: language + id: Bubblish + color: "#0077aa" + fontId: RubikBubbles + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 + replacement: + - blob + - plop + - pop + - bop + - boop + +# Spoken by moths. +- type: language + id: Moffic + color: "#869b29" + fontId: Copperplate + obfuscation: + !type:SyllableObfuscation + minSyllables: 2 # Replacements are really short + maxSyllables: 4 + replacement: + - år + - i + - går + - sek + - mo + - ff + - ok + - gj + - ø + - gå + - la + - le + - lit + - ygg + - van + - dår + - næ + - møt + - idd + - hvo + - ja + - på + - han + - så + - ån + - det + - att + - nå + - gö + - bra + - int + - tyc + - om + - när + - två + - må + - dag + - sjä + - vii + - vuo + - eil + - tun + - käyt + - teh + - vä + - hei + - huo + - suo + - ää + - ten + - ja + - heu + - stu + - uhr + - kön + - we + - hön + +# Spoken by dionas. +- type: language + id: RootSpeak + color: "#804000" + fontId: Noganas + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 5 + replacement: + - hs + - zt + - kr + - st + - sh + +# A mess of broken Japanese, spoken by Felinds and Oni +- type: language + id: Nekomimetic + color: "#803B56" + fontId: Manga + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 # May be too long even, we'll see. + replacement: + - neko + - nyan + - mimi + - moe + - mofu + - fuwa + - kyaa + - kawaii + - poka + - munya + - puni + - munyu + - ufufu + - icha + - doki + - kyun + - kusu + - nya + - nyaa + - desu + - kis + - ama + - chuu + - baka + - hewo + - boop + - gato + - kit + - sune + - yori + - sou + - baka + - chan + - san + - kun + - mahou + - yatta + - suki + - usagi + - domo + - ori + - uwa + - zaazaa + - shiku + - puru + - ira + - heto + - etto + +# Spoken by the Lizard race. +- type: language + id: Draconic + color: "#228b22" + obfuscation: + !type:SyllableObfuscation + minSyllables: 2 + maxSyllables: 4 + replacement: + - za + - az + - ze + - ez + - zi + - iz + - zo + - oz + - zu + - uz + - zs + - sz + - ha + - ah + - he + - eh + - hi + - ih + - ho + - oh + - hu + - uh + - hs + - sh + - la + - al + - le + - el + - li + - il + - lo + - ol + - lu + - ul + - ls + - sl + - ka + - ak + - ke + - ek + - ki + - ik + - ko + - ok + - ku + - uk + - ks + - sk + - sa + - as + - se + - es + - si + - is + - so + - os + - su + - us + - ss + - ss + - ra + - ar + - re + - er + - ri + - ir + - ro + - or + - ru + - ur + - rs + - sr + - a + - a + - e + - e + - i + - i + - o + - o + - u + - u + - s + - s + +# Spoken by the Vulpkanin race. +- type: language + id: Canilunzt + color: "#b97a57" + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 4 + replacement: + - rur + - ya + - cen + - rawr + - bar + - kuk + - tek + - qat + - uk + - wu + - vuh + - tah + - tch + - schz + - auch + - ist + - ein + - entch + - zwichs + - tut + - mir + - wo + - bis + - es + - vor + - nic + - gro + - enem + - zandt + - tzch + - noch + - hel + - ischt + - far + - wa + - baram + - iereng + - tech + - lach + - sam + - mak + - lich + - gen + - or + - ag + - eck + - gec + - stag + - onn + - bin + - ket + - jarl + - vulf + - einech + - cresthz + - azunein + - ghzth + +# The common language of the Sol system. +- type: language + id: SolCommon + color: "#8282fb" + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 4 + replacement: + - tao + - shi + - tzu + - yi + - com + - be + - is + - i + - op + - vi + - ed + - lec + - mo + - cle + - te + - dis + - e + +- type: language + id: RobotTalk + fontId: Monospace + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 10 # Crazy + replacement: + - 0 + - 1 + +# Languages spoken by various critters. +- type: language + id: Cat + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 2 + replacement: + - murr + - meow + - purr + - mrow + +- type: language + id: Dog + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 2 + replacement: + - woof + - bark + - ruff + - bork + - raff + - garr + +- type: language + id: Fox + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 2 + replacement: + - ruff + - raff + - garr + - yip + - yap + - myah + +- type: language + id: Xeno + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 8 # I was crazy once + replacement: + - s + - S + +- type: language + id: Monkey + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 8 # They locked me in a room... + replacement: + - o + - k + +- type: language + id: Mouse + obfuscation: + !type:SyllableObfuscation + minSyllables: 2 + maxSyllables: 3 + replacement: + - squ + - eak + - pi + - ep + - chuu + - ee + - fwi + - he + +- type: language + id: Chicken + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 + replacement: + - co + - coo + - ot + +- type: language + id: Duck + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 + replacement: + - qu + - ack + - quack + +- type: language + id: Cow + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 + replacement: + - moo + - mooo + +- type: language + id: Sheep + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 + replacement: + - ba + - baa + - aa + +- type: language + id: Kangaroo + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 + replacement: + - shre + - ack + - chuu + - choo + +- type: language + id: Pig + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 + replacement: + - oink # Please someone come up with something better + +- type: language + id: Crab + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 + replacement: + - click + - clack + - ti + - pi + - tap + - cli + - ick + +- type: language + id: Kobold + obfuscation: + !type:SyllableObfuscation + minSyllables: 2 + maxSyllables: 4 + replacement: + - yip + - yap + - gar + - grr + - ar + - scre + - et + - gronk + - hiss + - ss + - ee diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/captain.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/captain.yml index 05f51baf1c5..d8849472ff4 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/captain.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/captain.yml @@ -4,7 +4,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Captain items: @@ -16,7 +16,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Captain items: @@ -28,7 +28,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Captain items: @@ -40,7 +40,7 @@ cost: 3 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Captain items: @@ -52,7 +52,7 @@ cost: 3 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Captain items: @@ -63,7 +63,7 @@ category: Jobs cost: 2 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Captain items: @@ -74,7 +74,7 @@ category: Jobs cost: 1 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Captain items: @@ -85,7 +85,7 @@ category: Jobs cost: 1 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Captain items: @@ -96,7 +96,7 @@ category: Jobs cost: 1 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Captain items: @@ -107,7 +107,7 @@ category: Jobs cost: 1 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Captain items: @@ -118,7 +118,7 @@ category: Jobs cost: 1 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Captain items: @@ -130,7 +130,7 @@ cost: 1 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Captain items: @@ -141,7 +141,7 @@ category: Jobs cost: 1 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Captain items: diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/chiefEngineer.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/chiefEngineer.yml index e184e0a60a6..c4905591124 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/chiefEngineer.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/chiefEngineer.yml @@ -4,7 +4,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - ChiefEngineer items: @@ -16,7 +16,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - ChiefEngineer items: @@ -27,7 +27,7 @@ category: Jobs cost: 2 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - ChiefEngineer items: @@ -39,7 +39,7 @@ cost: 1 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - ChiefEngineer items: diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/chiefMedicalOfficer.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/chiefMedicalOfficer.yml index 32e1a6e43eb..c75c871b011 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/chiefMedicalOfficer.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/chiefMedicalOfficer.yml @@ -4,7 +4,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - ChiefMedicalOfficer items: @@ -16,7 +16,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - ChiefMedicalOfficer items: @@ -27,7 +27,7 @@ category: Jobs cost: 2 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - ChiefMedicalOfficer items: @@ -38,7 +38,7 @@ category: Jobs cost: 1 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - ChiefMedicalOfficer items: @@ -49,7 +49,7 @@ category: Jobs cost: 1 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - ChiefMedicalOfficer items: @@ -61,7 +61,7 @@ cost: 1 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - ChiefMedicalOfficer items: diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/headOfPersonnel.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/headOfPersonnel.yml index f4a583e39a4..3d3799c0adf 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/headOfPersonnel.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/headOfPersonnel.yml @@ -4,7 +4,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfPersonnel items: @@ -16,7 +16,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfPersonnel items: @@ -28,7 +28,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfPersonnel items: @@ -40,7 +40,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfPersonnel items: @@ -52,7 +52,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfPersonnel items: @@ -63,7 +63,7 @@ category: Jobs cost: 2 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfPersonnel items: @@ -74,7 +74,7 @@ category: Jobs cost: 4 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfPersonnel items: @@ -85,7 +85,7 @@ category: Jobs cost: 1 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfPersonnel items: @@ -97,7 +97,7 @@ cost: 1 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfPersonnel items: diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/headOfSecurity.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/headOfSecurity.yml index 60c6bbdb00c..4f0d785b14d 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/headOfSecurity.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/headOfSecurity.yml @@ -4,7 +4,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfSecurity items: @@ -16,7 +16,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfSecurity items: @@ -28,7 +28,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfSecurity items: @@ -40,7 +40,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfSecurity items: @@ -52,7 +52,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfSecurity items: @@ -64,7 +64,7 @@ cost: 3 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfSecurity items: @@ -76,7 +76,7 @@ cost: 3 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfSecurity items: @@ -88,7 +88,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfSecurity items: @@ -100,7 +100,7 @@ cost: 3 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfSecurity items: @@ -112,7 +112,7 @@ cost: 3 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfSecurity items: @@ -123,7 +123,7 @@ category: Jobs cost: 2 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfSecurity items: @@ -134,7 +134,7 @@ category: Jobs cost: 2 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfSecurity items: @@ -145,7 +145,7 @@ category: Jobs cost: 1 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfSecurity items: @@ -156,7 +156,7 @@ category: Jobs cost: 1 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfSecurity items: @@ -168,7 +168,7 @@ cost: 1 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - HeadOfSecurity items: diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/quarterMaster.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/quarterMaster.yml index 802bc65de59..3359d8f5d74 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/quarterMaster.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/quarterMaster.yml @@ -5,7 +5,7 @@ # cost: 2 # exclusive: true # requirements: -# - !type:LoadoutJobRequirement +# - !type:CharacterJobRequirement # jobs: # - Quartermaster # items: @@ -17,7 +17,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Quartermaster items: @@ -29,7 +29,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Quartermaster items: @@ -41,7 +41,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Quartermaster items: @@ -52,7 +52,7 @@ category: Jobs cost: 1 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Quartermaster items: @@ -64,7 +64,7 @@ cost: 1 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Quartermaster items: diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/researchDirector.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/researchDirector.yml index cf24ffd8525..87cb0db1790 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/researchDirector.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/researchDirector.yml @@ -4,7 +4,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - ResearchDirector items: @@ -16,7 +16,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - ResearchDirector items: @@ -27,7 +27,7 @@ category: Jobs cost: 2 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - ResearchDirector items: @@ -38,7 +38,7 @@ category: Jobs cost: 2 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - ResearchDirector items: @@ -50,7 +50,7 @@ cost: 1 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - ResearchDirector items: diff --git a/Resources/Prototypes/Loadouts/Jobs/cargo.yml b/Resources/Prototypes/Loadouts/Jobs/cargo.yml index fe835d6823c..87463862010 100644 --- a/Resources/Prototypes/Loadouts/Jobs/cargo.yml +++ b/Resources/Prototypes/Loadouts/Jobs/cargo.yml @@ -4,10 +4,10 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - SalvageSpecialist - - !type:LoadoutPlaytimeRequirement + - !type:CharacterPlaytimeRequirement tracker: JobSalvageSpecialist min: 36000 # 10 hours items: diff --git a/Resources/Prototypes/Loadouts/Jobs/engineering.yml b/Resources/Prototypes/Loadouts/Jobs/engineering.yml index 820825e236e..d91814e34d1 100644 --- a/Resources/Prototypes/Loadouts/Jobs/engineering.yml +++ b/Resources/Prototypes/Loadouts/Jobs/engineering.yml @@ -4,7 +4,10 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement jobs: - StationEngineer items: @@ -16,7 +19,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - StationEngineer items: @@ -28,16 +31,16 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - StationEngineer - - !type:LoadoutPlaytimeRequirement + - !type:CharacterPlaytimeRequirement tracker: JobAtmosphericTechnician min: 21600 # 6 hours - - !type:LoadoutPlaytimeRequirement + - !type:CharacterPlaytimeRequirement tracker: JobStationEngineer min: 21600 # 6 hours - - !type:LoadoutDepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Engineering min: 216000 # 60 hours items: @@ -49,16 +52,19 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement jobs: - StationEngineer - - !type:LoadoutPlaytimeRequirement + - !type:CharacterPlaytimeRequirement tracker: JobAtmosphericTechnician min: 21600 # 6 hours - - !type:LoadoutPlaytimeRequirement + - !type:CharacterPlaytimeRequirement tracker: JobStationEngineer min: 21600 # 6 hours - - !type:LoadoutDepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Engineering min: 216000 # 60 hours items: @@ -70,7 +76,7 @@ cost: 3 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - AtmosphericTechnician items: @@ -83,7 +89,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - StationEngineer - AtmosphericTechnician @@ -96,7 +102,7 @@ cost: 1 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - StationEngineer - AtmosphericTechnician @@ -110,7 +116,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - StationEngineer - AtmosphericTechnician @@ -123,7 +129,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - StationEngineer - AtmosphericTechnician @@ -136,7 +142,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - StationEngineer - AtmosphericTechnician @@ -149,7 +155,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - StationEngineer - AtmosphericTechnician @@ -162,7 +168,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - StationEngineer - AtmosphericTechnician diff --git a/Resources/Prototypes/Loadouts/Jobs/medical.yml b/Resources/Prototypes/Loadouts/Jobs/medical.yml index 37af839f3cc..e9e6aa04231 100644 --- a/Resources/Prototypes/Loadouts/Jobs/medical.yml +++ b/Resources/Prototypes/Loadouts/Jobs/medical.yml @@ -4,11 +4,13 @@ cost: 1 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - MedicalDoctor - Paramedic - ChiefMedicalOfficer + - MedicalIntern + - Chemist items: - ClothingHandsGlovesNitrile @@ -18,7 +20,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - MedicalDoctor - Chemist @@ -31,10 +33,11 @@ cost: 1 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - MedicalDoctor - ChiefMedicalOfficer + - MedicalIntern items: - ClothingNeckStethoscope @@ -44,9 +47,15 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement jobs: - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern items: - UniformScrubsColorBlue @@ -56,9 +65,15 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement jobs: - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern items: - UniformScrubsColorGreen @@ -68,19 +83,110 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement jobs: - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern items: - UniformScrubsColorPurple +- type: loadout + id: LoadoutMedicalUniformScrubsCyan + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - UniformScrubsColorCyan + +- type: loadout + id: LoadoutMedicalUniformScrubsBlack + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - UniformScrubsColorBlack + +- type: loadout + id: LoadoutMedicalUniformScrubsPink + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - UniformScrubsColorPink + +- type: loadout + id: LoadoutMedicalUniformScrubsCybersun + category: Jobs + cost: 3 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + items: + - UniformScrubsColorCybersun + +- type: loadout + id: LoadoutMedicalOuterCybersunWindbreaker + category: Jobs + cost: 5 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + items: + - ClothingOuterCoatCybersunWindbreaker + - type: loadout id: LoadoutMedicalOuterLabcoatChem category: Jobs cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Chemist items: @@ -91,7 +197,7 @@ category: Jobs exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Chemist items: @@ -103,7 +209,10 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement jobs: - Paramedic items: @@ -115,7 +224,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Paramedic items: @@ -127,16 +236,19 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - MedicalDoctor - - !type:LoadoutPlaytimeRequirement + - Chemist + - Paramedic + - ChiefMedicalOfficer + - !type:CharacterPlaytimeRequirement tracker: JobChemist min: 21600 # 6 hours - - !type:LoadoutPlaytimeRequirement + - !type:CharacterPlaytimeRequirement tracker: JobMedicalDoctor min: 21600 # 6 hours - - !type:LoadoutDepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Medical min: 216000 # 60 hours items: @@ -148,16 +260,22 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement jobs: - MedicalDoctor - - !type:LoadoutPlaytimeRequirement + - Chemist + - Paramedic + - ChiefMedicalOfficer + - !type:CharacterPlaytimeRequirement tracker: JobChemist min: 21600 # 6 hours - - !type:LoadoutPlaytimeRequirement + - !type:CharacterPlaytimeRequirement tracker: JobMedicalDoctor min: 21600 # 6 hours - - !type:LoadoutDepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Medical min: 216000 # 60 hours items: @@ -169,7 +287,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - MedicalDoctor items: @@ -181,17 +299,190 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - MedicalDoctor - - !type:LoadoutPlaytimeRequirement + - Chemist + - Paramedic + - ChiefMedicalOfficer + - !type:CharacterPlaytimeRequirement tracker: JobChemist min: 21600 # 6 hours - - !type:LoadoutPlaytimeRequirement + - !type:CharacterPlaytimeRequirement tracker: JobMedicalDoctor min: 21600 # 6 hours - - !type:LoadoutDepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Medical min: 216000 # 60 hours items: - ClothingHeadHatBeretSeniorPhysician + +- type: loadout + id: LoadoutMedicalHeadSurgcapBlue + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapBlue + +- type: loadout + id: LoadoutMedicalHeadSurgcapPurple + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapPurple + +- type: loadout + id: LoadoutMedicalHeadSurgcapGreen + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapGreen + +- type: loadout + id: LoadoutMedicalHeadSurgcapCyan + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapCyan + +- type: loadout + id: LoadoutMedicalHeadSurgcapBlack + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapBlack + +- type: loadout + id: LoadoutMedicalHeadSurgcapPink + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapPink + +- type: loadout + id: LoadoutMedicalHeadSurgcapWhite + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapWhite + +- type: loadout + id: LoadoutMedicalHeadSurgcapCybersun + category: Jobs + cost: 3 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + items: + - ClothingHeadHatSurgcapCybersun + +- type: loadout + id: LoadoutMedicalEyesHudMedical + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + items: + - ClothingEyesHudMedical + +- type: loadout + id: LoadoutMedicalEyesEyepatchHudMedical + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + items: + - ClothingEyesEyepatchHudMedical + +- type: loadout + id: LoadoutMedicalEyesHudMedicalPrescription + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + - !type:CharacterTraitRequirement + traits: + - Nearsighted + items: + - ClothingEyesPrescriptionMedHud diff --git a/Resources/Prototypes/Loadouts/Jobs/science.yml b/Resources/Prototypes/Loadouts/Jobs/science.yml index f65b69c46a0..e281b51d036 100644 --- a/Resources/Prototypes/Loadouts/Jobs/science.yml +++ b/Resources/Prototypes/Loadouts/Jobs/science.yml @@ -4,10 +4,10 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Scientist - - !type:LoadoutDepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Epistemics min: 216000 # 60 hours items: @@ -19,10 +19,13 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement jobs: - Scientist - - !type:LoadoutDepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Epistemics min: 216000 # 60 hours items: @@ -34,7 +37,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Scientist - ResearchAssistant @@ -48,7 +51,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Scientist - ResearchAssistant @@ -62,10 +65,10 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Scientist - - !type:LoadoutDepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Epistemics min: 216000 # 60 hours items: @@ -77,10 +80,66 @@ cost: 1 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Scientist - ResearchAssistant - ResearchDirector items: - ClothingHeadHatBeretRND + +- type: loadout + id: LoadoutScienceEyesHudDiagnostic + category: Jobs + cost: 3 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Scientist + - ResearchAssistant + - ResearchDirector + items: + - ClothingEyesHudDiagnostic + +- type: loadout + id: LoadoutScienceEyesEyepatchHudDiag + category: Jobs + cost: 3 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Scientist + - ResearchAssistant + - ResearchDirector + items: + - ClothingEyesEyepatchHudDiag + +## Robes +- type: loadout + id: LoadoutOuterRobeTechPriest + category: Outer + cost: 2 + items: + - ClothingOuterRobeTechPriest + requirements: + - !type:CharacterJobRequirement + jobs: + - Scientist + - ResearchAssistant + - ResearchDirector + +- type: loadout + id: LoadoutHeadHoodTechPriest + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadTechPriest + requirements: + - !type:CharacterJobRequirement + jobs: + - Scientist + - ResearchAssistant + - ResearchDirector diff --git a/Resources/Prototypes/Loadouts/Jobs/security.yml b/Resources/Prototypes/Loadouts/Jobs/security.yml index 47c4b040d3d..29e1850db51 100644 --- a/Resources/Prototypes/Loadouts/Jobs/security.yml +++ b/Resources/Prototypes/Loadouts/Jobs/security.yml @@ -1,10 +1,31 @@ +## Uniforms - type: loadout - id: LoadoutSecurityUniformGrey + id: LoadoutSecurityUniformJumpsuitBlue category: Jobs - cost: 2 + cost: 1 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - SecurityOfficer + - SecurityCadet + - Warden + items: + - ClothingUniformJumpsuitSecBlue + +- type: loadout + id: LoadoutSecurityUniformJumpsuitGrey + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement jobs: - SecurityOfficer - SecurityCadet @@ -12,25 +33,53 @@ items: - ClothingUniformJumpsuitSecGrey +- type: loadout + id: LoadoutSecurityUniformJumpskirtGrey + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - SecurityOfficer + - SecurityCadet + - Warden + items: + - ClothingUniformJumpskirtSecGrey + +- type: loadout + id: LoadoutSecurityUniformJumpskirtBlue + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - SecurityOfficer + - SecurityCadet + - Warden + items: + - ClothingUniformJumpskirtSecBlue + - type: loadout id: LoadoutSecurityUniformJumpskirtSenior category: Jobs cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - SecurityOfficer - - !type:LoadoutPlaytimeRequirement + - !type:CharacterPlaytimeRequirement tracker: JobWarden min: 21600 # 6 hours - - !type:LoadoutPlaytimeRequirement + - !type:CharacterPlaytimeRequirement tracker: JobDetective min: 7200 # 2 hours - - !type:LoadoutPlaytimeRequirement + - !type:CharacterPlaytimeRequirement tracker: JobSecurityOfficer min: 21600 # 6 hours - - !type:LoadoutDepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Security min: 216000 # 60 hours items: @@ -42,43 +91,164 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement jobs: - SecurityOfficer - - !type:LoadoutPlaytimeRequirement + - !type:CharacterPlaytimeRequirement tracker: JobWarden min: 21600 # 6 hours - - !type:LoadoutPlaytimeRequirement + - !type:CharacterPlaytimeRequirement tracker: JobDetective min: 7200 # 2 hours - - !type:LoadoutPlaytimeRequirement + - !type:CharacterPlaytimeRequirement tracker: JobSecurityOfficer min: 21600 # 6 hours - - !type:LoadoutDepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Security min: 216000 # 60 hours items: - ClothingUniformJumpsuitSeniorOfficer +- type: loadout + id: LoadoutUniformJumpsuitWardenBlue + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Warden + items: + - ClothingUniformJumpsuitWardenBlue + +- type: loadout + id: LoadoutUniformJumpsuitWardenGrey + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Warden + items: + - ClothingUniformJumpsuitWardenGrey + +- type: loadout + id: LoadoutUniformJumpskirtWardenBlue + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Warden + items: + - ClothingUniformJumpskirtWardenBlue + +- type: loadout + id: LoadoutUniformJumpskirtWardenGrey + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Warden + items: + - ClothingUniformJumpskirtWardenGrey + +- type: loadout + id: LoadoutUniformJumpskirtHoSBlue + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - HeadOfSecurity + items: + - ClothingUniformJumpskirtHoSBlue + +- type: loadout + id: LoadoutUniformJumpskirtHoSGrey + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - HeadOfSecurity + items: + - ClothingUniformJumpskirtHoSGrey + +- type: loadout + id: LoadoutUniformJumpsuitSecFormal + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Detective + - SecurityOfficer + - Warden + - HeadOfSecurity + items: + - ClothingUniformJumpsuitSecFormal + +- type: loadout + id: LoadoutUniformJumpsuitSecSummer + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Detective + - SecurityOfficer + - Warden + - HeadOfSecurity + items: + - ClothingUniformJumpsuitSecSummer +## Mask - type: loadout id: LoadoutSecurityMaskGasSwat category: Jobs cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Warden - HeadOfSecurity items: - ClothingMaskGasSwat +## Shoes - type: loadout id: LoadoutSecurityShoesJackboots category: Jobs cost: 1 requirements: - - !type:LoadoutJobRequirement + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement jobs: - Detective - SecurityOfficer @@ -87,3 +257,119 @@ - HeadOfSecurity items: - ClothingShoesBootsJack + +## Eyes +- type: loadout + id: LoadoutSecurityEyesHudSecurity + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - SecurityOfficer + - Warden + - HeadOfSecurity + - Brigmedic + items: + - ClothingEyesHudSecurity + +- type: loadout + id: LoadoutSecurityEyesEyepatchHudSecurity + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - SecurityOfficer + - Warden + - HeadOfSecurity + - Brigmedic + items: + - ClothingEyesEyepatchHudSecurity + +- type: loadout + id: LoadoutSecurityEyesHudSecurityPrescription + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - SecurityOfficer + - Warden + - HeadOfSecurity + - Brigmedic + - !type:CharacterTraitRequirement + traits: + - Nearsighted + items: + - ClothingEyesPrescriptionHudSecurity + +## Head +- type: loadout + id: LoadoutSecurityHeadHatBeret + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - SecurityOfficer + - Warden + - HeadOfSecurity + - Brigmedic + items: + - ClothingHeadHatBeretSecurity + +- type: loadout + id: LoadoutSecurityHeadHelmetInsulated + category: Jobs + cost: 3 + requirements: + - !type:CharacterJobRequirement + jobs: + - SecurityOfficer + - Warden + - HeadOfSecurity + - Brigmedic + items: + - ClothingHeadHelmetInsulated + +## Belt +- type: loadout + id: LoadoutSecurityBeltWebbing + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Detective + - SecurityOfficer + - SecurityCadet + - Warden + - HeadOfSecurity + items: + - ClothingBeltSecurityWebbingFilled + +## Species +#- type: loadout ##Uncomment this and reassess points when we can make it replace the secoff duty pistol +# id: LoadoutSecurityEquipmentTruncheon +# category: Jobs +# cost: 8 ## TODO: Make this replace the secoff handgun, and thus also make it cheaper +# requirements: +# - !type:CharacterJobRequirement +# jobs: +# - SecurityOfficer +# - Warden +# - HeadOfSecurity +# - Brigmedic +# - !type:CharacterPlaytimeRequirement +# tracker: JobSecurityOfficer +# min: 36000 # 10 hours +# - !type:CharacterSpeciesRequirement +# species: Oni +# items: +# - Truncheon diff --git a/Resources/Prototypes/Loadouts/Jobs/service.yml b/Resources/Prototypes/Loadouts/Jobs/service.yml index 4372f891ad7..1a2059f0be1 100644 --- a/Resources/Prototypes/Loadouts/Jobs/service.yml +++ b/Resources/Prototypes/Loadouts/Jobs/service.yml @@ -1,10 +1,11 @@ +## Clown - type: loadout id: LoadoutServiceClownOutfitJester category: Jobs cost: 3 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Clown items: @@ -18,7 +19,7 @@ cost: 3 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Clown items: @@ -26,37 +27,43 @@ - ClothingHeadHatJesterAlt - ClothingShoesJester +## Bartender - type: loadout id: LoadoutServiceBartenderUniformPurple category: Jobs cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Bartender items: - ClothingUniformJumpsuitBartenderPurple +## Botanist - type: loadout id: LoadoutServiceBotanistUniformOveralls category: Jobs cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Botanist items: - ClothingUniformOveralls +## Lawyer - type: loadout id: LoadoutServiceLawyerUniformBlueSuit category: Jobs cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement jobs: - Lawyer items: @@ -68,7 +75,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Lawyer items: @@ -80,7 +87,10 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement jobs: - Lawyer items: @@ -92,7 +102,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Lawyer items: @@ -104,7 +114,10 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement jobs: - Lawyer items: @@ -116,7 +129,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Lawyer items: @@ -128,7 +141,10 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement jobs: - Lawyer items: @@ -140,7 +156,7 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Lawyer items: @@ -152,19 +168,23 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Reporter items: - ClothingUniformJumpsuitJournalist +## Reporter - type: loadout id: LoadoutServiceReporterUniformDetectivesuit category: Jobs cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement jobs: - Reporter items: @@ -176,8 +196,20 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterJobRequirement jobs: - Reporter items: - ClothingUniformJumpskirtDetective + +## Musician +- type: loadout + id: LoadoutItemSynthesizerInstrument + category: Jobs + cost: 8 + requirements: + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - SynthesizerInstrument diff --git a/Resources/Prototypes/Loadouts/categories.yml b/Resources/Prototypes/Loadouts/categories.yml index b231b397f71..79d2d7fe2bf 100644 --- a/Resources/Prototypes/Loadouts/categories.yml +++ b/Resources/Prototypes/Loadouts/categories.yml @@ -1,6 +1,16 @@ -# Alphabetically ordered +# Alphabetically ordered, except for Uncategorized since it is always first + +- type: loadoutCategory + id: Uncategorized + - type: loadoutCategory - id: Accessories + id: Eyes + +- type: loadoutCategory + id: Hands + +- type: loadoutCategory + id: Head - type: loadoutCategory id: Items @@ -8,11 +18,17 @@ - type: loadoutCategory id: Jobs +- type: loadoutCategory + id: Neck + - type: loadoutCategory id: Outer - type: loadoutCategory - id: Uncategorized + id: Shoes + +- type: loadoutCategory + id: Species - type: loadoutCategory id: Uniform diff --git a/Resources/Prototypes/Loadouts/eyes.yml b/Resources/Prototypes/Loadouts/eyes.yml index a7a8cbd7736..74226604e92 100644 --- a/Resources/Prototypes/Loadouts/eyes.yml +++ b/Resources/Prototypes/Loadouts/eyes.yml @@ -1,13 +1,21 @@ - type: loadout id: LoadoutEyesEyepatch - category: Accessories + category: Eyes cost: 1 items: - ClothingEyesEyepatch - type: loadout id: LoadoutEyesBlindfold - category: Accessories + category: Eyes cost: 2 items: - ClothingEyesBlindfold + +- type: loadout + id: LoadoutItemSunglasses + category: Eyes + cost: 5 + exclusive: true + items: + - ClothingEyesGlassesSunglasses diff --git a/Resources/Prototypes/Loadouts/hands.yml b/Resources/Prototypes/Loadouts/hands.yml new file mode 100644 index 00000000000..3604678d387 --- /dev/null +++ b/Resources/Prototypes/Loadouts/hands.yml @@ -0,0 +1,115 @@ +- type: loadout + id: LoadoutHandsColorPurple + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorPurple + +- type: loadout + id: LoadoutHandsColorRed + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorRed + +- type: loadout + id: LoadoutHandsColorBlack + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorBlack + +- type: loadout + id: LoadoutHandsColorBlue + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorBlue + +- type: loadout + id: LoadoutHandsColorBrown + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorBrown + +- type: loadout + id: LoadoutHandsColorGray + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorGray + +- type: loadout + id: LoadoutHandsColorGreen + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorGreen + +- type: loadout + id: LoadoutHandsColorLightBrown + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorLightBrown + +- type: loadout + id: LoadoutHandsColorOrange + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorOrange + +- type: loadout + id: LoadoutHandsColorWhite + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorWhite + +- type: loadout + id: LoadoutHandsColorYellowBudget + category: Hands + cost: 4 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger + items: + - ClothingHandsGlovesColorYellowBudget + +- type: loadout + id: LoadoutHandsGlovesLeather + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesLeather + +- type: loadout + id: LoadoutHandsGlovesPowerglove + category: Hands + cost: 2 + exclusive: true + items: + - ClothingHandsGlovesPowerglove + +- type: loadout + id: LoadoutHandsGlovesRobohands + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesRobohands diff --git a/Resources/Prototypes/Loadouts/head.yml b/Resources/Prototypes/Loadouts/head.yml index 33a2f0b19bc..25cb4dadf11 100644 --- a/Resources/Prototypes/Loadouts/head.yml +++ b/Resources/Prototypes/Loadouts/head.yml @@ -1,125 +1,273 @@ +## Hats - type: loadout id: LoadoutHeadBeaverHat - category: Accessories + category: Head cost: 2 + exclusive: true items: - ClothingHeadHatBeaverHat - type: loadout id: LoadoutHeadTophat - category: Accessories + category: Head cost: 2 + exclusive: true items: - ClothingHeadHatTophat +- type: loadout + id: LoadoutHeadFedoraBlack + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFedoraBlack + +- type: loadout + id: LoadoutHeadFedoraChoc + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFedoraChoc + +- type: loadout + id: LoadoutHeadFedoraWhite + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFedoraWhite + +- type: loadout + id: LoadoutHeadFlatBlack + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFlatBlack + +- type: loadout + id: LoadoutHeadFlatBrown + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFlatBrown + +- type: loadout + id: LoadoutHeadTinfoil + category: Head + cost: 3 + exclusive: true + items: + - ClothingHeadTinfoil + +- type: loadout + id: LoadoutHeadBellhop + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatBellhop +## Color Hats - type: loadout id: LoadoutHeadHatBluesoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatBluesoft - type: loadout id: LoadoutHeadHatBluesoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatBluesoftFlipped - type: loadout id: LoadoutHeadHatCorpsoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatCorpsoft - type: loadout id: LoadoutHeadHatCorpsoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatCorpsoftFlipped - type: loadout id: LoadoutHeadHatGreensoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatGreensoft - type: loadout id: LoadoutHeadHatGreensoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatGreensoftFlipped - type: loadout id: LoadoutHeadHatGreysoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatGreysoft - type: loadout id: LoadoutHeadHatGreysoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatGreysoftFlipped - type: loadout id: LoadoutHeadHatOrangesoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatOrangesoft - type: loadout id: LoadoutHeadHatOrangesoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatOrangesoftFlipped - type: loadout id: LoadoutHeadHatPurplesoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatPurplesoft - type: loadout id: LoadoutHeadHatPurplesoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatPurplesoftFlipped - type: loadout id: LoadoutHeadHatRedsoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatRedsoft - type: loadout id: LoadoutHeadHatRedsoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatRedsoftFlipped - type: loadout id: LoadoutHeadHatYellowsoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatYellowsoft - type: loadout id: LoadoutHeadHatYellowsoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatYellowsoftFlipped + +## Headbands +- type: loadout + id: LoadoutHeadBandBlack + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandBlack + +- type: loadout + id: LoadoutHeadBandBlue + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandBlue + +- type: loadout + id: LoadoutHeadBandGold + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandGold + +- type: loadout + id: LoadoutHeadBandGreen + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandGreen + +- type: loadout + id: LoadoutHeadBandGrey + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandGrey + +- type: loadout + id: LoadoutHeadBandRed + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandRed + +- type: loadout + id: LoadoutHeadBandSkull + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandSkull + +- type: loadout + id: LoadoutHeadBandMerc + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadBandMerc + +- type: loadout + id: LoadoutHeadBandBrown + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandBrown diff --git a/Resources/Prototypes/Loadouts/items.yml b/Resources/Prototypes/Loadouts/items.yml index 6ce8d260613..072061d2e28 100644 --- a/Resources/Prototypes/Loadouts/items.yml +++ b/Resources/Prototypes/Loadouts/items.yml @@ -1,3 +1,4 @@ +#Smokes - type: loadout id: LoadoutItemCig category: Items @@ -34,11 +35,18 @@ - CigPackBlack - type: loadout - id: LoadoutItemPAI + id: LoadoutItemCigsMixed category: Items cost: 3 items: - - PersonalAI + - CigPackMixed + +- type: loadout + id: LoadoutItemCigsSyndicate + category: Items + cost: 4 + items: + - CigPackSyndicate - type: loadout id: LoadoutItemLighter @@ -61,30 +69,138 @@ items: - Matchbox +## Instruments - type: loadout - id: LoadoutItemPlushieSharkBlue + id: LoadoutItemMicrophoneInstrument category: Items - cost: 2 + cost: 4 items: - - PlushieSharkBlue + - MicrophoneInstrument - type: loadout - id: LoadoutItemPlushieSharkPink + id: LoadoutItemKalimbaInstrument category: Items - cost: 2 + cost: 4 + items: + - KalimbaInstrument + +- type: loadout + id: LoadoutItemTrumpetInstrument + category: Items + cost: 6 + items: + - TrumpetInstrument + +- type: loadout + id: LoadoutItemElectricGuitar + category: Items + cost: 7 + items: + - ElectricGuitarInstrument + +- type: loadout + id: LoadoutItemBassGuitar + category: Items + cost: 7 + items: + - BassGuitarInstrument + +- type: loadout + id: LoadoutItemRockGuitar + category: Items + cost: 7 + items: + - RockGuitarInstrument + +- type: loadout + id: LoadoutItemAcousticGuitar + category: Items + cost: 7 + items: + - AcousticGuitarInstrument + +- type: loadout + id: LoadoutItemViolin + category: Items + cost: 6 + items: + - ViolinInstrument + +- type: loadout + id: LoadoutItemHarmonica + category: Items + cost: 3 + items: + - HarmonicaInstrument + +- type: loadout + id: LoadoutItemAccordion + category: Items + cost: 6 + items: + - AccordionInstrument + +- type: loadout + id: LoadoutItemFlute + category: Items + cost: 4 items: - - PlushieSharkPink + - FluteInstrument - type: loadout - id: LoadoutItemPlushieSharkGrey + id: LoadoutItemOcarina + category: Items + cost: 3 + items: + - OcarinaInstrument + +# Survival Kit +- type: loadout + id: LoadoutItemsEmergencyOxygenTank + category: Items + cost: 1 + items: + - EmergencyOxygenTankFilled + +- type: loadout + id: LoadoutItemsExtendedEmergencyOxygenTank category: Items cost: 2 items: - - PlushieSharkGrey + - ExtendedEmergencyOxygenTankFilled + +- type: loadout + id: LoadoutItemsDoubleEmergencyOxygenTank + category: Items + cost: 4 + items: + - DoubleEmergencyOxygenTankFilled + +- type: loadout + id: LoadoutItemsEmergencyCrowbar + category: Items + cost: 3 + items: + - CrowbarRed +#Misc Items - type: loadout - id: LoadoutItemPlushieCarp + id: LoadoutItemPAI + category: Items + cost: 3 + items: + - PersonalAI + +- type: loadout + id: LoadoutItemWaistbag category: Items cost: 2 items: - - PlushieCarp + - ClothingBeltStorageWaistbag + +- type: loadout + id: LoadoutSolCommonTranslator + category: Items + cost: 3 + items: + - SolCommonTranslator diff --git a/Resources/Prototypes/Loadouts/neck.yml b/Resources/Prototypes/Loadouts/neck.yml index 7e5526f966a..eb933de29ee 100644 --- a/Resources/Prototypes/Loadouts/neck.yml +++ b/Resources/Prototypes/Loadouts/neck.yml @@ -1,27 +1,104 @@ - type: loadout id: LoadoutNeckScarfStripedRed - category: Accessories + category: Neck cost: 1 + exclusive: true items: - ClothingNeckScarfStripedRed - type: loadout id: LoadoutNeckScarfStripedBlue - category: Accessories + category: Neck cost: 1 + exclusive: true items: - ClothingNeckScarfStripedBlue - type: loadout id: LoadoutNeckScarfStripedGreen - category: Accessories + category: Neck cost: 1 + exclusive: true items: - ClothingNeckScarfStripedGreen - type: loadout id: LoadoutNeckScarfStripedZebra - category: Accessories + category: Neck cost: 1 + exclusive: true items: - ClothingNeckScarfStripedZebra + +#Pride Accessories +- type: loadout + id: LoadoutItemsPrideLGBTPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckLGBTPin + +- type: loadout + id: LoadoutItemsPrideAromanticPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckAromanticPin + +- type: loadout + id: LoadoutItemsPrideAsexualPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckAsexualPin + +- type: loadout + id: LoadoutItemsPrideBisexualPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckBisexualPin + +- type: loadout + id: LoadoutItemsPrideIntersexPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckIntersexPin + +- type: loadout + id: LoadoutItemsPrideLesbianPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckLesbianPin + +- type: loadout + id: LoadoutItemsPrideNonBinaryPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckNonBinaryPin + +- type: loadout + id: LoadoutItemsPridePansexualPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckPansexualPin + +- type: loadout + id: LoadoutItemsPrideTransPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckTransPin diff --git a/Resources/Prototypes/Loadouts/outerClothing.yml b/Resources/Prototypes/Loadouts/outerClothing.yml index 7923d9e66f0..a5932214ce9 100644 --- a/Resources/Prototypes/Loadouts/outerClothing.yml +++ b/Resources/Prototypes/Loadouts/outerClothing.yml @@ -1,10 +1,3 @@ -- type: loadout - id: LoadoutOuterGhostSheet - category: Outer - cost: 2 - items: - - ClothingOuterGhostSheet - - type: loadout id: LoadoutOuterCoatBomberjacket category: Outer @@ -32,3 +25,146 @@ cost: 3 items: - ClothingOuterWinterCoat + +- type: loadout + id: LoadoutOuterCoatHyenhSweater + category: Outer + cost: 3 + items: + - ClothingOuterCoatHyenhSweater + +- type: loadout + id: LoadoutOuterWinterCoatLong + category: Outer + cost: 3 + items: + - ClothingOuterWinterCoatLong + +- type: loadout + id: LoadoutOuterWinterCoatPlaid + category: Outer + cost: 3 + items: + - ClothingOuterWinterCoatPlaid + +- type: loadout + id: LoadoutOuterVestValet + category: Outer + cost: 1 + items: + - ClothingOuterVestValet + +## Letterman Jackets +- type: loadout + id: LoadoutOuterCoatLettermanBlue + category: Outer + cost: 3 + items: + - ClothingOuterCoatLettermanBlue + +- type: loadout + id: LoadoutOuterCoatLettermanRed + category: Outer + cost: 3 + items: + - ClothingOuterCoatLettermanRed + +## MNK +- type: loadout + id: LoadoutOuterCoatMNKWhiteHoodie + category: Outer + cost: 3 + items: + - ClothingOuterCoatMNKWhiteHoodie + +- type: loadout + id: LoadoutOuterCoatMNKBlackTopCoat + category: Outer + cost: 3 + items: + - ClothingOuterCoatMNKBlackTopCoat + +- type: loadout + id: LoadoutOuterCoatMNKBlackJacket + category: Outer + cost: 3 + items: + - ClothingOuterCoatMNKBlackJacket + +## Contractor Jackets +- type: loadout + id: LoadoutOuterCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterCorporateJacket + +- type: loadout + id: LoadoutOuterCsCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterCsCorporateJacket + +- type: loadout + id: LoadoutOuterEeCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterEeCorporateJacket + +- type: loadout + id: LoadoutOuterHiCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterHiCorporateJacket + +- type: loadout + id: LoadoutOuterHmCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterHmCorporateJacket + +- type: loadout + id: LoadoutOuterIdCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterIdCorporateJacket + +- type: loadout + id: LoadoutOuterBcCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterBcCorporateJacket + +- type: loadout + id: LoadoutOuterDdCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterDdCorporateJacket + +- type: loadout + id: LoadoutOuterFaCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterFaCorporateJacket + +- type: loadout + id: LoadoutOuterGeCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterGeCorporateJacket + +- type: loadout + id: LoadoutOuterZhCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterZhCorporateJacket diff --git a/Resources/Prototypes/Loadouts/shoes.yml b/Resources/Prototypes/Loadouts/shoes.yml index 4a1880b5e21..0f493cc5431 100644 --- a/Resources/Prototypes/Loadouts/shoes.yml +++ b/Resources/Prototypes/Loadouts/shoes.yml @@ -1,98 +1,245 @@ # Colored - type: loadout id: LoadoutShoesBlack - category: Accessories + category: Shoes cost: 1 exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy items: - ClothingShoesColorBlack - type: loadout id: LoadoutShoesBlue - category: Accessories + category: Shoes cost: 1 exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy items: - ClothingShoesColorBlue - type: loadout id: LoadoutShoesBrown - category: Accessories + category: Shoes cost: 1 exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy items: - ClothingShoesColorBrown - type: loadout id: LoadoutShoesGreen - category: Accessories + category: Shoes cost: 1 exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy items: - ClothingShoesColorGreen - type: loadout id: LoadoutShoesOrange - category: Accessories + category: Shoes cost: 1 exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy items: - ClothingShoesColorOrange - type: loadout id: LoadoutShoesPurple - category: Accessories + category: Shoes cost: 1 exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy items: - ClothingShoesColorPurple - type: loadout id: LoadoutShoesRed - category: Accessories + category: Shoes cost: 1 exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy items: - ClothingShoesColorRed - type: loadout id: LoadoutShoesWhite - category: Accessories + category: Shoes cost: 1 exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy items: - ClothingShoesColorWhite - type: loadout id: LoadoutShoesYellow - category: Accessories + category: Shoes cost: 1 exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy items: - ClothingShoesColorYellow +- type: loadout + id: LoadoutShoesGeta + category: Shoes + cost: 1 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + items: + - ClothingShoesGeta + +## Boots +- type: loadout + id: LoadoutShoesBootsWork + category: Shoes + cost: 1 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + items: + - ClothingShoesBootsWork + +- type: loadout + id: LoadoutShoesBootsLaceup + category: Shoes + cost: 2 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + items: + - ClothingShoesBootsLaceup + +- type: loadout + id: LoadoutShoesBootsWinter + category: Shoes + cost: 1 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + items: + - ClothingShoesBootsWinter + +- type: loadout + id: LoadoutShoesBootsCowboyBrown + category: Shoes + cost: 2 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + items: + - ClothingShoesBootsCowboyBrown + +- type: loadout + id: LoadoutShoesBootsCowboyBlack + category: Shoes + cost: 2 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + items: + - ClothingShoesBootsCowboyBlack + +- type: loadout + id: LoadoutShoesBootsCowboyWhite + category: Shoes + cost: 2 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + items: + - ClothingShoesBootsCowboyWhite + +- type: loadout + id: LoadoutShoesBootsCowboyFancy + category: Shoes + cost: 2 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + items: + - ClothingShoesBootsCowboyFancy # Miscellaneous - type: loadout id: LoadoutShoesSlippersDuck - category: Accessories - cost: 1 + category: Shoes + cost: 2 exclusive: true items: - ClothingShoeSlippersDuck + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Clown - type: loadout id: LoadoutShoesLeather - category: Accessories + category: Shoes cost: 1 exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy items: - ClothingShoesLeather - type: loadout id: LoadoutShoesMiscWhite - category: Accessories + category: Shoes cost: 1 exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy items: - ClothingShoesMiscWhite diff --git a/Resources/Prototypes/Loadouts/species.yml b/Resources/Prototypes/Loadouts/species.yml new file mode 100644 index 00000000000..1d2fb58dc0a --- /dev/null +++ b/Resources/Prototypes/Loadouts/species.yml @@ -0,0 +1,35 @@ +- type: loadout + id: LoadoutSpeciesEmergencyNitrogenTank + category: Species + cost: 0 + requirements: + - !type:CharacterSpeciesRequirement + species: SlimePerson + - !type:CharacterSpeciesRequirement + species: Vox + items: + - EmergencyNitrogenTankFilled + +- type: loadout + id: LoadoutSpeciesExtendedEmergencyNitrogenTank + category: Species + cost: 1 + requirements: + - !type:CharacterSpeciesRequirement + species: SlimePerson + - !type:CharacterSpeciesRequirement + species: Vox + items: + - ExtendedEmergencyNitrogenTankFilled + +- type: loadout + id: LoadoutSpeciesDoubleEmergencyNitrogenTank + category: Species + cost: 3 + requirements: + - !type:CharacterSpeciesRequirement + species: SlimePerson + - !type:CharacterSpeciesRequirement + species: Vox + items: + - DoubleEmergencyNitrogenTankFilled diff --git a/Resources/Prototypes/Loadouts/uniform.yml b/Resources/Prototypes/Loadouts/uniform.yml index 097577febab..c6838b97d33 100644 --- a/Resources/Prototypes/Loadouts/uniform.yml +++ b/Resources/Prototypes/Loadouts/uniform.yml @@ -4,7 +4,10 @@ cost: 2 exclusive: true requirements: - - !type:LoadoutJobRequirement + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement jobs: - Passenger items: @@ -19,6 +22,13 @@ exclusive: true items: - ClothingUniformJumpsuitColorBlack + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorBlack @@ -27,6 +37,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorBlack + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorBlue @@ -35,6 +49,13 @@ exclusive: true items: - ClothingUniformJumpsuitColorBlue + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorBlue @@ -43,6 +64,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorBlue + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorGreen @@ -51,6 +76,13 @@ exclusive: true items: - ClothingUniformJumpsuitColorGreen + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorGreen @@ -59,6 +91,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorGreen + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorOrange @@ -67,6 +103,13 @@ exclusive: true items: - ClothingUniformJumpsuitColorOrange + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorOrange @@ -75,6 +118,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorOrange + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorPink @@ -83,6 +130,13 @@ exclusive: true items: - ClothingUniformJumpsuitColorPink + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorPink @@ -91,6 +145,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorPink + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorRed @@ -99,6 +157,13 @@ exclusive: true items: - ClothingUniformJumpsuitColorRed + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorRed @@ -107,6 +172,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorRed + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorWhite @@ -115,6 +184,13 @@ exclusive: true items: - ClothingUniformJumpsuitColorWhite + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorWhite @@ -123,6 +199,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorWhite + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorYellow @@ -131,6 +211,13 @@ exclusive: true items: - ClothingUniformJumpsuitColorYellow + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorYellow @@ -139,6 +226,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorYellow + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorDarkBlue @@ -147,6 +238,13 @@ exclusive: true items: - ClothingUniformJumpsuitColorDarkBlue + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorDarkBlue @@ -155,6 +253,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorDarkBlue + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorTeal @@ -163,6 +265,13 @@ exclusive: true items: - ClothingUniformJumpsuitColorTeal + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorTeal @@ -171,6 +280,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorTeal + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorPurple @@ -179,6 +292,13 @@ exclusive: true items: - ClothingUniformJumpsuitColorPurple + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorPurple @@ -187,6 +307,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorPurple + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorDarkGreen @@ -195,6 +319,13 @@ exclusive: true items: - ClothingUniformJumpsuitColorDarkGreen + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorDarkGreen @@ -203,6 +334,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorDarkGreen + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorLightBrown @@ -211,6 +346,13 @@ exclusive: true items: - ClothingUniformJumpsuitColorLightBrown + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorLightBrown @@ -219,6 +361,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorLightBrown + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorBrown @@ -227,6 +373,13 @@ exclusive: true items: - ClothingUniformJumpsuitColorBrown + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorBrown @@ -235,6 +388,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorBrown + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorMaroon @@ -243,6 +400,13 @@ exclusive: true items: - ClothingUniformJumpsuitColorMaroon + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorMaroon @@ -251,11 +415,131 @@ exclusive: true items: - ClothingUniformJumpskirtColorMaroon + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger +## Kendo - type: loadout - id: LoadoutUniformJumpsuitColorRainbow + id: LoadoutUniformKendoHakama category: Uniform cost: 2 exclusive: true items: - - ClothingUniformColorRainbow + - ClothingUniformKendoHakama + +- type: loadout + id: LoadoutUniformMartialGi + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformMartialGi + +## Kimono +- type: loadout + id: LoadoutClothingKimonoBlue + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingKimonoBlue + +- type: loadout + id: LoadoutClothingKimonoPink + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingKimonoPink + +- type: loadout + id: LoadoutClothingKimonoPurple + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingKimonoPurple + +- type: loadout + id: LoadoutClothingKimonoSky + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingKimonoSky + +- type: loadout + id: LoadoutClothingKimonoGreen + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingKimonoGreen + +## Gakuran +- type: loadout + id: LoadoutUniformSchoolGakuranBlack + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformSchoolGakuranBlack + +## MNK Uniforms +- type: loadout + id: LoadoutClothingMNKOfficeSkirt + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKOfficeSkirt + +- type: loadout + id: LoadoutClothingMNKUnderGarment + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKUnderGarment + +- type: loadout + id: LoadoutClothingMNKGymBra + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKGymBra + +- type: loadout + id: LoadoutClothingMNKDressBlack + category: Uniform + cost: 4 + exclusive: true + items: + - ClothingUniformMNKDressBlack + +- type: loadout + id: LoadoutClothingMNKBlackOveralls + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKBlackOveralls + +- type: loadout + id: LoadoutClothingMNKBlackShoulder + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKBlackShoulder + +- type: loadout + id: LoadoutClothingMNKTracksuitBlack + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKTracksuitBlack diff --git a/Resources/Prototypes/Nyanotrasen/Catalog/Cargo/cargo_epistemics.yml b/Resources/Prototypes/Nyanotrasen/Catalog/Cargo/cargo_epistemics.yml index 4610c0f68c8..d7d0b665381 100644 --- a/Resources/Prototypes/Nyanotrasen/Catalog/Cargo/cargo_epistemics.yml +++ b/Resources/Prototypes/Nyanotrasen/Catalog/Cargo/cargo_epistemics.yml @@ -4,6 +4,6 @@ sprite: Nyanotrasen/Objects/Consumable/Drinks/flaskholywater.rsi state: icon product: CrateHolyWaterKit - cost: 1000 + cost: 3000 category: Epistemics group: market diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/felinid.yml b/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/felinid.yml index 6dd2a89e5a8..a09f3b6ab7f 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/felinid.yml @@ -13,10 +13,10 @@ torso: part: TorsoHuman connections: - - left arm - right arm - - left leg + - left arm - right leg + - left leg organs: heart: OrganAnimalHeart lungs: OrganHumanLungs diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml index 8278114d267..2cd9785d989 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml @@ -99,6 +99,8 @@ sprite: Nyanotrasen/Clothing/Head/Hats/cage.rsi - type: Clothing sprite: Nyanotrasen/Clothing/Head/Hats/cage.rsi + equipDelay: 0.5 + unequipDelay: 6 - type: HeadCage - type: entity diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Uniforms/costumes.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Uniforms/costumes.yml index c82dbffae86..0ef1a5a85a3 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Uniforms/costumes.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Uniforms/costumes.yml @@ -54,7 +54,7 @@ sprite: Nyanotrasen/Clothing/Uniforms/Costume/maid.rsi - type: entity - parent: ClothingUniformBase + parent: ClothingUniformSkirtBase id: ClothingCostumeBunnySuit name: bunny suit description: Ready to go with stockings and a bow tie. @@ -89,10 +89,10 @@ sprite: Nyanotrasen/Clothing/Uniforms/Jumpskirt/Decorskirt.rsi - type: entity - parent: ClothingUniformBase + parent: ClothingUniformSkirtBase id: ClothingCostumeNaota name: turquoise hoodie and shorts - description: A hoodie with a small kangaroo pouch. + description: A hoodie with a small kangaroo pouch. components: - type: Sprite sprite: Nyanotrasen/Clothing/Uniforms/Costume/naota.rsi @@ -113,7 +113,7 @@ femaleMask: NoMask - type: entity - parent: ClothingUniformBase + parent: ClothingUniformSkirtBase id: ClothingUniformDressRed name: red dress description: A voluminous, fancy red dress. @@ -125,7 +125,7 @@ femaleMask: NoMask - type: entity - parent: ClothingUniformBase + parent: ClothingUniformSkirtBase id: ClothingUniformSwimsuitBlue name: blue swimsuit description: A form-fitting, hydrodynamic blue swimsuit. @@ -358,7 +358,7 @@ femaleMask: NoMask - type: entity - parent: ClothingUniformBase + parent: ClothingUniformSkirtBase id: ClothingUniformMNKUnderGarment name: MNK under garment description: MNK ensured comfort for the important bits. @@ -369,7 +369,7 @@ sprite: Nyanotrasen/Clothing/Misc/under_garments.rsi - type: entity - parent: ClothingUniformBase + parent: ClothingUniformSkirtBase id: ClothingUniformMNKGymBra name: MNK gym bra description: Maximum performance with MNK sweat blockers. @@ -381,7 +381,7 @@ femaleMask: NoMask - type: entity - parent: ClothingUniformBase + parent: ClothingUniformSkirtBase id: ClothingUniformMNKDressBlack name: MNK black dress description: A sleek black dress sporting a MNK window. @@ -405,7 +405,7 @@ femaleMask: NoMask - type: entity - parent: ClothingUniformBase + parent: ClothingUniformSkirtBase id: ClothingUniformMNKBlackShoulder name: MNK exposed shoulders description: A MNK outfit with exposed shoulders. diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml index e11f1c4165f..e93117b1aad 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml @@ -26,7 +26,7 @@ fix1: shape: !type:PhysShapeCircle - radius: 0.42 + radius: 0.35 density: 220 restitution: 0.0 mask: @@ -35,6 +35,13 @@ - MobLayer - type: Stamina critThreshold: 115 + - type: LanguageKnowledge + speaks: + - GalacticCommon + - Nekomimetic + understands: + - GalacticCommon + - Nekomimetic - type: entity save: false diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml index d9b25c5dd1b..285c7340b21 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml @@ -9,6 +9,7 @@ scale: 0.8, 0.8 - type: HumanoidAppearance species: Felinid + initial: Felinid - type: Fixtures fixtures: # TODO: This needs a second fixture just for mob collisions. fix1: @@ -64,6 +65,20 @@ Unsexed: MaleFelinid - type: Felinid - type: NoShoesSilentFootsteps + - type: LanguageKnowledge + speaks: + - GalacticCommon + - SolCommon + - Nekomimetic + understands: + - GalacticCommon + - SolCommon + - Nekomimetic + - type: Thieving + ignoreStripHidden: true + stealth: Subtle + stripTimeReduction: 0 + stripTimeMultiplier: 0.667 - type: entity save: false diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Books/hyperlinks.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Books/hyperlinks.yml new file mode 100644 index 00000000000..03426729d98 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Books/hyperlinks.yml @@ -0,0 +1,204 @@ +- type: entity + parent: BaseItem + id: BaseHyperlinkBook + abstract: true + components: + - type: Sprite + sprite: Objects/Misc/books.rsi + - type: Tag + tags: + - Book + - type: EmitSoundOnPickup + sound: /Audio/SimpleStation14/Items/Handling/book_pickup.ogg + - type: EmitSoundOnDrop + sound: /Audio/SimpleStation14/Items/Handling/book_drop.ogg + - type: EmitSoundOnLand + sound: /Audio/SimpleStation14/Items/Handling/book_drop.ogg + +- type: entity + parent: BaseHyperlinkBook + id: HyperlinkBookSpaceLaw + name: space law + description: A big book of laws for space courts. + components: + - type: Sprite + layers: + - state: book_space_law +# - type: HyperlinkBook +# url: https://wiki.nyanotrasen.moe/view/Space_Law + +- type: entity + parent: BaseHyperlinkBook + id: HyperlinkBookSupernanny + name: book of unsanctioned space punishments + description: The ravings of a madman. + components: + - type: Sprite + layers: + - state: book_space_law +# - type: HyperlinkBook +# url: https://supernannyfanon.fandom.com/wiki/Category:Discipline_Techniques + +#- type: entity +# parent: BaseHyperlinkBook +# id: HyperlinkBookGlimmer +# suffix: GuidebookBook +# name: A Layman's Guide to the Mind +# description: A guide on psionics. +# components: +# - type: Sprite +# sprite: SimpleStation14/Objects/Misc/books.rsi +# layers: +# - state: book_psionics +# - type: HyperlinkBook +# url: https://wiki.nyanotrasen.moe/view/Glimmer +# - type: GuidebookBook +# guides: +# - Psionics +# - AltarsGolemancy + +- type: entity + parent: BaseHyperlinkBook + id: HyperlinkBookChemistry + name: chemical recipe book + description: A list of chemical recipes. + components: + - type: Sprite + layers: + - state: book_chemistry +# - type: HyperlinkBook +# url: https://wiki.nyanotrasen.moe/view/Chemistry + +- type: entity + parent: BaseHyperlinkBook + id: HyperlinkBookBartending + name: bartender's guide + description: A list of drink recipes. + components: + - type: Sprite + layers: + - state: book_bar +# - type: HyperlinkBook +# url: https://wiki.nyanotrasen.moe/view/Drinks + +- type: entity + parent: BaseHyperlinkBook + id: HyperlinkBookCooking + name: cookbook + description: A list of food recipes. + components: + - type: Sprite + layers: + - state: book_cooking +# - type: HyperlinkBook +# url: https://wiki.nyanotrasen.moe/view/Cooking + +- type: entity + parent: BaseHyperlinkBook + id: HyperlinkBookBotany + name: botanical field guide + description: A guide to plants. + components: + - type: Sprite + layers: + - state: book_hydroponics_pod_people +# - type: HyperlinkBook +# url: https://wiki.nyanotrasen.moe/view/Hydroponics + +- type: entity + parent: BaseHyperlinkBook + id: HyperlinkBookShuttle + name: guide to shuttle construction + description: A guide to building shuttles. + components: + - type: Sprite + layers: + - state: book_engineering +# - type: HyperlinkBook +# url: https://wiki.nyanotrasen.moe/view/Shuttle_Construction + +- type: entity + parent: BaseHyperlinkBook + id: HyperlinkBookAlerts + suffix: GuidebookBook + name: What to do When Things are Blowing Up + description: Procedure for when and why each alert should be put in effect, and what to do. + components: + - type: Sprite + layers: + - state: book_nuclear + # - type: HyperlinkBook + # url: https://wiki.nyanotrasen.moe/view/Alert_Procedure +# - type: GuidebookBook +# guides: +# - CommonAlerts +# - SpecificAlerts +# - CentCommAlerts + +- type: entity + parent: BaseHyperlinkBook + id: HyperlinkBookProcedure + suffix: GuidebookBook + name: standard operating procedure + description: A guide to normal station function. + components: + - type: Sprite + layers: + - state: book_particle_accelerator + # - type: HyperlinkBook + # url: https://wiki.nyanotrasen.moe/view/Standard_Operating_Procedure +# - type: GuidebookBook +# guides: +# - StandardOperatingProcedure + +- type: entity + parent: BaseHyperlinkBook + id: HyperlinkBookPower + name: guide to power + description: A guide to powering the station. + components: + - type: Sprite + layers: + - state: book_engineering2 +# - type: HyperlinkBook +# url: https://wiki.nyanotrasen.moe/view/Power + +- type: entity + parent: BaseHyperlinkBook + id: HyperlinkBookMedical + name: guide to medical + description: A guide to the medical department. + components: + - type: Sprite + layers: + - state: book_infections +# - type: HyperlinkBook +# url: https://wiki.nyanotrasen.moe/view/Medical + +- type: entity + parent: BaseHyperlinkBook + id: HyperlinkBookHacking + name: guide to hacking + description: For emergency use only. + components: + - type: Sprite + layers: + - state: book_hacking +# - type: HyperlinkBook +# url: https://wiki.nyanotrasen.moe/view/Hacking + +- type: entity + parent: BaseHyperlinkBook + id: HyperlinkBookAtmos + suffix: GuidebookBook + name: How to Make Gas Hot + description: A guide on Atmospherics. Make sure to grab the thrilling sequal; What to do When Gas Hot. + components: + - type: Sprite + layers: + - state: book_engineering2 + # - type: HyperlinkBook + # url: https://wiki.nyanotrasen.moe/view/Atmospheric_Science +# - type: GuidebookBook +# guides: +# - Atmospherics diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/Misc/identification_cards.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/Misc/identification_cards.yml index ff9b3f8f2a0..94efc40530c 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/Misc/identification_cards.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/Misc/identification_cards.yml @@ -5,9 +5,12 @@ components: - type: Sprite layers: - - state: orange - - sprite: DeltaV/Objects/Misc/id_cards.rsi - state: nyanoprisoner + - state: prisoner + - state: department + color: "#292929" + - state: subdepartment + color: "#A54900" + - state: warden - type: PresetIdCard job: Prisoner @@ -18,9 +21,12 @@ components: - type: Sprite layers: - - state: orange - - sprite: DeltaV/Objects/Misc/id_cards.rsi - state: nyanogladiator + - state: default + - state: department + color: "#878787" + - state: subdepartment + color: "#878787" + - state: gladiator - type: PresetIdCard job: Gladiator @@ -32,8 +38,11 @@ - type: Sprite layers: - state: default - - sprite: DeltaV/Objects/Misc/id_cards.rsi - state: nyanoprisonguard + - state: department + color: "#CB0000" + - state: subdepartment + color: "#CB0000" + - state: prisonguard - type: PresetIdCard job: PrisonGuard @@ -45,8 +54,11 @@ - type: Sprite layers: - state: default - - sprite: DeltaV/Objects/Misc/id_cards.rsi - state: nyanomailcarrier + - state: department + color: "#B18644" + - state: subdepartment + color: "#B18644" + - state: mailcarrier - type: PresetIdCard job: MailCarrier @@ -59,8 +71,11 @@ - type: Sprite layers: - state: default - - sprite: DeltaV/Objects/Misc/id_cards.rsi - state: nyanomartialartist + - state: department + color: "#878787" + - state: subdepartment + color: "#878787" + - state: martialartist - type: PresetIdCard job: MartialArtist @@ -69,10 +84,13 @@ id: ForensicMantisIDCard name: psionic mantis ID card # DeltaV - Rename Forensic Mantis to Psionic Mantis components: - - type: Sprite - layers: - - state: default - - sprite: DeltaV/Objects/Misc/id_cards.rsi - state: nyanomantis - - type: PresetIdCard - job: ForensicMantis + - type: Sprite + layers: + - state: default + - state: department + color: "#C96DBF" + - state: subdepartment + color: "#C96DBF" + - state: detective + - type: PresetIdCard + job: ForensicMantis diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml index c2fd8786aff..4e6115ba339 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml @@ -32,12 +32,13 @@ accentVColor: "#DFDFDF" - type: Icon state: pda-security - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: entity parent: BasePDA diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/shock_collar.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/shock_collar.yml index 35cdcae6589..1266a721fe2 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/shock_collar.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/shock_collar.yml @@ -8,6 +8,8 @@ sprite: Nyanotrasen/Clothing/Neck/Misc/shock.rsi - type: Clothing sprite: Nyanotrasen/Clothing/Neck/Misc/shock.rsi + equipDelay: 1 + unequipDelay: 10 # It's a collar meant to be used on prisoners (or not), so it probably has some sort of safety. - type: ShockCollar - type: UseDelay delay: 3 # DeltaV: prevent clocks instakilling people diff --git a/Resources/Prototypes/Nyanotrasen/GameRules/events.yml b/Resources/Prototypes/Nyanotrasen/GameRules/events.yml index f5626a0406f..8646ff643f3 100644 --- a/Resources/Prototypes/Nyanotrasen/GameRules/events.yml +++ b/Resources/Prototypes/Nyanotrasen/GameRules/events.yml @@ -5,9 +5,7 @@ noSpawn: true components: - type: StationEvent - startAnnouncement: station-event-noospheric-storm-announcement - startAudio: - path: /Audio/Announcements/noosphericstorm.ogg + startAnnouncement: true weight: 5 earliestStart: 15 - type: NoosphericStormRule diff --git a/Resources/Prototypes/Nyanotrasen/Species/Oni.yml b/Resources/Prototypes/Nyanotrasen/Species/Oni.yml index 9cb184b8ef0..ee8be0e5892 100644 --- a/Resources/Prototypes/Nyanotrasen/Species/Oni.yml +++ b/Resources/Prototypes/Nyanotrasen/Species/Oni.yml @@ -11,6 +11,12 @@ femaleFirstNames: names_oni_female lastNames: names_oni_location naming: LastNoFirst + minHeight: 0.9 + defaultHeight: 1.2 + maxHeight: 1.3 + minWidth: 0.85 + defaultWidth: 1.2 + maxWidth: 1.35 - type: markingPoints id: MobOniMarkingLimits diff --git a/Resources/Prototypes/Nyanotrasen/Species/felinid.yml b/Resources/Prototypes/Nyanotrasen/Species/felinid.yml index 754a4ae906b..4751d581746 100644 --- a/Resources/Prototypes/Nyanotrasen/Species/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Species/felinid.yml @@ -7,6 +7,12 @@ markingLimits: MobFelinidMarkingLimits dollPrototype: MobFelinidDummy skinColoration: HumanToned + minHeight: 0.65 + defaultHeight: 0.8 + maxHeight: 1.1 + minWidth: 0.6 + defaultWidth: 0.8 + maxWidth: 1.15 - type: markingPoints id: MobFelinidMarkingLimits diff --git a/Resources/Prototypes/Objectives/goals.yml b/Resources/Prototypes/Objectives/goals.yml new file mode 100644 index 00000000000..59e35ea8a51 --- /dev/null +++ b/Resources/Prototypes/Objectives/goals.yml @@ -0,0 +1,87 @@ +- type: stationGoal + id: Area + +- type: stationGoal + id: Anomalies + +- type: stationGoal + id: Artifacts + +- type: stationGoal + id: BureaucraticError + +- type: stationGoal + id: Combat + +- type: stationGoal + id: Labor + +- type: stationGoal + id: Lectures + +- type: stationGoal + id: Museum + +- type: stationGoal + id: Shuttle + +- type: stationGoal + id: Singularity + +- type: stationGoal + id: SolarPanels + +- type: stationGoal + id: Storage + +- type: stationGoal + id: Xeno + +- type: stationGoal + id: Zoo + + +- type: weightedRandom + id: StationGoals + weights: + StationGoalDepartment: 1 + StationGoalPower: 1 + StationGoalStation: 1 + + +- type: weightedRandom + id: StationGoalDepartment + weights: + StationGoalScience: 1 + StationGoalSecurity: 1 + + +- type: weightedRandom + id: StationGoalPower + weights: + Singularity: 1 + SolarPanels: 1 + +- type: weightedRandom + id: StationGoalScience + weights: + Anomalies: 1 + Artifacts: 1 + Xeno: 1 + +- type: weightedRandom + id: StationGoalSecurity + weights: + Combat: 1 + +- type: weightedRandom + id: StationGoalStation + weights: + Area: 1 + BureaucraticError: 1 + Labor: 1 + Lectures: 1 + Museum: 1 + Shuttle: 1 + Storage: 1 + Zoo: 1 diff --git a/Resources/Prototypes/Objectives/ninja.yml b/Resources/Prototypes/Objectives/ninja.yml index b6c3d553df0..0495be29355 100644 --- a/Resources/Prototypes/Objectives/ninja.yml +++ b/Resources/Prototypes/Objectives/ninja.yml @@ -39,8 +39,8 @@ sprite: Structures/Machines/server.rsi state: server - type: NumberObjective - min: 5 - max: 10 + min: 9 + max: 13 title: objective-condition-steal-research-title - type: StealResearchCondition diff --git a/Resources/Prototypes/Objectives/stealTargetGroups.yml b/Resources/Prototypes/Objectives/stealTargetGroups.yml index 006c061666b..11e503d7940 100644 --- a/Resources/Prototypes/Objectives/stealTargetGroups.yml +++ b/Resources/Prototypes/Objectives/stealTargetGroups.yml @@ -55,13 +55,13 @@ sprite: sprite: Objects/Consumable/Food/meat.rsi state: corgi - # + - type: stealTargetGroup id: CaptainIDCard name: captain ID card sprite: sprite: Objects/Misc/id_cards.rsi - state: ert_commander #no one will know the difference. + state: gold - type: stealTargetGroup id: JetpackCaptainFilled diff --git a/Resources/Prototypes/Procedural/biome_templates.yml b/Resources/Prototypes/Procedural/biome_templates.yml index 88979316443..425bcd824ab 100644 --- a/Resources/Prototypes/Procedural/biome_templates.yml +++ b/Resources/Prototypes/Procedural/biome_templates.yml @@ -620,7 +620,7 @@ allowedTiles: - FloorAsteroidSand entities: - - AsteroidRock + - RandomRockSpawner #Delta V - Makes Asteroids Great-ish Again - !type:BiomeTileLayer threshold: -1.0 tile: FloorAsteroidSand diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/utilities/wallmount_substation.yml b/Resources/Prototypes/Recipes/Construction/Graphs/utilities/wallmount_substation.yml index 381871f94af..7e4087b20a2 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/utilities/wallmount_substation.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/utilities/wallmount_substation.yml @@ -26,7 +26,13 @@ steps: - material: Cable amount: 5 - doAfter: 2 + doAfter: 0.5 + - material: CableMV + amount: 5 + doAfter: 0.5 + - material: CableHV + amount: 5 + doAfter: 0.5 - tool: Screwing doAfter: 2 @@ -41,12 +47,34 @@ icon: sprite: "Objects/Misc/module.rsi" state: "charger_APC" - doAfter: 1 + doAfter: 0.5 + - anyTags: + - PowerCell + - PowerCellSmall + store: powercell + name: a powercell + icon: + sprite: "Objects/Power/power_cells.rsi" + state: "medium" + doAfter: 0.5 + - tag: CapacitorStockPart + name: a capacitor + store: capacitor + icon: + sprite: "Objects/Misc/stock_parts.rsi" + state: "capacitor" + doAfter: 0.5 - to: frame completed: - !type:GivePrototype prototype: CableApcStack1 amount: 5 + - !type:GivePrototype + prototype: CableMVStack1 + amount: 5 + - !type:GivePrototype + prototype: CableHVStack1 + amount: 5 steps: - tool: Cutting doAfter: 1 diff --git a/Resources/Prototypes/Recipes/Construction/furniture.yml b/Resources/Prototypes/Recipes/Construction/furniture.yml index 1a17b2f856d..25978771872 100644 --- a/Resources/Prototypes/Recipes/Construction/furniture.yml +++ b/Resources/Prototypes/Recipes/Construction/furniture.yml @@ -731,9 +731,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsBlack @@ -748,9 +746,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsBlue @@ -765,9 +761,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsCyan @@ -782,9 +776,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsGreen @@ -799,9 +791,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsOrange @@ -816,9 +806,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsPink @@ -833,9 +821,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsPurple @@ -850,9 +836,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsRed @@ -867,9 +851,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsWhite @@ -884,9 +866,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: Bookshelf diff --git a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml index a5620fd8efe..2f280f6e46d 100644 --- a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml +++ b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml @@ -1423,6 +1423,15 @@ FoodSnackChocolateBar: 2 FoodEgg: 3 +- type: microwaveMealRecipe + id: RecipeHarpyWings + name: harpy wings recipe + result: FoodHarpyWings + time: 15 + solids: + LeftLegHarpy: 1 + RightLegHarpy: 1 + #Donks i guess - type: microwaveMealRecipe id: RecipeWarmDonkpocket diff --git a/Resources/Prototypes/Recipes/Lathes/electronics.yml b/Resources/Prototypes/Recipes/Lathes/electronics.yml index f0c59a0bdf9..b6184272dc0 100644 --- a/Resources/Prototypes/Recipes/Lathes/electronics.yml +++ b/Resources/Prototypes/Recipes/Lathes/electronics.yml @@ -604,7 +604,7 @@ completetime: 4 materials: Steel: 50 - Glass: 350 + Glass: 450 - type: latheRecipe id: SMESMachineCircuitboard diff --git a/Resources/Prototypes/Recipes/Lathes/language.yml b/Resources/Prototypes/Recipes/Lathes/language.yml new file mode 100644 index 00000000000..6871ed5228d --- /dev/null +++ b/Resources/Prototypes/Recipes/Lathes/language.yml @@ -0,0 +1,190 @@ +- type: latheRecipe + id: CanilunztTranslator + result: CanilunztTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: BubblishTranslator + result: BubblishTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: NekomimeticTranslator + result: NekomimeticTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: DraconicTranslator + result: DraconicTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: SolCommonTranslator + result: SolCommonTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: RootSpeakTranslator + result: RootSpeakTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: MofficTranslator + result: MofficTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: BasicGalaticCommonTranslatorImplanter + result: BasicGalaticCommonTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: XenoTranslator + result: XenoTranslator + completetime: 2 + materials: + Steel: 200 + Plastic: 50 + Gold: 50 + Plasma: 50 + Silver: 50 + +- type: latheRecipe + id: AdvancedGalaticCommonTranslatorImplanter + result: AdvancedGalaticCommonTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: BubblishTranslatorImplanter + result: BubblishTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: NekomimeticTranslatorImplanter + result: NekomimeticTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: DraconicTranslatorImplanter + result: DraconicTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: CanilunztTranslatorImplanter + result: CanilunztTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: SolCommonTranslatorImplanter + result: SolCommonTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: RootSpeakTranslatorImplanter + result: RootSpeakTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: MofficTranslatorImplanter + result: MofficTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: AnimalTranslator + result: AnimalTranslator + completetime: 2 + materials: + Steel: 200 + Plastic: 50 + Gold: 50 + Plasma: 50 + Silver: 5 diff --git a/Resources/Prototypes/Research/civilianservices.yml b/Resources/Prototypes/Research/civilianservices.yml index 61f95894ee6..acb6a2498d4 100644 --- a/Resources/Prototypes/Research/civilianservices.yml +++ b/Resources/Prototypes/Research/civilianservices.yml @@ -227,3 +227,43 @@ recipeUnlocks: - BluespaceBeaker - SyringeBluespace + +- type: technology + id: BasicTranslation + name: research-technology-basic-translation + icon: + sprite: Objects/Devices/translator.rsi + state: icon + discipline: CivilianServices + tier: 2 + cost: 10000 + recipeUnlocks: + - CanilunztTranslator + - BubblishTranslator + - NekomimeticTranslator + - DraconicTranslator + - SolCommonTranslator + - RootSpeakTranslator + - BasicGalaticCommonTranslatorImplanter + - MofficTranslator + +- type: technology + id: AdvancedTranslation + name: research-technology-advanced-translation + icon: + sprite: Objects/Devices/translator.rsi + state: icon + discipline: CivilianServices + tier: 3 + cost: 15000 + recipeUnlocks: + - XenoTranslator + - AdvancedGalaticCommonTranslatorImplanter + - BubblishTranslatorImplanter + - NekomimeticTranslatorImplanter + - DraconicTranslatorImplanter + - CanilunztTranslatorImplanter + - SolCommonTranslatorImplanter + - RootSpeakTranslatorImplanter + - AnimalTranslator + - MofficTranslatorImplanter diff --git a/Resources/Prototypes/SimpleStation14/Traits/disabilities.yml b/Resources/Prototypes/SimpleStation14/Traits/disabilities.yml index 25aa23a5afc..b7aa00353c8 100644 --- a/Resources/Prototypes/SimpleStation14/Traits/disabilities.yml +++ b/Resources/Prototypes/SimpleStation14/Traits/disabilities.yml @@ -1,11 +1,12 @@ - type: trait id: Nearsighted - name: trait-nearsighted-name - description: You require glasses to see properly. - traitGear: ClothingEyesGlasses + category: Visual + points: 1 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg components: - type: Nearsighted - whitelist: # Delta V fix to borgs spawning with it. - components: - - Blindable - diff --git a/Resources/Prototypes/SimpleStation14/humanoidProfiles/felinid.yml b/Resources/Prototypes/SimpleStation14/humanoidProfiles/felinid.yml new file mode 100644 index 00000000000..33e6915a78c --- /dev/null +++ b/Resources/Prototypes/SimpleStation14/humanoidProfiles/felinid.yml @@ -0,0 +1,6 @@ +- type: humanoidProfile + id: Felinid + profile: + species: Felinid + height: 0.8 + width: 0.8 diff --git a/Resources/Prototypes/SimpleStation14/humanoidProfiles/oni.yml b/Resources/Prototypes/SimpleStation14/humanoidProfiles/oni.yml new file mode 100644 index 00000000000..1e2d8af1e30 --- /dev/null +++ b/Resources/Prototypes/SimpleStation14/humanoidProfiles/oni.yml @@ -0,0 +1,6 @@ +- type: humanoidProfile + id: Oni + profile: + species: Oni + height: 1.2 + width: 1.2 diff --git a/Resources/Prototypes/SoundCollections/Announcers/intern.yml b/Resources/Prototypes/SoundCollections/Announcers/intern.yml new file mode 100644 index 00000000000..46172713dc8 --- /dev/null +++ b/Resources/Prototypes/SoundCollections/Announcers/intern.yml @@ -0,0 +1,34 @@ +- type: soundCollection + id: InternAnnouncements + files: + - /Audio/Announcers/Intern/comms/announce/1.ogg + - /Audio/Announcers/Intern/comms/announce/2.ogg + - /Audio/Announcers/Intern/comms/announce/3.ogg + - /Audio/Announcers/Intern/comms/announce/4.ogg + - /Audio/Announcers/Intern/comms/announce/5.ogg + - /Audio/Announcers/Intern/comms/announce/6.ogg + - /Audio/Announcers/Intern/comms/announce/7.ogg + - /Audio/Announcers/Intern/comms/announce/8.ogg + - /Audio/Announcers/Intern/comms/announce/9.ogg + - /Audio/Announcers/Intern/comms/announce/10.ogg + - /Audio/Announcers/Intern/comms/announce/11.ogg + - /Audio/Announcers/Intern/comms/announce/12.ogg + - /Audio/Announcers/Intern/comms/announce/13.ogg + - /Audio/Announcers/Intern/comms/announce/14.ogg + +- type: soundCollection + id: InternCommandReportAnnouncements + files: + - /Audio/Announcers/Intern/comms/commandReport/1.ogg + - /Audio/Announcers/Intern/comms/commandReport/2.ogg + - /Audio/Announcers/Intern/comms/commandReport/3.ogg + +- type: soundCollection + id: InternWelcomeAnnouncements + files: + - /Audio/Announcers/Intern/comms/welcome/1.ogg + - /Audio/Announcers/Intern/comms/welcome/2.ogg + - /Audio/Announcers/Intern/comms/welcome/3.ogg + - /Audio/Announcers/Intern/comms/welcome/4.ogg + - /Audio/Announcers/Intern/comms/welcome/5.ogg + - /Audio/Announcers/Intern/comms/welcome/6.ogg diff --git a/Resources/Prototypes/SoundCollections/screams.yml b/Resources/Prototypes/SoundCollections/screams.yml index 46965712b0e..518bbf72bb7 100644 --- a/Resources/Prototypes/SoundCollections/screams.yml +++ b/Resources/Prototypes/SoundCollections/screams.yml @@ -30,3 +30,41 @@ - /Audio/Voice/Cluwne/cluwnelaugh1.ogg - /Audio/Voice/Cluwne/cluwnelaugh2.ogg - /Audio/Voice/Cluwne/cluwnelaugh3.ogg + +- type: soundCollection + id: SlimeMaleLaughs + files: + - /Audio/Voice/Slime/slime_laugh_m1.ogg + - /Audio/Voice/Slime/slime_laugh_m2.ogg + +- type: soundCollection + id: SlimeFemaleLaughs + files: + - /Audio/Voice/Slime/slime_laugh_f1.ogg + +- type: soundCollection + id: SlimeUnisexLaughs + files: + - /Audio/Voice/Slime/slime_laugh_m1.ogg + - /Audio/Voice/Slime/slime_laugh_m2.ogg + - /Audio/Voice/Slime/slime_laugh_f1.ogg + +- type: soundCollection + id: SlimeMaleScreams + files: + - /Audio/Voice/Slime/slime_scream_m1.ogg + - /Audio/Voice/Slime/slime_scream_m2.ogg + +- type: soundCollection + id: SlimeFemaleScreams + files: + - /Audio/Voice/Slime/slime_scream_f1.ogg + - /Audio/Voice/Slime/slime_scream_f2.ogg + +- type: soundCollection + id: SlimeUnisexScreams + files: + - /Audio/Voice/Slime/slime_scream_m1.ogg + - /Audio/Voice/Slime/slime_scream_m2.ogg + - /Audio/Voice/Slime/slime_scream_f1.ogg + - /Audio/Voice/Slime/slime_scream_f2.ogg diff --git a/Resources/Prototypes/Species/dwarf.yml b/Resources/Prototypes/Species/dwarf.yml index 86743ca2d66..d32f1e6476a 100644 --- a/Resources/Prototypes/Species/dwarf.yml +++ b/Resources/Prototypes/Species/dwarf.yml @@ -7,3 +7,9 @@ markingLimits: MobHumanMarkingLimits dollPrototype: MobDwarfDummy skinColoration: HumanToned + minHeight: 0.6 + defaultHeight: 0.8 + maxHeight: 0.8 + minWidth: 0.55 + defaultWidth: 0.8 + maxWidth: 0.85 diff --git a/Resources/Prototypes/Species/reptilian.yml b/Resources/Prototypes/Species/reptilian.yml index f5cf1fa6ebf..752918e2f0c 100644 --- a/Resources/Prototypes/Species/reptilian.yml +++ b/Resources/Prototypes/Species/reptilian.yml @@ -11,6 +11,12 @@ maleFirstNames: names_reptilian_male femaleFirstNames: names_reptilian_female naming: FirstDashFirst + minHeight: 0.7 + defaultHeight: 0.95 + maxHeight: 1.25 + minWidth: 0.65 + defaultWidth: 0.95 + maxWidth: 1.3 - type: speciesBaseSprites id: MobReptilianSprites diff --git a/Resources/Prototypes/Store/categories.yml b/Resources/Prototypes/Store/categories.yml index c16972c8a31..11f8d509af3 100644 --- a/Resources/Prototypes/Store/categories.yml +++ b/Resources/Prototypes/Store/categories.yml @@ -63,6 +63,11 @@ name: store-category-pointless priority: 9 +- type: storeCategory + id: UplinkDeception + name: store-category-deception + priority: 10 + #revenant - type: storeCategory id: RevenantAbilities diff --git a/Resources/Prototypes/Tiles/floors.yml b/Resources/Prototypes/Tiles/floors.yml index 59fa88be2b2..2abaab63fb0 100644 --- a/Resources/Prototypes/Tiles/floors.yml +++ b/Resources/Prototypes/Tiles/floors.yml @@ -15,6 +15,7 @@ collection: FootstepFloor itemDrop: FloorTileItemSteel heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorSteelCheckerLight @@ -33,6 +34,7 @@ collection: FootstepFloor itemDrop: FloorTileItemSteelCheckerLight heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorSteelCheckerDark @@ -51,6 +53,7 @@ collection: FootstepFloor itemDrop: FloorTileItemSteelCheckerDark heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorSteelMini @@ -69,6 +72,7 @@ collection: FootstepFloor itemDrop: FloorTileItemSteel heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorSteelPavement @@ -87,6 +91,7 @@ collection: FootstepFloor itemDrop: FloorTileItemSteel heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorSteelDiagonal @@ -105,6 +110,7 @@ collection: FootstepFloor itemDrop: FloorTileItemSteel heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorSteelOffset @@ -117,6 +123,7 @@ collection: FootstepFloor itemDrop: FloorTileItemSteel heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorSteelMono @@ -135,6 +142,7 @@ collection: FootstepTile itemDrop: FloorTileItemSteel heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorSteelPavementVertical @@ -153,6 +161,7 @@ collection: FootstepTile itemDrop: FloorTileItemSteel heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorSteelHerringbone @@ -171,6 +180,7 @@ collection: FootstepTile itemDrop: FloorTileItemSteel heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorSteelDiagonalMini @@ -189,6 +199,7 @@ collection: FootstepTile itemDrop: FloorTileItemSteel heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorBrassFilled @@ -201,7 +212,8 @@ collection: FootstepHull itemDrop: FloorTileItemBrassFilled heatCapacity: 10000 - + tileRipResistance: 220 + - type: tile id: FloorBrassReebe name: tiles-brass-floor-reebe @@ -213,6 +225,7 @@ collection: FootstepHull itemDrop: FloorTileItemBrassReebe heatCapacity: 10000 + tileRipResistance: 220 - type: tile id: FloorPlastic @@ -231,6 +244,7 @@ collection: FootstepFloor itemDrop: FloorTileItemSteel heatCapacity: 10000 + tileRipResistance: 80 - type: tile id: FloorWood @@ -251,6 +265,7 @@ collection: BarestepWood itemDrop: FloorTileItemWood heatCapacity: 10000 + tileRipResistance: 80 - type: tile id: FloorWhite @@ -269,6 +284,7 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 + tileRipResistance: 80 - type: tile id: FloorWhiteMini @@ -287,6 +303,7 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 + tileRipResistance: 80 - type: tile id: FloorWhitePavement @@ -305,6 +322,7 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 + tileRipResistance: 80 - type: tile id: FloorWhiteDiagonal @@ -323,6 +341,7 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 + tileRipResistance: 80 - type: tile id: FloorWhiteOffset @@ -335,6 +354,7 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 + tileRipResistance: 80 - type: tile id: FloorWhiteMono @@ -353,6 +373,7 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 + tileRipResistance: 80 - type: tile id: FloorWhitePavementVertical @@ -371,6 +392,7 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 + tileRipResistance: 80 - type: tile id: FloorWhiteHerringbone @@ -389,6 +411,7 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 + tileRipResistance: 80 - type: tile id: FloorWhiteDiagonalMini @@ -407,6 +430,7 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 + tileRipResistance: 80 - type: tile id: FloorWhitePlastic @@ -425,6 +449,7 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 + tileRipResistance: 80 - type: tile id: FloorDark @@ -443,6 +468,7 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 + tileRipResistance: 100 - type: tile id: FloorDarkMini @@ -461,6 +487,7 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 + tileRipResistance: 100 - type: tile id: FloorDarkPavement @@ -479,6 +506,7 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 + tileRipResistance: 100 - type: tile id: FloorDarkDiagonal @@ -497,6 +525,7 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 + tileRipResistance: 100 - type: tile id: FloorDarkOffset @@ -509,6 +538,7 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 + tileRipResistance: 100 - type: tile id: FloorDarkMono @@ -527,6 +557,7 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 + tileRipResistance: 100 - type: tile id: FloorDarkPavementVertical @@ -545,6 +576,7 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 + tileRipResistance: 100 - type: tile id: FloorDarkHerringbone @@ -563,6 +595,7 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 + tileRipResistance: 100 - type: tile id: FloorDarkDiagonalMini @@ -581,6 +614,7 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 + tileRipResistance: 100 - type: tile id: FloorDarkPlastic @@ -599,6 +633,7 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 + tileRipResistance: 50 - type: tile id: FloorTechMaint @@ -611,6 +646,7 @@ collection: FootstepHull itemDrop: FloorTileItemTechmaint heatCapacity: 10000 + tileRipResistance: 250 - type: tile id: FloorReinforced @@ -623,6 +659,7 @@ collection: FootstepHull itemDrop: FloorTileItemReinforced heatCapacity: 10000 + reinforced: true - type: tile id: FloorMono @@ -635,6 +672,7 @@ collection: FootstepTile itemDrop: FloorTileItemMono heatCapacity: 10000 + tileRipResistance: 100 - type: tile id: FloorLino @@ -647,6 +685,7 @@ collection: FootstepTile itemDrop: FloorTileItemLino heatCapacity: 10000 + tileRipResistance: 100 - type: tile id: FloorSteelDirty @@ -659,6 +698,7 @@ collection: FootstepPlating itemDrop: FloorTileItemDirty heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorElevatorShaft @@ -671,6 +711,7 @@ collection: FootstepHull itemDrop: FloorTileItemElevatorShaft heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorMetalDiamond @@ -683,6 +724,7 @@ collection: FootstepHull itemDrop: FloorTileItemMetalDiamond heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorRockVault @@ -695,6 +737,7 @@ collection: FootstepAsteroid itemDrop: FloorTileItemRockVault heatCapacity: 10000 + tileRipResistance: 400 - type: tile id: FloorBlue @@ -707,6 +750,7 @@ collection: FootstepTile itemDrop: FloorTileItemBlue heatCapacity: 10000 + tileRipResistance: 50 - type: tile id: FloorSteelLime @@ -725,6 +769,7 @@ collection: FootstepFloor itemDrop: FloorTileItemLime heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorMining @@ -737,6 +782,7 @@ collection: FootstepTile itemDrop: FloorTileItemMining heatCapacity: 10000 + tileRipResistance: 250 - type: tile id: FloorMiningDark @@ -749,6 +795,7 @@ collection: FootstepTile itemDrop: FloorTileItemMiningDark heatCapacity: 10000 + tileRipResistance: 250 - type: tile id: FloorMiningLight @@ -761,6 +808,7 @@ collection: FootstepTile itemDrop: FloorTileItemMiningLight heatCapacity: 10000 + tileRipResistance: 250 # Departamental - type: tile @@ -774,6 +822,7 @@ collection: FootstepHull itemDrop: FloorTileItemFreezer heatCapacity: 10000 + tileRipResistance: 100 - type: tile id: FloorShowroom @@ -786,6 +835,7 @@ collection: FootstepFloor itemDrop: FloorTileItemShowroom heatCapacity: 10000 + tileRipResistance: 100 - type: tile id: FloorHydro @@ -798,6 +848,7 @@ collection: FootstepFloor itemDrop: FloorTileItemHydro heatCapacity: 10000 + tileRipResistance: 50 - type: tile id: FloorBar @@ -816,6 +867,7 @@ collection: FootstepFloor itemDrop: FloorTileItemBar heatCapacity: 10000 + tileRipResistance: 100 - type: tile id: FloorClown @@ -828,6 +880,7 @@ collection: FootstepFloor itemDrop: FloorTileItemClown heatCapacity: 10000 + tileRipResistance: 50 - type: tile id: FloorMime @@ -840,6 +893,7 @@ collection: FootstepFloor itemDrop: FloorTileItemMime heatCapacity: 10000 + tileRipResistance: 50 - type: tile id: FloorKitchen @@ -852,6 +906,7 @@ collection: FootstepTile itemDrop: FloorTileItemKitchen heatCapacity: 10000 + tileRipResistance: 50 - type: tile id: FloorLaundry @@ -864,6 +919,7 @@ collection: FootstepTile itemDrop: FloorTileItemLaundry heatCapacity: 10000 + tileRipResistance: 50 - type: tile id: FloorSteelDamaged @@ -883,6 +939,7 @@ collection: FootstepFloor itemDrop: FloorTileItemSteel #This should probably be made null when it becomes possible to make it such, in SS13 prying destroyed tiles wouldn't give you anything. heatCapacity: 10000 + tileRipResistance: 175 - type: tile id: FloorSteelBurnt @@ -899,6 +956,7 @@ collection: FootstepFloor itemDrop: FloorTileItemSteel #Same case as FloorSteelDamaged, make it null when possible heatCapacity: 10000 + tileRipResistance: 175 # Concrete @@ -920,6 +978,7 @@ itemDrop: FloorTileItemConcrete heatCapacity: 10000 weather: true + tileRipResistance: 300 - type: tile id: FloorConcreteMono @@ -939,6 +998,7 @@ itemDrop: FloorTileItemConcrete heatCapacity: 10000 weather: true + tileRipResistance: 300 - type: tile id: FloorConcreteSmooth @@ -958,6 +1018,7 @@ itemDrop: FloorTileItemConcrete heatCapacity: 10000 weather: true + tileRipResistance: 300 - type: tile id: FloorGrayConcrete @@ -977,6 +1038,7 @@ itemDrop: FloorTileItemGrayConcrete heatCapacity: 10000 weather: true + tileRipResistance: 300 - type: tile id: FloorGrayConcreteMono @@ -996,6 +1058,7 @@ itemDrop: FloorTileItemGrayConcrete heatCapacity: 10000 weather: true + tileRipResistance: 300 - type: tile id: FloorGrayConcreteSmooth @@ -1015,6 +1078,7 @@ itemDrop: FloorTileItemGrayConcrete heatCapacity: 10000 weather: true + tileRipResistance: 300 - type: tile id: FloorOldConcrete @@ -1034,6 +1098,7 @@ itemDrop: FloorTileItemOldConcrete heatCapacity: 10000 weather: true + tileRipResistance: 300 - type: tile id: FloorOldConcreteMono @@ -1053,6 +1118,7 @@ itemDrop: FloorTileItemOldConcrete heatCapacity: 10000 weather: true + tileRipResistance: 300 - type: tile id: FloorOldConcreteSmooth @@ -1072,6 +1138,7 @@ itemDrop: FloorTileItemOldConcrete heatCapacity: 10000 weather: true + tileRipResistance: 300 # Carpets (non smoothing) - type: tile @@ -1088,6 +1155,7 @@ friction: 0.25 itemDrop: FloorTileItemArcadeBlue heatCapacity: 10000 + tileRipResistance: 75 - type: tile id: FloorArcadeBlue2 @@ -1103,6 +1171,7 @@ friction: 0.25 itemDrop: FloorTileItemArcadeBlue2 heatCapacity: 10000 + tileRipResistance: 75 - type: tile id: FloorArcadeRed @@ -1118,6 +1187,7 @@ friction: 0.25 itemDrop: FloorTileItemArcadeRed heatCapacity: 10000 + tileRipResistance: 75 - type: tile id: FloorEighties @@ -1133,6 +1203,7 @@ friction: 0.25 itemDrop: FloorTileItemEighties heatCapacity: 10000 + tileRipResistance: 75 - type: tile id: FloorCarpetClown @@ -1148,6 +1219,7 @@ friction: 0.25 itemDrop: FloorTileItemCarpetClown heatCapacity: 10000 + tileRipResistance: 75 - type: tile id: FloorCarpetOffice @@ -1163,6 +1235,7 @@ friction: 0.25 itemDrop: FloorTileItemCarpetOffice heatCapacity: 10000 + tileRipResistance: 75 - type: tile id: FloorBoxing @@ -1182,6 +1255,7 @@ friction: 0.25 itemDrop: FloorTileItemBoxing heatCapacity: 10000 + tileRipResistance: 50 - type: tile id: FloorGym @@ -1201,18 +1275,13 @@ friction: 0.25 itemDrop: FloorTileItemGym heatCapacity: 10000 + tileRipResistance: 50 # Shuttle - type: tile id: FloorShuttleWhite name: tiles-white-shuttle-floor sprite: /Textures/Tiles/shuttlewhite.png - variants: 4 - placementVariants: - - 1.0 - - 1.0 - - 1.0 - - 1.0 baseTurf: Plating isSubfloor: false deconstructTools: [ Prying ] @@ -1220,17 +1289,12 @@ collection: FootstepFloor itemDrop: FloorTileItemShuttleWhite heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorShuttleGrey name: tiles-grey-shuttle-floor sprite: /Textures/Tiles/shuttlegrey.png - variants: 4 - placementVariants: - - 1.0 - - 1.0 - - 1.0 - - 1.0 baseTurf: Plating isSubfloor: false deconstructTools: [ Prying ] @@ -1238,17 +1302,12 @@ collection: FootstepFloor itemDrop: FloorTileItemShuttleGrey heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorShuttleBlack name: tiles-black-shuttle-floor sprite: /Textures/Tiles/shuttleblack.png - variants: 4 - placementVariants: - - 1.0 - - 1.0 - - 1.0 - - 1.0 baseTurf: Plating isSubfloor: false deconstructTools: [ Prying ] @@ -1256,17 +1315,12 @@ collection: FootstepFloor itemDrop: FloorTileItemShuttleBlack heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorShuttleBlue name: tiles-blue-shuttle-floor sprite: /Textures/Tiles/shuttleblue.png - variants: 4 - placementVariants: - - 1.0 - - 1.0 - - 1.0 - - 1.0 baseTurf: Plating isSubfloor: false deconstructTools: [ Prying ] @@ -1274,17 +1328,12 @@ collection: FootstepFloor itemDrop: FloorTileItemShuttleBlue heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorShuttleOrange name: tiles-orange-shuttle-floor sprite: /Textures/Tiles/shuttleorange.png - variants: 4 - placementVariants: - - 1.0 - - 1.0 - - 1.0 - - 1.0 baseTurf: Plating isSubfloor: false deconstructTools: [ Prying ] @@ -1292,17 +1341,12 @@ collection: FootstepFloor itemDrop: FloorTileItemShuttleOrange heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorShuttlePurple name: tiles-purple-shuttle-floor sprite: /Textures/Tiles/shuttlepurple.png - variants: 4 - placementVariants: - - 1.0 - - 1.0 - - 1.0 - - 1.0 baseTurf: Plating isSubfloor: false deconstructTools: [ Prying ] @@ -1310,17 +1354,12 @@ collection: FootstepFloor itemDrop: FloorTileItemShuttlePurple heatCapacity: 10000 + tileRipResistance: 4500 - type: tile id: FloorShuttleRed name: tiles-red-shuttle-floor sprite: /Textures/Tiles/shuttlered.png - variants: 4 - placementVariants: - - 1.0 - - 1.0 - - 1.0 - - 1.0 baseTurf: Plating isSubfloor: false deconstructTools: [ Prying ] @@ -1328,6 +1367,7 @@ collection: FootstepFloor itemDrop: FloorTileItemShuttleRed heatCapacity: 10000 + tileRipResistance: 4500 # Materials @@ -1342,6 +1382,7 @@ collection: FootstepTile itemDrop: FloorTileItemGold heatCapacity: 10000 + tileRipResistance: 600 - type: tile id: FloorSilver @@ -1354,6 +1395,7 @@ collection: FootstepTile itemDrop: FloorTileItemSilver heatCapacity: 10000 + tileRipResistance: 500 - type: tile id: FloorGlass @@ -1372,6 +1414,7 @@ collection: FootstepTile itemDrop: SheetGlass1 heatCapacity: 10000 + tileRipResistance: 150 - type: tile id: FloorRGlass @@ -1390,6 +1433,7 @@ collection: FootstepTile itemDrop: SheetRGlass1 heatCapacity: 10000 + tileRipResistance: 175 # Circuits - type: tile @@ -1403,6 +1447,7 @@ collection: FootstepHull itemDrop: FloorTileItemGCircuit heatCapacity: 10000 + tileRipResistance: 225 - type: tile id: FloorBlueCircuit @@ -1415,6 +1460,7 @@ collection: FootstepHull itemDrop: FloorTileItemBCircuit heatCapacity: 10000 + tileRipResistance: 225 # Terrain - type: tile @@ -1708,6 +1754,7 @@ itemDrop: FloorTileItemFlesh friction: 0.05 #slippy heatCapacity: 10000 + tileRipResistance: 80 - type: tile id: FloorTechMaint2 @@ -1720,6 +1767,7 @@ collection: FootstepHull itemDrop: FloorTileItemSteelMaint heatCapacity: 10000 + tileRipResistance: 225 - type: tile id: FloorTechMaint3 @@ -1738,6 +1786,7 @@ collection: FootstepHull itemDrop: FloorTileItemGratingMaint heatCapacity: 10000 + tileRipResistance: 225 - type: tile id: FloorWoodTile @@ -1758,6 +1807,7 @@ collection: BarestepWood itemDrop: FloorTileItemWoodPattern heatCapacity: 10000 + tileRipResistance: 75 - type: tile id: FloorBrokenWood @@ -1781,6 +1831,7 @@ collection: BarestepWood itemDrop: MaterialWoodPlank1 heatCapacity: 10000 + tileRipResistance: 60 - type: tile id: FloorWebTile @@ -1795,6 +1846,7 @@ collection: BarestepCarpet itemDrop: FloorTileItemWeb heatCapacity: 10000 + tileRipResistance: 30 - type: tile id: FloorChromite @@ -1826,6 +1878,7 @@ collection: FootstepHull itemDrop: FloorTileItemSteel #probably should not be normally obtainable, but the game shits itself and dies when you try to put null here heatCapacity: 10000 + tileRipResistance: 500 - type: tile id: FloorHullReinforced @@ -1838,6 +1891,7 @@ itemDrop: FloorTileItemSteel heatCapacity: 100000 #/tg/ has this set as "INFINITY." I don't know if that exists here so I've just added an extra 0 indestructible: true + reinforced: true - type: tile id: FloorReinforcedHardened @@ -1848,6 +1902,7 @@ footstepSounds: collection: FootstepHull itemDrop: FloorTileItemReinforced #same case as FloorHull + reinforced: true # Faux sci tiles @@ -1879,6 +1934,7 @@ collection: FootstepGrass itemDrop: FloorTileItemAstroGrass heatCapacity: 10000 + tileRipResistance: 50 - type: tile id: FloorMowedAstroGrass @@ -1888,6 +1944,7 @@ isSubfloor: false deconstructTools: [ Cutting ] itemDrop: FloorTileItemMowedAstroGrass + tileRipResistance: 50 - type: tile id: FloorJungleAstroGrass @@ -1897,6 +1954,7 @@ isSubfloor: false deconstructTools: [ Cutting ] itemDrop: FloorTileItemJungleAstroGrass + tileRipResistance: 50 # Ice - type: tile @@ -1912,6 +1970,7 @@ mobFrictionNoInput: 0.05 mobAcceleration: 2 itemDrop: FloorTileItemAstroIce + tileRipResistance: 50 - type: tile id: FloorAstroSnow @@ -1921,6 +1980,7 @@ isSubfloor: false deconstructTools: [ Prying ] itemDrop: FloorTileItemAstroSnow + tileRipResistance: 50 - type: tile id: FloorWoodLarge @@ -1940,4 +2000,5 @@ barestepSounds: collection: BarestepWood itemDrop: FloorTileItemWoodLarge - heatCapacity: 10000 \ No newline at end of file + heatCapacity: 10000 + tileRipResistance: 100 diff --git a/Resources/Prototypes/Traits/categories.yml b/Resources/Prototypes/Traits/categories.yml new file mode 100644 index 00000000000..ba3fd7b3456 --- /dev/null +++ b/Resources/Prototypes/Traits/categories.yml @@ -0,0 +1,19 @@ +# Alphabetically ordered, except for Uncategorized since it is always first + +- type: traitCategory + id: Uncategorized + +- type: traitCategory + id: Auditory + +- type: traitCategory + id: Mental + +- type: traitCategory + id: Physical + +- type: traitCategory + id: Speech + +- type: traitCategory + id: Visual diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index 2f1a7f92d26..eb96d37e01a 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -1,18 +1,26 @@ - type: trait id: Blindness - name: trait-blindness-name - description: trait-blindness-desc - traitGear: WhiteCane - whitelist: - components: - - Blindable + category: Visual + points: 2 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg components: - type: PermanentBlindness - type: trait id: Narcolepsy - name: trait-narcolepsy-name - description: trait-narcolepsy-desc + category: Mental + points: 1 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg components: - type: Narcolepsy timeBetweenIncidents: 300, 600 @@ -20,15 +28,15 @@ - type: trait id: Pacifist - name: trait-pacifist-name - description: trait-pacifist-desc + category: Mental + points: 3 components: - type: Pacified - type: trait id: Paracusia - name: trait-paracusia-name - description: trait-paracusia-desc + category: Auditory + points: 1 components: - type: Paracusia minTimeBetweenIncidents: 0.1 @@ -39,31 +47,50 @@ - type: trait id: Muted - name: trait-muted-name - description: trait-muted-desc - blacklist: - components: - - BorgChassis + category: Speech + points: 1 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg components: - type: Muted - type: trait id: Uncloneable - name: trait-uncloneable-name - description: trait-uncloneable-desc + category: Physical + points: 2 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg components: - type: Uncloneable - type: trait id: FrontalLisp - name: trait-frontal-lisp-name - description: trait-frontal-lisp-desc + category: Speech + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg components: - type: FrontalLisp - type: trait id: Snoring - name: trait-snoring-name - description: trait-snoring-desc + category: Auditory + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg components: - type: Snoring diff --git a/Resources/Prototypes/Traits/inconveniences.yml b/Resources/Prototypes/Traits/inconveniences.yml index 657781d1b59..fee312593da 100644 --- a/Resources/Prototypes/Traits/inconveniences.yml +++ b/Resources/Prototypes/Traits/inconveniences.yml @@ -1,18 +1,55 @@ - type: trait id: LightweightDrunk - name: trait-lightweight-name - description: trait-lightweight-desc + category: Physical + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - HeavyweightDrunk components: - type: LightweightDrunk boozeStrengthMultiplier: 2 - type: trait id: SocialAnxiety - name: trait-socialanxiety-name - description: trait-socialanxiety-desc + category: Mental + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg components: - type: StutteringAccent matchRandomProb: 0.1 fourRandomProb: 0 threeRandomProb: 0 cutRandomProb: 0 + +- type: trait + id: ForeignerLight + category: Mental + points: 1 + requirements: + - !type:TraitGroupExclusionRequirement + prototypes: [ Foreigner ] + components: + - type: ForeignerTrait + cantUnderstand: false # Allows to understand + baseTranslator: TranslatorForeigner + +- type: trait + id: Foreigner + category: Mental + points: 2 + requirements: # TODO: Add a requirement to know at least 1 non-gc language + - !type:TraitGroupExclusionRequirement + prototypes: [ ForeignerLight ] + components: + - type: ForeignerTrait + baseTranslator: TranslatorForeigner diff --git a/Resources/Prototypes/Traits/neutral.yml b/Resources/Prototypes/Traits/neutral.yml index 9e7f7655076..86e12d20b34 100644 --- a/Resources/Prototypes/Traits/neutral.yml +++ b/Resources/Prototypes/Traits/neutral.yml @@ -1,18 +1,43 @@ - type: trait id: PirateAccent - name: trait-pirate-accent-name - description: trait-pirate-accent-desc + category: Speech components: - type: PirateAccent - type: trait id: Accentless - name: trait-accentless-name - description: trait-accentless-desc + category: Speech + points: -1 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg components: - - type: Accentless - removes: - - type: LizardAccent - - type: MothAccent - - type: ReplacementAccent - accent: dwarf + - type: Accentless + removes: + - type: LizardAccent + - type: MothAccent + - type: ReplacementAccent + accent: dwarf + +- type: trait + id: NormalVisionHarpy + category: Visual + points: -1 + requirements: + - !type:CharacterSpeciesRequirement + species: Harpy + components: + - type: NormalVision + +- type: trait + id: NormalVisionVulpkanin + category: Visual + points: -1 + requirements: + - !type:CharacterSpeciesRequirement + species: Vulpkanin + components: + - type: NormalVision diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml new file mode 100644 index 00000000000..988307f58e4 --- /dev/null +++ b/Resources/Prototypes/Traits/skills.yml @@ -0,0 +1,32 @@ +- type: trait + id: HeavyweightDrunk + category: Physical + points: -2 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - LightweightDrunk + components: + - type: LightweightDrunk + boozeStrengthMultiplier: 0.5 + +- type: trait + id: Thieving + category: Physical + points: -4 + components: + - type: Thieving + ignoreStripHidden: true + stealth: Subtle + stripTimeReduction: 0 + stripTimeMultiplier: 0.667 + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Felinid diff --git a/Resources/Prototypes/Voice/speech_emote_sounds.yml b/Resources/Prototypes/Voice/speech_emote_sounds.yml index 01fabbadf30..a4588952a88 100644 --- a/Resources/Prototypes/Voice/speech_emote_sounds.yml +++ b/Resources/Prototypes/Voice/speech_emote_sounds.yml @@ -95,9 +95,9 @@ Squish: collection: Squishes Scream: - collection: MaleScreams + collection: SlimeMaleScreams Laugh: - collection: MaleLaugh + collection: SlimeMaleLaughs Sneeze: collection: MaleSneezes Cough: @@ -133,9 +133,9 @@ Squish: collection: Squishes Scream: - collection: FemaleScreams + collection: SlimeFemaleScreams Laugh: - collection: FemaleLaugh + collection: SlimeFemaleLaughs Sneeze: collection: FemaleSneezes Cough: diff --git a/Resources/Prototypes/fonts.yml b/Resources/Prototypes/fonts.yml index 03102cd341b..92c2947258c 100644 --- a/Resources/Prototypes/fonts.yml +++ b/Resources/Prototypes/fonts.yml @@ -45,3 +45,19 @@ - type: font id: Emoji path: /Fonts/NotoEmoji.ttf + +- type: font + id: RubikBubbles + path: /Fonts/RubikBubbles.ttf + +- type: font + id: Copperplate + path: /Fonts/Copperplate.otf + +- type: font + id: Manga + path: /Fonts/Mangat.ttf + +- type: font + id: Noganas + path: /Fonts/Noganas.ttf diff --git a/Resources/Prototypes/game_presets.yml b/Resources/Prototypes/game_presets.yml index e99b51f82cd..7d7169bf10a 100644 --- a/Resources/Prototypes/game_presets.yml +++ b/Resources/Prototypes/game_presets.yml @@ -9,6 +9,17 @@ - RampingStationEventScheduler - BasicRoundstartVariation +- type: gamePreset + id: SurvivalHellshift + alias: + - hellshift + showInVote: true + name: hellshift-title + description: hellshift-description + rules: + - HellshiftStationEventScheduler + - BasicRoundstartVariation + - type: gamePreset id: AllAtOnce name: all-at-once-title @@ -90,7 +101,7 @@ - traitor name: traitor-title description: traitor-description - showInVote: false + showInVote: true rules: - Traitor - SubGamemodesRule diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index c6a0ab3f8fd..231326e5b11 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -31,18 +31,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 @@ -202,6 +214,9 @@ - type: Tag id: Bottle +- type: Tag + id: BoxCardboard + - type: Tag id: BoxHug @@ -347,6 +362,9 @@ - type: Tag id: ChemDispensable # container that can go into the chem dispenser +- type: Tag + id: ChiliBowl + - type: Tag id: Cigarette @@ -383,11 +401,14 @@ - type: Tag id: CluwneHorn -- type: Tag #Ohioans die happy +- type: Tag + id: Coldsauce + +- type: Tag id: Corn - type: Tag - id: Coldsauce + id: CottonBoll - type: Tag id: Cow @@ -677,6 +698,9 @@ - type: Tag id: HighSecDoor +- type: Tag + id: HiViz + - type: Tag id: Hoe @@ -764,9 +788,6 @@ - type: Tag id: MacroBomb -- type: Tag - id: MicroBomb - - type: Tag id: MimeBelt @@ -847,6 +868,12 @@ - type: Tag id: Metal +- type: Tag + id: MicroBomb + +- type: Tag + id: MicrowaveMachineBoard + - type: Tag id: MindShield @@ -1142,6 +1169,9 @@ - type: Tag id: StationMapElectronics +- type: Tag + id: Steak + - type: Tag id: SubdermalImplant @@ -1211,6 +1241,9 @@ - type: Tag id: UraniumGlassShard +- type: Tag + id: Vegetable + - type: Tag id: VimPilot @@ -1250,6 +1283,9 @@ - type: Tag id: Window +- type: Tag + id: Wine + - type: Tag id: WizardWand # that evil vvizard vvand diff --git a/Resources/Textures/Actions/escapeinventory.rsi/cancel-escape.png b/Resources/Textures/Actions/escapeinventory.rsi/cancel-escape.png new file mode 100644 index 00000000000..609e9e3d199 Binary files /dev/null and b/Resources/Textures/Actions/escapeinventory.rsi/cancel-escape.png differ diff --git a/Resources/Textures/Actions/escapeinventory.rsi/meta.json b/Resources/Textures/Actions/escapeinventory.rsi/meta.json new file mode 100644 index 00000000000..ba379dedab4 --- /dev/null +++ b/Resources/Textures/Actions/escapeinventory.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Duffelbag icon taken from tgstation at commit https://github.com/tgstation/tgstation/commit/547852588166c8e091b441e4e67169e156bb09c1 | Modified into cancel-escape.png by Mnemotechnician (github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "cancel-escape" + } + ] +} diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/equipped-OUTERCLOTHING.png index 81512185135..78f7cd2453e 100644 Binary files a/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/equipped-OUTERCLOTHING.png and b/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/icon.png index 2c2e17abe25..b1405b8b062 100644 Binary files a/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/icon.png and b/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/meta.json index 3f816376c7e..9ae7fc3f93a 100644 --- a/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken/modified by Taral from tgstation at commit https://github.com/tgstation/tgstation/commit/dbc2435fa562f4ef130a7112d2a4cc9c80099894", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/equipped-OUTERCLOTHING.png index fdbed82bd34..45ba5b9a32f 100644 Binary files a/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/equipped-OUTERCLOTHING.png and b/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/icon.png index bb2e517bde2..fde6c90e2ca 100644 Binary files a/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/icon.png and b/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/meta.json index 30607d47eaa..afdd4120b55 100644 --- a/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from TGstation github https://github.com/tgstation/tgstation/commit/fed2ddeb54d0fb8bb97cb0a899a088b7d7423bbb", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise", "size": { "x": 32, "y": 32 @@ -23,4 +23,4 @@ "directions": 4 } ] -} \ No newline at end of file +} diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/equipped-OUTERCLOTHING.png index 427c203b198..0063e8cda06 100644 Binary files a/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/equipped-OUTERCLOTHING.png and b/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/icon.png index e70741f1ff9..a92566d3087 100644 Binary files a/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/icon.png and b/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/meta.json index e482264df5f..afdd4120b55 100644 --- a/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Armor/security.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/4f6190e2895e09116663ef282d3ce1d8b35c032e", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/equipped-OUTERCLOTHING.png index fb4087b662b..59d6ea3b487 100644 Binary files a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/equipped-OUTERCLOTHING.png and b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/icon.png index f2b15dd82f3..23bb26f648e 100644 Binary files a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/icon.png and b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/meta.json index e0d437b8ece..afdd4120b55 100644 --- a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.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/6665eec76c98a4f3f89bebcd10b34b47dcc0b8ae", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 00000000000..35003686d55 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/icon.png new file mode 100644 index 00000000000..dbb09f8ed06 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 00000000000..fe470b00742 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/icon.png rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/icon.png diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 00000000000..06932fff6fa Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/icon.png new file mode 100644 index 00000000000..c7fd65e30b5 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 00000000000..553d9e2f647 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/icon.png rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/icon.png diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 00000000000..19b5dc75aff Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/icon.png new file mode 100644 index 00000000000..635845bab25 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 00000000000..dfbe6e460dd Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi/icon.png new file mode 100644 index 00000000000..2af90d92f71 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi/meta.json new file mode 100644 index 00000000000..42d21c3d8ab --- /dev/null +++ b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "leonardo_dabepis on discord / @leonardo-dabepis on Tumblr, Edited by heartparkyheart on Discord", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 00000000000..03b6d3cf860 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/icon.png rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi/icon.png diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi/meta.json new file mode 100644 index 00000000000..42d21c3d8ab --- /dev/null +++ b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "leonardo_dabepis on discord / @leonardo-dabepis on Tumblr, Edited by heartparkyheart on Discord", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 00000000000..c818593ba46 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/icon.png rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi/icon.png diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi/meta.json new file mode 100644 index 00000000000..42d21c3d8ab --- /dev/null +++ b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "leonardo_dabepis on discord / @leonardo-dabepis on Tumblr, Edited by heartparkyheart on Discord", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 00000000000..5ce9bf097d3 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi/icon.png new file mode 100644 index 00000000000..c864d60dc01 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi/meta.json new file mode 100644 index 00000000000..42d21c3d8ab --- /dev/null +++ b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "leonardo_dabepis on discord / @leonardo-dabepis on Tumblr, Edited by heartparkyheart on Discord", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 00000000000..3503762d733 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi/icon.png new file mode 100644 index 00000000000..d85eeb0592b Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi/meta.json new file mode 100644 index 00000000000..42d21c3d8ab --- /dev/null +++ b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "leonardo_dabepis on discord / @leonardo-dabepis on Tumblr, Edited by heartparkyheart on Discord", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/equipped-OUTERCLOTHING.png deleted file mode 100644 index 73e230e8a5f..00000000000 Binary files a/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/equipped-OUTERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/equipped-OUTERCLOTHING.png deleted file mode 100644 index 983c2534f4c..00000000000 Binary files a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/equipped-OUTERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/equipped-OUTERCLOTHING.png deleted file mode 100644 index f18a64ab9c0..00000000000 Binary files a/Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/equipped-OUTERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/equipped-OUTERCLOTHING.png deleted file mode 100644 index fb400585e5a..00000000000 Binary files a/Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/equipped-OUTERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/equipped-OUTERCLOTHING.png deleted file mode 100644 index e2a263049a3..00000000000 Binary files a/Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/equipped-OUTERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/icon.png deleted file mode 100644 index 102b192e0fa..00000000000 Binary files a/Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_box.png b/Resources/Textures/Decals/bricktile.rsi/dark_box.png index 153e7d3cfce..d9b23d56766 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_box.png and b/Resources/Textures/Decals/bricktile.rsi/dark_box.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_corner_ne.png b/Resources/Textures/Decals/bricktile.rsi/dark_corner_ne.png index b10deefb78e..284559148eb 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_corner_ne.png and b/Resources/Textures/Decals/bricktile.rsi/dark_corner_ne.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_corner_nw.png b/Resources/Textures/Decals/bricktile.rsi/dark_corner_nw.png index 7f28df09618..d249245bd4e 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_corner_nw.png and b/Resources/Textures/Decals/bricktile.rsi/dark_corner_nw.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_corner_se.png b/Resources/Textures/Decals/bricktile.rsi/dark_corner_se.png index 2cb5db32d35..c608bd12e03 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_corner_se.png and b/Resources/Textures/Decals/bricktile.rsi/dark_corner_se.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_corner_sw.png b/Resources/Textures/Decals/bricktile.rsi/dark_corner_sw.png index f4d9633ba27..7d47c299ba6 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_corner_sw.png and b/Resources/Textures/Decals/bricktile.rsi/dark_corner_sw.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_end_e.png b/Resources/Textures/Decals/bricktile.rsi/dark_end_e.png index e7f63be4219..323e75d76f7 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_end_e.png and b/Resources/Textures/Decals/bricktile.rsi/dark_end_e.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_end_n.png b/Resources/Textures/Decals/bricktile.rsi/dark_end_n.png index 806c94fe730..3d91cfbdc0f 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_end_n.png and b/Resources/Textures/Decals/bricktile.rsi/dark_end_n.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_end_s.png b/Resources/Textures/Decals/bricktile.rsi/dark_end_s.png index 4bae8c99b74..96920182050 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_end_s.png and b/Resources/Textures/Decals/bricktile.rsi/dark_end_s.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_end_w.png b/Resources/Textures/Decals/bricktile.rsi/dark_end_w.png index b010ef23997..dcb96039e9d 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_end_w.png and b/Resources/Textures/Decals/bricktile.rsi/dark_end_w.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_inner_ne.png b/Resources/Textures/Decals/bricktile.rsi/dark_inner_ne.png index 08f219869f0..7a9da46b878 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_inner_ne.png and b/Resources/Textures/Decals/bricktile.rsi/dark_inner_ne.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_inner_nw.png b/Resources/Textures/Decals/bricktile.rsi/dark_inner_nw.png index d716a81e831..d0ccf15f353 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_inner_nw.png and b/Resources/Textures/Decals/bricktile.rsi/dark_inner_nw.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_inner_se.png b/Resources/Textures/Decals/bricktile.rsi/dark_inner_se.png index fc60f896982..70b3944d6c6 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_inner_se.png and b/Resources/Textures/Decals/bricktile.rsi/dark_inner_se.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_inner_sw.png b/Resources/Textures/Decals/bricktile.rsi/dark_inner_sw.png index c4ac0d8f100..9b74f978998 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_inner_sw.png and b/Resources/Textures/Decals/bricktile.rsi/dark_inner_sw.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_line_e.png b/Resources/Textures/Decals/bricktile.rsi/dark_line_e.png index 99cb16a6ad8..f2f3b75fd8f 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_line_e.png and b/Resources/Textures/Decals/bricktile.rsi/dark_line_e.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_line_n.png b/Resources/Textures/Decals/bricktile.rsi/dark_line_n.png index 928b56c942a..ebf08c0ac2c 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_line_n.png and b/Resources/Textures/Decals/bricktile.rsi/dark_line_n.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_line_s.png b/Resources/Textures/Decals/bricktile.rsi/dark_line_s.png index f0ffe1c434d..5fc1efc7bbe 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_line_s.png and b/Resources/Textures/Decals/bricktile.rsi/dark_line_s.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_line_w.png b/Resources/Textures/Decals/bricktile.rsi/dark_line_w.png index bfae586a073..1bd29e14973 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_line_w.png and b/Resources/Textures/Decals/bricktile.rsi/dark_line_w.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/meta.json b/Resources/Textures/Decals/bricktile.rsi/meta.json index 313a68db1ac..2658bbe3b3c 100644 --- a/Resources/Textures/Decals/bricktile.rsi/meta.json +++ b/Resources/Textures/Decals/bricktile.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC0-1.0", - "copyright": "Edited by Flareguy, originally created by github user @moonheart08", + "copyright": "Made by github user @Morb0. Modified v2 by ko4erga (discord)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_box.png b/Resources/Textures/Decals/bricktile.rsi/steel_box.png index f7e5af84967..124905eabfc 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_box.png and b/Resources/Textures/Decals/bricktile.rsi/steel_box.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_corner_ne.png b/Resources/Textures/Decals/bricktile.rsi/steel_corner_ne.png index dcf9e52b7cd..f17f3c19991 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_corner_ne.png and b/Resources/Textures/Decals/bricktile.rsi/steel_corner_ne.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_corner_nw.png b/Resources/Textures/Decals/bricktile.rsi/steel_corner_nw.png index 9601a55f50d..86fa0e9e007 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_corner_nw.png and b/Resources/Textures/Decals/bricktile.rsi/steel_corner_nw.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_corner_se.png b/Resources/Textures/Decals/bricktile.rsi/steel_corner_se.png index 134997a6112..203dce3f83b 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_corner_se.png and b/Resources/Textures/Decals/bricktile.rsi/steel_corner_se.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_corner_sw.png b/Resources/Textures/Decals/bricktile.rsi/steel_corner_sw.png index bb107cb037e..9eb1cfc533f 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_corner_sw.png and b/Resources/Textures/Decals/bricktile.rsi/steel_corner_sw.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_end_e.png b/Resources/Textures/Decals/bricktile.rsi/steel_end_e.png index 58c70fb9485..fb05cd35c4f 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_end_e.png and b/Resources/Textures/Decals/bricktile.rsi/steel_end_e.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_end_n.png b/Resources/Textures/Decals/bricktile.rsi/steel_end_n.png index 36092d5d0fe..e1e2e04c394 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_end_n.png and b/Resources/Textures/Decals/bricktile.rsi/steel_end_n.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_end_s.png b/Resources/Textures/Decals/bricktile.rsi/steel_end_s.png index b377ac46b91..08070278254 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_end_s.png and b/Resources/Textures/Decals/bricktile.rsi/steel_end_s.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_end_w.png b/Resources/Textures/Decals/bricktile.rsi/steel_end_w.png index e9fd6a05797..0eeb92f6f71 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_end_w.png and b/Resources/Textures/Decals/bricktile.rsi/steel_end_w.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_inner_ne.png b/Resources/Textures/Decals/bricktile.rsi/steel_inner_ne.png index d8e5a50f8cf..33f2919865b 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_inner_ne.png and b/Resources/Textures/Decals/bricktile.rsi/steel_inner_ne.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_inner_nw.png b/Resources/Textures/Decals/bricktile.rsi/steel_inner_nw.png index ea84f9755ff..644f5448cd0 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_inner_nw.png and b/Resources/Textures/Decals/bricktile.rsi/steel_inner_nw.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_inner_se.png b/Resources/Textures/Decals/bricktile.rsi/steel_inner_se.png index 7d29fb22571..0f9072cc9e5 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_inner_se.png and b/Resources/Textures/Decals/bricktile.rsi/steel_inner_se.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_inner_sw.png b/Resources/Textures/Decals/bricktile.rsi/steel_inner_sw.png index d8fac15ac82..cca9bc52c4b 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_inner_sw.png and b/Resources/Textures/Decals/bricktile.rsi/steel_inner_sw.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_line_e.png b/Resources/Textures/Decals/bricktile.rsi/steel_line_e.png index 0eded8ad61f..10b910fe169 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_line_e.png and b/Resources/Textures/Decals/bricktile.rsi/steel_line_e.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_line_n.png b/Resources/Textures/Decals/bricktile.rsi/steel_line_n.png index 8c2112e975a..0a6d337048b 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_line_n.png and b/Resources/Textures/Decals/bricktile.rsi/steel_line_n.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_line_s.png b/Resources/Textures/Decals/bricktile.rsi/steel_line_s.png index 0624ec350e0..60bf358d658 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_line_s.png and b/Resources/Textures/Decals/bricktile.rsi/steel_line_s.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_line_w.png b/Resources/Textures/Decals/bricktile.rsi/steel_line_w.png index a67b6abc834..aff9dabab68 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_line_w.png and b/Resources/Textures/Decals/bricktile.rsi/steel_line_w.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/white_box.png b/Resources/Textures/Decals/bricktile.rsi/white_box.png index d4454f06763..f95af9e5d68 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/white_box.png and b/Resources/Textures/Decals/bricktile.rsi/white_box.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/white_corner_ne.png b/Resources/Textures/Decals/bricktile.rsi/white_corner_ne.png index 292139bfe4c..90cda6ec336 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/white_corner_ne.png and b/Resources/Textures/Decals/bricktile.rsi/white_corner_ne.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/white_corner_nw.png b/Resources/Textures/Decals/bricktile.rsi/white_corner_nw.png index 5624893809e..3fe0a9634c7 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/white_corner_nw.png and b/Resources/Textures/Decals/bricktile.rsi/white_corner_nw.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/white_corner_se.png b/Resources/Textures/Decals/bricktile.rsi/white_corner_se.png index addb819cece..c4cdab83f1c 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/white_corner_se.png and b/Resources/Textures/Decals/bricktile.rsi/white_corner_se.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/white_corner_sw.png b/Resources/Textures/Decals/bricktile.rsi/white_corner_sw.png index fb06423131e..a2157c064c4 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/white_corner_sw.png and b/Resources/Textures/Decals/bricktile.rsi/white_corner_sw.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/white_end_e.png b/Resources/Textures/Decals/bricktile.rsi/white_end_e.png index 548bdd63039..6b857400be3 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/white_end_e.png and b/Resources/Textures/Decals/bricktile.rsi/white_end_e.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/white_end_n.png b/Resources/Textures/Decals/bricktile.rsi/white_end_n.png index 68fe5bcf7b6..739e4dcdfcd 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/white_end_n.png and b/Resources/Textures/Decals/bricktile.rsi/white_end_n.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/white_end_s.png b/Resources/Textures/Decals/bricktile.rsi/white_end_s.png index 4b96c7858aa..03b4eb7593e 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/white_end_s.png and b/Resources/Textures/Decals/bricktile.rsi/white_end_s.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/white_end_w.png b/Resources/Textures/Decals/bricktile.rsi/white_end_w.png index c01877b1769..a982e97bec6 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/white_end_w.png and b/Resources/Textures/Decals/bricktile.rsi/white_end_w.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/white_inner_ne.png b/Resources/Textures/Decals/bricktile.rsi/white_inner_ne.png index 0726c450660..e8d326d08d5 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/white_inner_ne.png and b/Resources/Textures/Decals/bricktile.rsi/white_inner_ne.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/white_inner_nw.png b/Resources/Textures/Decals/bricktile.rsi/white_inner_nw.png index 5e75689308a..1b6e902e535 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/white_inner_nw.png and b/Resources/Textures/Decals/bricktile.rsi/white_inner_nw.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/white_inner_se.png b/Resources/Textures/Decals/bricktile.rsi/white_inner_se.png index 82013151cb9..f41846183f0 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/white_inner_se.png and b/Resources/Textures/Decals/bricktile.rsi/white_inner_se.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/white_inner_sw.png b/Resources/Textures/Decals/bricktile.rsi/white_inner_sw.png index 848d13c3710..dfddc4c38c5 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/white_inner_sw.png and b/Resources/Textures/Decals/bricktile.rsi/white_inner_sw.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/white_line_e.png b/Resources/Textures/Decals/bricktile.rsi/white_line_e.png index ecbc891f6f7..1d70a2d6ede 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/white_line_e.png and b/Resources/Textures/Decals/bricktile.rsi/white_line_e.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/white_line_n.png b/Resources/Textures/Decals/bricktile.rsi/white_line_n.png index 1d7203daab8..cfd681dcbbe 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/white_line_n.png and b/Resources/Textures/Decals/bricktile.rsi/white_line_n.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/white_line_s.png b/Resources/Textures/Decals/bricktile.rsi/white_line_s.png index 408d3220d75..c92bae8346a 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/white_line_s.png and b/Resources/Textures/Decals/bricktile.rsi/white_line_s.png differ diff --git a/Resources/Textures/Decals/bricktile.rsi/white_line_w.png b/Resources/Textures/Decals/bricktile.rsi/white_line_w.png index fd6bf603947..4bdf37aac22 100644 Binary files a/Resources/Textures/Decals/bricktile.rsi/white_line_w.png and b/Resources/Textures/Decals/bricktile.rsi/white_line_w.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/dark_box.png b/Resources/Textures/Decals/minitile.rsi/dark_box.png index 1e25897961e..87053060a3a 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/dark_box.png and b/Resources/Textures/Decals/minitile.rsi/dark_box.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/dark_corner_ne.png b/Resources/Textures/Decals/minitile.rsi/dark_corner_ne.png index 000005cf10f..044d3ee58af 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/dark_corner_ne.png and b/Resources/Textures/Decals/minitile.rsi/dark_corner_ne.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/dark_corner_nw.png b/Resources/Textures/Decals/minitile.rsi/dark_corner_nw.png index 428ce9c617f..92590b4a514 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/dark_corner_nw.png and b/Resources/Textures/Decals/minitile.rsi/dark_corner_nw.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/dark_corner_se.png b/Resources/Textures/Decals/minitile.rsi/dark_corner_se.png index d369a1fee4e..8fe46845e13 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/dark_corner_se.png and b/Resources/Textures/Decals/minitile.rsi/dark_corner_se.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/dark_corner_sw.png b/Resources/Textures/Decals/minitile.rsi/dark_corner_sw.png index bf3b1015df4..48e31919367 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/dark_corner_sw.png and b/Resources/Textures/Decals/minitile.rsi/dark_corner_sw.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/dark_end_e.png b/Resources/Textures/Decals/minitile.rsi/dark_end_e.png index 15f5068670c..82b0087a037 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/dark_end_e.png and b/Resources/Textures/Decals/minitile.rsi/dark_end_e.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/dark_end_n.png b/Resources/Textures/Decals/minitile.rsi/dark_end_n.png index 3bd2d26686b..b642ce1bf4b 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/dark_end_n.png and b/Resources/Textures/Decals/minitile.rsi/dark_end_n.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/dark_end_s.png b/Resources/Textures/Decals/minitile.rsi/dark_end_s.png index 68b87cb6f32..114b1ac821b 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/dark_end_s.png and b/Resources/Textures/Decals/minitile.rsi/dark_end_s.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/dark_end_w.png b/Resources/Textures/Decals/minitile.rsi/dark_end_w.png index d6e3ca96ea6..d9099511d8c 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/dark_end_w.png and b/Resources/Textures/Decals/minitile.rsi/dark_end_w.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/dark_inner_ne.png b/Resources/Textures/Decals/minitile.rsi/dark_inner_ne.png index 82cfac92064..7dac62620b8 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/dark_inner_ne.png and b/Resources/Textures/Decals/minitile.rsi/dark_inner_ne.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/dark_inner_nw.png b/Resources/Textures/Decals/minitile.rsi/dark_inner_nw.png index 6cebbf93f45..e3ef1166304 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/dark_inner_nw.png and b/Resources/Textures/Decals/minitile.rsi/dark_inner_nw.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/dark_inner_se.png b/Resources/Textures/Decals/minitile.rsi/dark_inner_se.png index f6890fe52fe..3ddb20a5f4d 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/dark_inner_se.png and b/Resources/Textures/Decals/minitile.rsi/dark_inner_se.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/dark_inner_sw.png b/Resources/Textures/Decals/minitile.rsi/dark_inner_sw.png index 0a5c96d7621..cc8919b283d 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/dark_inner_sw.png and b/Resources/Textures/Decals/minitile.rsi/dark_inner_sw.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/dark_line_e.png b/Resources/Textures/Decals/minitile.rsi/dark_line_e.png index c50102d604c..544580f150f 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/dark_line_e.png and b/Resources/Textures/Decals/minitile.rsi/dark_line_e.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/dark_line_n.png b/Resources/Textures/Decals/minitile.rsi/dark_line_n.png index e1ca99dbc64..ba8bb6a1769 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/dark_line_n.png and b/Resources/Textures/Decals/minitile.rsi/dark_line_n.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/dark_line_s.png b/Resources/Textures/Decals/minitile.rsi/dark_line_s.png index 1005b61e533..d2419e8cd3b 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/dark_line_s.png and b/Resources/Textures/Decals/minitile.rsi/dark_line_s.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/dark_line_w.png b/Resources/Textures/Decals/minitile.rsi/dark_line_w.png index a53ed8a21c9..9f809bd964d 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/dark_line_w.png and b/Resources/Textures/Decals/minitile.rsi/dark_line_w.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/meta.json b/Resources/Textures/Decals/minitile.rsi/meta.json index 313a68db1ac..50dd3a3a1b2 100644 --- a/Resources/Textures/Decals/minitile.rsi/meta.json +++ b/Resources/Textures/Decals/minitile.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC0-1.0", - "copyright": "Edited by Flareguy, originally created by github user @moonheart08", + "copyright": "Made by github user @Morb0", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Decals/minitile.rsi/steel_box.png b/Resources/Textures/Decals/minitile.rsi/steel_box.png index 25643de33c0..65bfc266e91 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/steel_box.png and b/Resources/Textures/Decals/minitile.rsi/steel_box.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/steel_corner_ne.png b/Resources/Textures/Decals/minitile.rsi/steel_corner_ne.png index b11860e110e..0eaa625b811 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/steel_corner_ne.png and b/Resources/Textures/Decals/minitile.rsi/steel_corner_ne.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/steel_corner_nw.png b/Resources/Textures/Decals/minitile.rsi/steel_corner_nw.png index 9cd5e7d03a4..8216073046e 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/steel_corner_nw.png and b/Resources/Textures/Decals/minitile.rsi/steel_corner_nw.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/steel_corner_se.png b/Resources/Textures/Decals/minitile.rsi/steel_corner_se.png index 1446f6856ee..2535334eab0 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/steel_corner_se.png and b/Resources/Textures/Decals/minitile.rsi/steel_corner_se.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/steel_corner_sw.png b/Resources/Textures/Decals/minitile.rsi/steel_corner_sw.png index 3d1a5dad3f4..81f8f263530 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/steel_corner_sw.png and b/Resources/Textures/Decals/minitile.rsi/steel_corner_sw.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/steel_end_e.png b/Resources/Textures/Decals/minitile.rsi/steel_end_e.png index a01e46cc97f..a5bd0f3807f 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/steel_end_e.png and b/Resources/Textures/Decals/minitile.rsi/steel_end_e.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/steel_end_n.png b/Resources/Textures/Decals/minitile.rsi/steel_end_n.png index 631f02a18a5..5ca76664588 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/steel_end_n.png and b/Resources/Textures/Decals/minitile.rsi/steel_end_n.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/steel_end_s.png b/Resources/Textures/Decals/minitile.rsi/steel_end_s.png index 19eede5c2d1..58edc11fa10 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/steel_end_s.png and b/Resources/Textures/Decals/minitile.rsi/steel_end_s.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/steel_end_w.png b/Resources/Textures/Decals/minitile.rsi/steel_end_w.png index 465299858c2..b03aa59c9c8 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/steel_end_w.png and b/Resources/Textures/Decals/minitile.rsi/steel_end_w.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/steel_inner_ne.png b/Resources/Textures/Decals/minitile.rsi/steel_inner_ne.png index d8e5a50f8cf..b32452a8db8 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/steel_inner_ne.png and b/Resources/Textures/Decals/minitile.rsi/steel_inner_ne.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/steel_inner_nw.png b/Resources/Textures/Decals/minitile.rsi/steel_inner_nw.png index ea84f9755ff..0bda9148f10 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/steel_inner_nw.png and b/Resources/Textures/Decals/minitile.rsi/steel_inner_nw.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/steel_inner_se.png b/Resources/Textures/Decals/minitile.rsi/steel_inner_se.png index 7d29fb22571..de8f47511a8 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/steel_inner_se.png and b/Resources/Textures/Decals/minitile.rsi/steel_inner_se.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/steel_inner_sw.png b/Resources/Textures/Decals/minitile.rsi/steel_inner_sw.png index d8fac15ac82..bdee5ab5e01 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/steel_inner_sw.png and b/Resources/Textures/Decals/minitile.rsi/steel_inner_sw.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/steel_line_e.png b/Resources/Textures/Decals/minitile.rsi/steel_line_e.png index 3bdd0e2d4f7..ba161c6f186 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/steel_line_e.png and b/Resources/Textures/Decals/minitile.rsi/steel_line_e.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/steel_line_n.png b/Resources/Textures/Decals/minitile.rsi/steel_line_n.png index 953586a1c50..f73aa627b9f 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/steel_line_n.png and b/Resources/Textures/Decals/minitile.rsi/steel_line_n.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/steel_line_s.png b/Resources/Textures/Decals/minitile.rsi/steel_line_s.png index 89b0fe63f0b..fe8804e8c99 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/steel_line_s.png and b/Resources/Textures/Decals/minitile.rsi/steel_line_s.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/steel_line_w.png b/Resources/Textures/Decals/minitile.rsi/steel_line_w.png index 37a7a41a7f9..37f152f7ff1 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/steel_line_w.png and b/Resources/Textures/Decals/minitile.rsi/steel_line_w.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/white_box.png b/Resources/Textures/Decals/minitile.rsi/white_box.png index 995c63267d0..b8f0174c49f 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/white_box.png and b/Resources/Textures/Decals/minitile.rsi/white_box.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/white_corner_ne.png b/Resources/Textures/Decals/minitile.rsi/white_corner_ne.png index c584d398764..f0342975d29 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/white_corner_ne.png and b/Resources/Textures/Decals/minitile.rsi/white_corner_ne.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/white_corner_nw.png b/Resources/Textures/Decals/minitile.rsi/white_corner_nw.png index 04cdc186e58..8d751af952e 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/white_corner_nw.png and b/Resources/Textures/Decals/minitile.rsi/white_corner_nw.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/white_corner_se.png b/Resources/Textures/Decals/minitile.rsi/white_corner_se.png index be5170a0e22..54eea747f03 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/white_corner_se.png and b/Resources/Textures/Decals/minitile.rsi/white_corner_se.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/white_corner_sw.png b/Resources/Textures/Decals/minitile.rsi/white_corner_sw.png index 756200c2631..b57417997e5 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/white_corner_sw.png and b/Resources/Textures/Decals/minitile.rsi/white_corner_sw.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/white_end_e.png b/Resources/Textures/Decals/minitile.rsi/white_end_e.png index 3fd25f45991..e256a862352 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/white_end_e.png and b/Resources/Textures/Decals/minitile.rsi/white_end_e.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/white_end_n.png b/Resources/Textures/Decals/minitile.rsi/white_end_n.png index edc8a69135d..a8ba5574771 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/white_end_n.png and b/Resources/Textures/Decals/minitile.rsi/white_end_n.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/white_end_s.png b/Resources/Textures/Decals/minitile.rsi/white_end_s.png index ca2528efd15..55823a70963 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/white_end_s.png and b/Resources/Textures/Decals/minitile.rsi/white_end_s.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/white_end_w.png b/Resources/Textures/Decals/minitile.rsi/white_end_w.png index b669f8e54dc..d570b8c404d 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/white_end_w.png and b/Resources/Textures/Decals/minitile.rsi/white_end_w.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/white_inner_ne.png b/Resources/Textures/Decals/minitile.rsi/white_inner_ne.png index 7f8448e5026..76733f6c224 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/white_inner_ne.png and b/Resources/Textures/Decals/minitile.rsi/white_inner_ne.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/white_inner_nw.png b/Resources/Textures/Decals/minitile.rsi/white_inner_nw.png index 5e75689308a..b368cd57316 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/white_inner_nw.png and b/Resources/Textures/Decals/minitile.rsi/white_inner_nw.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/white_inner_se.png b/Resources/Textures/Decals/minitile.rsi/white_inner_se.png index 82013151cb9..819ebfa14df 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/white_inner_se.png and b/Resources/Textures/Decals/minitile.rsi/white_inner_se.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/white_inner_sw.png b/Resources/Textures/Decals/minitile.rsi/white_inner_sw.png index 7b3b53dde22..dbcb0a02d40 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/white_inner_sw.png and b/Resources/Textures/Decals/minitile.rsi/white_inner_sw.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/white_line_e.png b/Resources/Textures/Decals/minitile.rsi/white_line_e.png index 99edbdd838e..8b81f033897 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/white_line_e.png and b/Resources/Textures/Decals/minitile.rsi/white_line_e.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/white_line_n.png b/Resources/Textures/Decals/minitile.rsi/white_line_n.png index 6846ec65fed..be0a78eb007 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/white_line_n.png and b/Resources/Textures/Decals/minitile.rsi/white_line_n.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/white_line_s.png b/Resources/Textures/Decals/minitile.rsi/white_line_s.png index 54749e90f58..d825870a08c 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/white_line_s.png and b/Resources/Textures/Decals/minitile.rsi/white_line_s.png differ diff --git a/Resources/Textures/Decals/minitile.rsi/white_line_w.png b/Resources/Textures/Decals/minitile.rsi/white_line_w.png index 663ee84761e..53b8223cb19 100644 Binary files a/Resources/Textures/Decals/minitile.rsi/white_line_w.png and b/Resources/Textures/Decals/minitile.rsi/white_line_w.png differ diff --git a/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/idchaplain.png b/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/idchaplain.png deleted file mode 100644 index d27ec5bbfdb..00000000000 Binary files a/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/idchaplain.png and /dev/null differ diff --git a/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/meta.json deleted file mode 100644 index 521c6e58fa7..00000000000 --- a/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/meta.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/d917f4c2a088419d5c3aec7656b7ff8cebd1822e | nyanoprisonguard, nyanogladiator, nyanomartialartist made by Floofers", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "idchaplain" - }, - { - "name": "nyanogladiator" - }, - { - "name": "nyanoprisonguard" - }, - { - "name": "nyanoprisoner" - }, - { - "name": "nyanomailcarrier" - }, - { - "name": "nyanomartialartist" - }, - { - "name": "nyanomantis" - } - ] -} diff --git a/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/nyanogladiator.png b/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/nyanogladiator.png deleted file mode 100644 index 17f3ea2aae1..00000000000 Binary files a/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/nyanogladiator.png and /dev/null differ diff --git a/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/nyanomailcarrier.png b/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/nyanomailcarrier.png deleted file mode 100644 index ba7a3d4dcdd..00000000000 Binary files a/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/nyanomailcarrier.png and /dev/null differ diff --git a/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/nyanomantis.png b/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/nyanomantis.png deleted file mode 100644 index f80e175ec33..00000000000 Binary files a/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/nyanomantis.png and /dev/null differ diff --git a/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/nyanomartialartist.png b/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/nyanomartialartist.png deleted file mode 100644 index 1f7862d0922..00000000000 Binary files a/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/nyanomartialartist.png and /dev/null differ diff --git a/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/nyanoprisoner.png b/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/nyanoprisoner.png deleted file mode 100644 index 96c8f4d9825..00000000000 Binary files a/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/nyanoprisoner.png and /dev/null differ diff --git a/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/nyanoprisonguard.png b/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/nyanoprisonguard.png deleted file mode 100644 index 0539dd50da6..00000000000 Binary files a/Resources/Textures/DeltaV/Objects/Misc/id_cards.rsi/nyanoprisonguard.png and /dev/null differ diff --git a/Resources/Textures/Interface/Alerts/offer_item.rsi/meta.json b/Resources/Textures/Interface/Alerts/offer_item.rsi/meta.json new file mode 100644 index 00000000000..9b5f9361314 --- /dev/null +++ b/Resources/Textures/Interface/Alerts/offer_item.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Original icon taken from https://github.com/ss220-space/Paradise/blob/master220/icons/mob/screen_alert.dmi, modified by Mocho", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "offer_item" + } + ] +} diff --git a/Resources/Textures/Interface/Alerts/offer_item.rsi/offer_item.png b/Resources/Textures/Interface/Alerts/offer_item.rsi/offer_item.png new file mode 100644 index 00000000000..44ac380ddb1 Binary files /dev/null and b/Resources/Textures/Interface/Alerts/offer_item.rsi/offer_item.png differ diff --git a/Resources/Textures/Interface/Alerts/walking.rsi/meta.json b/Resources/Textures/Interface/Alerts/walking.rsi/meta.json new file mode 100644 index 00000000000..d328b01a45f --- /dev/null +++ b/Resources/Textures/Interface/Alerts/walking.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Walking/Running icons modified by Mocho, original taken from /tg/station https://github.com/tgstation/tgstation/pull/52691/commits/6a1261187c108c8f151c99ebfa567bd1ec34044c", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "walking0" + }, + { + "name": "walking1" + } + ] +} diff --git a/Resources/Textures/Interface/Alerts/walking.rsi/walking0.png b/Resources/Textures/Interface/Alerts/walking.rsi/walking0.png new file mode 100644 index 00000000000..1d1f048fb91 Binary files /dev/null and b/Resources/Textures/Interface/Alerts/walking.rsi/walking0.png differ diff --git a/Resources/Textures/Interface/Alerts/walking.rsi/walking1.png b/Resources/Textures/Interface/Alerts/walking.rsi/walking1.png new file mode 100644 index 00000000000..3980ee73b5d Binary files /dev/null and b/Resources/Textures/Interface/Alerts/walking.rsi/walking1.png differ diff --git a/Resources/Textures/Interface/Misc/give_item.rsi/give_item.png b/Resources/Textures/Interface/Misc/give_item.rsi/give_item.png new file mode 100644 index 00000000000..26bc88fb229 Binary files /dev/null and b/Resources/Textures/Interface/Misc/give_item.rsi/give_item.png differ diff --git a/Resources/Textures/Interface/Misc/give_item.rsi/meta.json b/Resources/Textures/Interface/Misc/give_item.rsi/meta.json new file mode 100644 index 00000000000..94cd6fa2e1e --- /dev/null +++ b/Resources/Textures/Interface/Misc/give_item.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/ss220-space/Paradise/blob/master220/icons/misc/mouse_icons/give_item.dmi", + "size": { + "x": 64, + "y": 64 + }, + "states": [ + { + "name": "give_item" + } + ] +} diff --git a/Resources/Textures/Interface/language.png b/Resources/Textures/Interface/language.png new file mode 100644 index 00000000000..2b39424d12d Binary files /dev/null and b/Resources/Textures/Interface/language.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json rename to Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json rename to Resources/Textures/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json rename to Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json rename to Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/finch_tail.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails36x36.rsi/finch_tail.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/finch_tail.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_tails36x36.rsi/finch_tail.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails36x36.rsi/meta.json similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/meta.json rename to Resources/Textures/Mobs/Customization/Harpy/harpy_tails36x36.rsi/meta.json diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/meta.json new file mode 100644 index 00000000000..2961db3707d --- /dev/null +++ b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Peacock by stillxicarus (Discord)", + "size": { + "x": 48, + "y": 48 + }, + "states": [ + { + "name": "peacock_tail_feathers", + "directions": 4 + }, + { + "name": "peacock_tail_eyes", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_eyes.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_eyes.png new file mode 100644 index 00000000000..71af693afd7 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_eyes.png differ diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_feathers.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_feathers.png new file mode 100644 index 00000000000..d56b093d6ca Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_feathers.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wingcover.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wingcover.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wingcover.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wingcover.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/(mdr)grapejuice.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/(mdr)grapejuice.png new file mode 100644 index 00000000000..33c8cf524d7 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/(mdr)grapejuice.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/absinthebottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/absinthebottle.png new file mode 100644 index 00000000000..a696be55ecb Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/absinthebottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/alco-blue.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/alco-blue.png new file mode 100644 index 00000000000..a846c51dccb Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/alco-blue.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/alco-green.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/alco-green.png new file mode 100644 index 00000000000..832eff6c84c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/alco-green.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/alco-red.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/alco-red.png new file mode 100644 index 00000000000..73bb8f09e55 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/alco-red.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/alcoholfreebeer.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/alcoholfreebeer.png new file mode 100644 index 00000000000..04a3a9abc1a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/alcoholfreebeer.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/alebottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/alebottle.png new file mode 100644 index 00000000000..b83adcb16ae Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/alebottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/alecan.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/alecan.png new file mode 100644 index 00000000000..80312918b0e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/alecan.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/art_bru.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/art_bru.png new file mode 100644 index 00000000000..fc610c54e70 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/art_bru.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/badminka.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/badminka.png new file mode 100644 index 00000000000..bcc84e44a79 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/badminka.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/baijiu.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/baijiu.png new file mode 100644 index 00000000000..bb126e29ee5 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/baijiu.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/barflask.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/barflask.png new file mode 100644 index 00000000000..ab221a062a8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/barflask.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/beastenergy.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/beastenergy.png new file mode 100644 index 00000000000..8550ed2e326 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/beastenergy.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/beer.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/beer.png new file mode 100644 index 00000000000..2a6edb52e51 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/beer.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/beercan.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/beercan.png new file mode 100644 index 00000000000..ca7f51e7c9a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/beercan.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/bigteacup.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/bigteacup.png new file mode 100644 index 00000000000..e69ef517774 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/bigteacup.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/bigteacup100.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/bigteacup100.png new file mode 100644 index 00000000000..5d3c46b9c06 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/bigteacup100.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/blackstrap.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/blackstrap.png new file mode 100644 index 00000000000..b6462b62194 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/blackstrap.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/bottleofnothing.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/bottleofnothing.png new file mode 100644 index 00000000000..0758381372d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/bottleofnothing.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/broken.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/broken.png new file mode 100644 index 00000000000..ed561fdb1ec Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/broken.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/broken_bottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/broken_bottle.png new file mode 100644 index 00000000000..1037c72f797 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/broken_bottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/bronze_cup.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/bronze_cup.png new file mode 100644 index 00000000000..b09bb8e7865 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/bronze_cup.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cachaca.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cachaca.png new file mode 100644 index 00000000000..7f85a6361b6 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cachaca.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/ccola.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/ccola.png new file mode 100644 index 00000000000..9ee2b3e36d9 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/ccola.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/champagne.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/champagne.png new file mode 100644 index 00000000000..dedc64e96f2 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/champagne.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/coffee.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/coffee.png new file mode 100644 index 00000000000..d97aeb795d7 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/coffee.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cognacbottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cognacbottle.png new file mode 100644 index 00000000000..63ec409f302 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cognacbottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-blue.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-blue.png new file mode 100644 index 00000000000..68de91a98a0 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-blue.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-brown.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-brown.png new file mode 100644 index 00000000000..89ad1746392 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-brown.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-green.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-green.png new file mode 100644 index 00000000000..bbfc45864d6 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-green.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-orange.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-orange.png new file mode 100644 index 00000000000..23851c7ca34 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-orange.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-pink.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-pink.png new file mode 100644 index 00000000000..4e030420086 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-pink.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-pork.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-pork.png new file mode 100644 index 00000000000..37946fbcd2c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-pork.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-purple.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-purple.png new file mode 100644 index 00000000000..435a9536e90 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-purple.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-red.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-red.png new file mode 100644 index 00000000000..8b8ef526f20 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-red.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-yellow.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-yellow.png new file mode 100644 index 00000000000..db373e7864c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola-yellow.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola.png new file mode 100644 index 00000000000..2a7bec10ec8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cola.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/colabottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/colabottle.png new file mode 100644 index 00000000000..d50cccf5aa5 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/colabottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/coolant.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/coolant.png new file mode 100644 index 00000000000..1d96dc5d870 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/coolant.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cream.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cream.png new file mode 100644 index 00000000000..353bf21ec01 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/cream.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/detflask.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/detflask.png new file mode 100644 index 00000000000..d5cff66ac72 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/detflask.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/dnb.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/dnb.png new file mode 100644 index 00000000000..cf4f39b1658 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/dnb.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/dr_gibb.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/dr_gibb.png new file mode 100644 index 00000000000..750f7df313c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/dr_gibb.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/energy_drink.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/energy_drink.png new file mode 100644 index 00000000000..0a61d66e671 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/energy_drink.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/fitness-cup_black.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/fitness-cup_black.png new file mode 100644 index 00000000000..f86defc451e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/fitness-cup_black.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/fitness-cup_blue.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/fitness-cup_blue.png new file mode 100644 index 00000000000..e96763af972 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/fitness-cup_blue.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/fitness-cup_red.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/fitness-cup_red.png new file mode 100644 index 00000000000..11551c2294a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/fitness-cup_red.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/flask.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/flask.png new file mode 100644 index 00000000000..8da40323e9b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/flask.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/flavorpak.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/flavorpak.png new file mode 100644 index 00000000000..cf19d84fae0 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/flavorpak.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/ginbottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/ginbottle.png new file mode 100644 index 00000000000..b3eb7616b9e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/ginbottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/gingerbeer.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/gingerbeer.png new file mode 100644 index 00000000000..e63b6340cb6 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/gingerbeer.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/golden_cup.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/golden_cup.png new file mode 100644 index 00000000000..bb012a2017c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/golden_cup.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/goldschlagerbottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/goldschlagerbottle.png new file mode 100644 index 00000000000..98d29311113 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/goldschlagerbottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/grenadinebottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/grenadinebottle.png new file mode 100644 index 00000000000..3c0a06640fc Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/grenadinebottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/hellshenbeer.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/hellshenbeer.png new file mode 100644 index 00000000000..c7f3965dfe8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/hellshenbeer.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/herbal.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/herbal.png new file mode 100644 index 00000000000..8d9be0c1fce Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/herbal.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/holyflask.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/holyflask.png new file mode 100644 index 00000000000..0d8ed5a7849 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/holyflask.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/hrukhzaextract.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/hrukhzaextract.png new file mode 100644 index 00000000000..a8df313f1b6 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/hrukhzaextract.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/ice_tea_can.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/ice_tea_can.png new file mode 100644 index 00000000000..811792e6370 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/ice_tea_can.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/ionbru.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/ionbru.png new file mode 100644 index 00000000000..ba260f33140 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/ionbru.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/jar.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/jar.png new file mode 100644 index 00000000000..efccd5f8307 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/jar.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/jar_metroid.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/jar_metroid.png new file mode 100644 index 00000000000..11acb97b667 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/jar_metroid.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/jar_what.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/jar_what.png new file mode 100644 index 00000000000..f2d321857a2 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/jar_what.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/kahluabottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/kahluabottle.png new file mode 100644 index 00000000000..4873366f7fb Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/kahluabottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/lager.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/lager.png new file mode 100644 index 00000000000..3d33258a36f Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/lager.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/lemon-lime.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/lemon-lime.png new file mode 100644 index 00000000000..348fa3836d5 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/lemon-lime.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/lemonjuice.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/lemonjuice.png new file mode 100644 index 00000000000..f37587df67f Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/lemonjuice.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/limejuice.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/limejuice.png new file mode 100644 index 00000000000..65626e53b06 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/limejuice.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/lithiumflask.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/lithiumflask.png new file mode 100644 index 00000000000..f0c665c743b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/lithiumflask.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/lunabrandy.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/lunabrandy.png new file mode 100644 index 00000000000..473a4766afe Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/lunabrandy.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/maplesyrup.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/maplesyrup.png new file mode 100644 index 00000000000..033b13963bb Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/maplesyrup.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/meta.json new file mode 100644 index 00000000000..101ea21f895 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/meta.json @@ -0,0 +1,413 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from baystation at commit https://github.com/Baystation12/Baystation12/commit/464342c5dc8c417b7e79d56c69aa30445bdf3b75", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "pitcher" + }, + { + "name": "pitcher15" + }, + { + "name": "pitcher30" + }, + { + "name": "pitcher50" + }, + { + "name": "pitcher70" + }, + { + "name": "pitcher85" + }, + { + "name": "pitcher100" + }, + { + "name": "alco-blue" + }, + { + "name": "alco-red" + }, + { + "name": "alco-green" + }, + { + "name": "shaker" + }, + { + "name": "jar" + }, + { + "name": "jar_metroid" + }, + { + "name": "jar_what" + }, + { + "name": "waterbottle" + }, + { + "name": "water_cup" + }, + { + "name": "water_cup_e" + }, + { + "name": "grenadinebottle" + }, + { + "name": "holyflask" + }, + { + "name": "barflask" + }, + { + "name": "bigteacup" + }, + { + "name": "bigteacup100" + }, + { + "name": "vacuumflask" + }, + { + "name": "teapot" + }, + { + "name": "shinyflask" + }, + { + "name": "lithiumflask" + }, + { + "name": "rag" + }, + { + "name": "rag_lit", + "delays": [ + [ + 0.2, + 0.2 + ] + ] + }, + { + "name": "rag_small" + }, + { + "name": "rag_small_lit", + "delays": [ + [ + 0.2, + 0.2 + ] + ] + }, + { + "name": "colabottle" + }, + { + "name": "space-up_bottle" + }, + { + "name": "space_mountain_wind_bottle" + }, + { + "name": "fitness-cup_black" + }, + { + "name": "fitness-cup_red" + }, + { + "name": "fitness-cup_blue" + }, + { + "name": "beer" + }, + { + "name": "alebottle" + }, + { + "name": "rumbottle" + }, + { + "name": "whiskeybottle" + }, + { + "name": "whiskeybottle2" + }, + { + "name": "vodkabottle" + }, + { + "name": "premiumvodka" + }, + { + "name": "ginbottle" + }, + { + "name": "cognacbottle" + }, + { + "name": "goldschlagerbottle" + }, + { + "name": "patronbottle" + }, + { + "name": "orangejuice" + }, + { + "name": "limejuice" + }, + { + "name": "cream" + }, + { + "name": "tomatojuice" + }, + { + "name": "sodawater" + }, + { + "name": "milk" + }, + { + "name": "soymilk" + }, + { + "name": "coffee" + }, + { + "name": "flask" + }, + { + "name": "ramen" + }, + { + "name": "golden_cup" + }, + { + "name": "bottleofnothing" + }, + { + "name": "nothing" + }, + { + "name": "vermouthbottle" + }, + { + "name": "kahluabottle" + }, + { + "name": "tequillabottle" + }, + { + "name": "winebottle" + }, + { + "name": "pwinebottle" + }, + { + "name": "premiumwine" + }, + { + "name": "(mdr)grapejuice" + }, + { + "name": "broken" + }, + { + "name": "broken_bottle" + }, + { + "name": "detflask" + }, + { + "name": "badminka" + }, + { + "name": "silver_cup" + }, + { + "name": "bronze_cup" + }, + { + "name": "herbal" + }, + { + "name": "absinthebottle" + }, + { + "name": "oil" + }, + { + "name": "coolant" + }, + { + "name": "placeholder" + }, + { + "name": "syndi_cola" + }, + { + "name": "syndi_cola_x" + }, + { + "name": "art_bru" + }, + { + "name": "beercan" + }, + { + "name": "alecan" + }, + { + "name": "space_mountain_wind" + }, + { + "name": "dr_gibb" + }, + { + "name": "starkist" + }, + { + "name": "space-up" + }, + { + "name": "lemon-lime" + }, + { + "name": "tonic" + }, + { + "name": "cola" + }, + { + "name": "purple_can" + }, + { + "name": "ice_tea_can" + }, + { + "name": "energy_drink" + }, + { + "name": "thirteen_loko" + }, + { + "name": "flavorpak" + }, + { + "name": "lunabrandy" + }, + { + "name": "hellshenbeer" + }, + { + "name": "blackstrap" + }, + { + "name": "sake" + }, + { + "name": "tadmorwine" + }, + { + "name": "champagne" + }, + { + "name": "prosecco" + }, + { + "name": "whiskeybottle3" + }, + { + "name": "beastenergy" + }, + { + "name": "hrukhzaextract" + }, + { + "name": "gingerbeer" + }, + { + "name": "cola-orange" + }, + { + "name": "cola-pink" + }, + { + "name": "cola-purple" + }, + { + "name": "cola-yellow" + }, + { + "name": "cola-red" + }, + { + "name": "cola-blue" + }, + { + "name": "cola-brown" + }, + { + "name": "cola-green" + }, + { + "name": "cola-pork" + }, + { + "name": "vcola" + }, + { + "name": "ccola" + }, + { + "name": "ocola" + }, + { + "name": "ionbru" + }, + { + "name": "baijiu" + }, + { + "name": "cachaca" + }, + { + "name": "rakia" + }, + { + "name": "dnb" + }, + { + "name": "alcoholfreebeer" + }, + { + "name": "lager" + }, + { + "name": "soju" + }, + { + "name": "lemonjuice" + }, + { + "name": "maplesyrup" + }, + { + "name": "thoom" + }, + { + "name": "water" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/milk.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/milk.png new file mode 100644 index 00000000000..5387925e47b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/milk.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/nothing.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/nothing.png new file mode 100644 index 00000000000..d9b49e8a6b5 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/nothing.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/ocola.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/ocola.png new file mode 100644 index 00000000000..93084027eb3 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/ocola.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/oil.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/oil.png new file mode 100644 index 00000000000..61a75bea35a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/oil.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/orangejuice.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/orangejuice.png new file mode 100644 index 00000000000..0d35a2b2d0c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/orangejuice.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/patronbottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/patronbottle.png new file mode 100644 index 00000000000..7df7f754248 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/patronbottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher.png new file mode 100644 index 00000000000..5c118ff0507 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher100.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher100.png new file mode 100644 index 00000000000..dda0416eae4 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher100.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher15.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher15.png new file mode 100644 index 00000000000..a2260318a19 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher15.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher30.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher30.png new file mode 100644 index 00000000000..027acaa18a2 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher30.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher50.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher50.png new file mode 100644 index 00000000000..dc6d16dae9c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher50.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher70.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher70.png new file mode 100644 index 00000000000..0945994d0d1 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher70.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher85.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher85.png new file mode 100644 index 00000000000..437f48f3099 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pitcher85.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/placeholder.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/placeholder.png new file mode 100644 index 00000000000..363a370da15 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/placeholder.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/premiumvodka.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/premiumvodka.png new file mode 100644 index 00000000000..5fb9ab4ac45 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/premiumvodka.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/premiumwine.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/premiumwine.png new file mode 100644 index 00000000000..11757f12ea7 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/premiumwine.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/prosecco.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/prosecco.png new file mode 100644 index 00000000000..1afd6884085 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/prosecco.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/purple_can.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/purple_can.png new file mode 100644 index 00000000000..813bf6fb6b8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/purple_can.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pwinebottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pwinebottle.png new file mode 100644 index 00000000000..e599e674562 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/pwinebottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/rag.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/rag.png new file mode 100644 index 00000000000..ecc4ef632be Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/rag.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/rag_lit.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/rag_lit.png new file mode 100644 index 00000000000..c8cabd143d1 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/rag_lit.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/rag_small.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/rag_small.png new file mode 100644 index 00000000000..6cb555eff29 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/rag_small.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/rag_small_lit.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/rag_small_lit.png new file mode 100644 index 00000000000..52fb5cd35f0 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/rag_small_lit.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/rakia.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/rakia.png new file mode 100644 index 00000000000..0b475a886e6 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/rakia.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/ramen.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/ramen.png new file mode 100644 index 00000000000..ec65d8e0c36 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/ramen.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/rumbottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/rumbottle.png new file mode 100644 index 00000000000..c3ecfd5dea4 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/rumbottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/sake.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/sake.png new file mode 100644 index 00000000000..fbdf0a5f83d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/sake.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/shaker.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/shaker.png new file mode 100644 index 00000000000..f80bfa55088 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/shaker.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/shinyflask.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/shinyflask.png new file mode 100644 index 00000000000..e6c9ef3f040 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/shinyflask.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/silver_cup.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/silver_cup.png new file mode 100644 index 00000000000..fd265bfa90d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/silver_cup.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/sodawater.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/sodawater.png new file mode 100644 index 00000000000..a0bfb5db36f Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/sodawater.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/soju.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/soju.png new file mode 100644 index 00000000000..cdb90f22ddc Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/soju.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/soymilk.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/soymilk.png new file mode 100644 index 00000000000..cb682adb7a3 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/soymilk.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/space-up.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/space-up.png new file mode 100644 index 00000000000..4a203dfd2d8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/space-up.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/space-up_bottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/space-up_bottle.png new file mode 100644 index 00000000000..f4194bd385c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/space-up_bottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/space_mountain_wind.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/space_mountain_wind.png new file mode 100644 index 00000000000..37be9f854b5 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/space_mountain_wind.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/space_mountain_wind_bottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/space_mountain_wind_bottle.png new file mode 100644 index 00000000000..8e9c63d430b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/space_mountain_wind_bottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/starkist.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/starkist.png new file mode 100644 index 00000000000..df57ecaac70 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/starkist.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/syndi_cola.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/syndi_cola.png new file mode 100644 index 00000000000..0e435719282 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/syndi_cola.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/syndi_cola_x.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/syndi_cola_x.png new file mode 100644 index 00000000000..1d40de5d280 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/syndi_cola_x.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/tadmorwine.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/tadmorwine.png new file mode 100644 index 00000000000..ba89b690683 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/tadmorwine.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/teapot.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/teapot.png new file mode 100644 index 00000000000..a59f755776e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/teapot.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/tequillabottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/tequillabottle.png new file mode 100644 index 00000000000..9a50365259a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/tequillabottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/thirteen_loko.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/thirteen_loko.png new file mode 100644 index 00000000000..bf867f76efd Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/thirteen_loko.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/thoom.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/thoom.png new file mode 100644 index 00000000000..f882275a497 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/thoom.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/tomatojuice.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/tomatojuice.png new file mode 100644 index 00000000000..ba0e0ca2a12 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/tomatojuice.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/tonic.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/tonic.png new file mode 100644 index 00000000000..cf4ebdf3c6a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/tonic.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/vacuumflask.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/vacuumflask.png new file mode 100644 index 00000000000..0e524de5e03 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/vacuumflask.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/vcola.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/vcola.png new file mode 100644 index 00000000000..fbb5677b562 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/vcola.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/vermouthbottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/vermouthbottle.png new file mode 100644 index 00000000000..204e361ee60 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/vermouthbottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/vodkabottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/vodkabottle.png new file mode 100644 index 00000000000..0e379bf8fa0 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/vodkabottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/water.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/water.png new file mode 100644 index 00000000000..f432c9abbd4 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/water.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/water_cup.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/water_cup.png new file mode 100644 index 00000000000..0c9e03fd088 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/water_cup.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/water_cup_e.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/water_cup_e.png new file mode 100644 index 00000000000..a72dab7a442 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/water_cup_e.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/waterbottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/waterbottle.png new file mode 100644 index 00000000000..cfb23ef4015 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/waterbottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/whiskeybottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/whiskeybottle.png new file mode 100644 index 00000000000..67a40d0c5fb Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/whiskeybottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/whiskeybottle2.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/whiskeybottle2.png new file mode 100644 index 00000000000..9d1f9144358 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/whiskeybottle2.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/whiskeybottle3.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/whiskeybottle3.png new file mode 100644 index 00000000000..1aff1529838 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/whiskeybottle3.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/winebottle.png b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/winebottle.png new file mode 100644 index 00000000000..b858642493c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/bay_drinks.rsi/winebottle.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/milkmini.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/milkmini.rsi/icon.png new file mode 100644 index 00000000000..80d054ff0d2 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/milkmini.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/milkmini.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/milkmini.rsi/icon_open.png new file mode 100644 index 00000000000..80d054ff0d2 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/milkmini.rsi/icon_open.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/milkmini.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/milkmini.rsi/meta.json new file mode 100644 index 00000000000..f2e5a45e978 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/milkmini.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from baystation at commit https://github.com/Baystation12/Baystation12/commit/464342c5dc8c417b7e79d56c69aa30445bdf3b75", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Drinks/milkminichoco.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/milkminichoco.rsi/icon.png new file mode 100644 index 00000000000..75617ad3ab1 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/milkminichoco.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/milkminichoco.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/milkminichoco.rsi/icon_open.png new file mode 100644 index 00000000000..75617ad3ab1 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/milkminichoco.rsi/icon_open.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/milkminichoco.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/milkminichoco.rsi/meta.json new file mode 100644 index 00000000000..f2e5a45e978 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/milkminichoco.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from baystation at commit https://github.com/Baystation12/Baystation12/commit/464342c5dc8c417b7e79d56c69aa30445bdf3b75", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup10.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup10.png new file mode 100644 index 00000000000..d8daeeb8b12 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup10.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup100.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup100.png new file mode 100644 index 00000000000..bdd50023f68 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup100.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup20.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup20.png new file mode 100644 index 00000000000..5b51586cae8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup20.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup30.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup30.png new file mode 100644 index 00000000000..0d90159b4ba Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup30.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup40.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup40.png new file mode 100644 index 00000000000..d22bc1a98db Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup40.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup50.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup50.png new file mode 100644 index 00000000000..f30dac42708 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup50.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup60.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup60.png new file mode 100644 index 00000000000..4af868b8f08 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup60.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup70.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup70.png new file mode 100644 index 00000000000..a4cd283d299 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup70.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup80.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup80.png new file mode 100644 index 00000000000..329e6aee39b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup80.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup90.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup90.png new file mode 100644 index 00000000000..2d0cfe55241 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/fitness-cup90.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/icon.png new file mode 100644 index 00000000000..f86defc451e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/icon_empty.png new file mode 100644 index 00000000000..f86defc451e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/icon_empty.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/icon_open.png new file mode 100644 index 00000000000..f86defc451e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/icon_open.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/meta.json new file mode 100644 index 00000000000..76bf0dac4e1 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/shakerblack.rsi/meta.json @@ -0,0 +1,50 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from baystation at commit https://github.com/Baystation12/Baystation12/commit/464342c5dc8c417b7e79d56c69aa30445bdf3b75", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + }, + { + "name": "icon_empty" + }, + { + "name": "fitness-cup10" + }, + { + "name": "fitness-cup20" + }, + { + "name": "fitness-cup30" + }, + { + "name": "fitness-cup40" + }, + { + "name": "fitness-cup50" + }, + { + "name": "fitness-cup60" + }, + { + "name": "fitness-cup70" + }, + { + "name": "fitness-cup80" + }, + { + "name": "fitness-cup90" + }, + { + "name": "fitness-cup100" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup10.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup10.png new file mode 100644 index 00000000000..d8daeeb8b12 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup10.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup100.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup100.png new file mode 100644 index 00000000000..bdd50023f68 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup100.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup20.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup20.png new file mode 100644 index 00000000000..5b51586cae8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup20.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup30.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup30.png new file mode 100644 index 00000000000..0d90159b4ba Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup30.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup40.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup40.png new file mode 100644 index 00000000000..d22bc1a98db Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup40.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup50.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup50.png new file mode 100644 index 00000000000..f30dac42708 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup50.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup60.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup60.png new file mode 100644 index 00000000000..4af868b8f08 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup60.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup70.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup70.png new file mode 100644 index 00000000000..a4cd283d299 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup70.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup80.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup80.png new file mode 100644 index 00000000000..329e6aee39b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup80.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup90.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup90.png new file mode 100644 index 00000000000..2d0cfe55241 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/fitness-cup90.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/icon.png new file mode 100644 index 00000000000..e96763af972 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/icon_empty.png new file mode 100644 index 00000000000..e96763af972 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/icon_empty.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/icon_open.png new file mode 100644 index 00000000000..e96763af972 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/icon_open.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/meta.json new file mode 100644 index 00000000000..76bf0dac4e1 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/shakerblue.rsi/meta.json @@ -0,0 +1,50 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from baystation at commit https://github.com/Baystation12/Baystation12/commit/464342c5dc8c417b7e79d56c69aa30445bdf3b75", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + }, + { + "name": "icon_empty" + }, + { + "name": "fitness-cup10" + }, + { + "name": "fitness-cup20" + }, + { + "name": "fitness-cup30" + }, + { + "name": "fitness-cup40" + }, + { + "name": "fitness-cup50" + }, + { + "name": "fitness-cup60" + }, + { + "name": "fitness-cup70" + }, + { + "name": "fitness-cup80" + }, + { + "name": "fitness-cup90" + }, + { + "name": "fitness-cup100" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup10.png b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup10.png new file mode 100644 index 00000000000..d8daeeb8b12 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup10.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup100.png b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup100.png new file mode 100644 index 00000000000..bdd50023f68 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup100.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup20.png b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup20.png new file mode 100644 index 00000000000..5b51586cae8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup20.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup30.png b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup30.png new file mode 100644 index 00000000000..0d90159b4ba Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup30.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup40.png b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup40.png new file mode 100644 index 00000000000..d22bc1a98db Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup40.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup50.png b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup50.png new file mode 100644 index 00000000000..f30dac42708 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup50.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup60.png b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup60.png new file mode 100644 index 00000000000..4af868b8f08 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup60.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup70.png b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup70.png new file mode 100644 index 00000000000..a4cd283d299 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup70.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup80.png b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup80.png new file mode 100644 index 00000000000..329e6aee39b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup80.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup90.png b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup90.png new file mode 100644 index 00000000000..2d0cfe55241 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/fitness-cup90.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/icon.png new file mode 100644 index 00000000000..11551c2294a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/icon_empty.png new file mode 100644 index 00000000000..11551c2294a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/icon_empty.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/icon_open.png new file mode 100644 index 00000000000..11551c2294a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/icon_open.png differ diff --git a/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/meta.json new file mode 100644 index 00000000000..76bf0dac4e1 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/shakerred.rsi/meta.json @@ -0,0 +1,50 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from baystation at commit https://github.com/Baystation12/Baystation12/commit/464342c5dc8c417b7e79d56c69aa30445bdf3b75", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + }, + { + "name": "icon_empty" + }, + { + "name": "fitness-cup10" + }, + { + "name": "fitness-cup20" + }, + { + "name": "fitness-cup30" + }, + { + "name": "fitness-cup40" + }, + { + "name": "fitness-cup50" + }, + { + "name": "fitness-cup60" + }, + { + "name": "fitness-cup70" + }, + { + "name": "fitness-cup80" + }, + { + "name": "fitness-cup90" + }, + { + "name": "fitness-cup100" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/0box-donut1.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/0box-donut1.png new file mode 100644 index 00000000000..d64ebb9feab Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/0box-donut1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/0box-donut_chaos.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/0box-donut_chaos.png new file mode 100644 index 00000000000..0c2e7a5a3b8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/0box-donut_chaos.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/1box-donut1.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/1box-donut1.png new file mode 100644 index 00000000000..d2a6d0e8d27 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/1box-donut1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/1box-donut_chaos.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/1box-donut_chaos.png new file mode 100644 index 00000000000..a03c46d3280 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/1box-donut_chaos.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/2box-donut1.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/2box-donut1.png new file mode 100644 index 00000000000..f7dcf01d914 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/2box-donut1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/2box-donut_chaos.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/2box-donut_chaos.png new file mode 100644 index 00000000000..614623b978b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/2box-donut_chaos.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/3box-donut1.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/3box-donut1.png new file mode 100644 index 00000000000..be75157d5c3 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/3box-donut1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/3box-donut_chaos.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/3box-donut_chaos.png new file mode 100644 index 00000000000..e7a0ab88f41 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/3box-donut_chaos.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/4box-donut1.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/4box-donut1.png new file mode 100644 index 00000000000..9f5bfffb97b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/4box-donut1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/4box-donut_chaos.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/4box-donut_chaos.png new file mode 100644 index 00000000000..a8a0ef5ed85 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/4box-donut_chaos.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/4no_raisins.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/4no_raisins.png new file mode 100644 index 00000000000..eeec931923c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/4no_raisins.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/5box-donut1.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/5box-donut1.png new file mode 100644 index 00000000000..d806d7cf064 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/5box-donut1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/5box-donut_chaos.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/5box-donut_chaos.png new file mode 100644 index 00000000000..f05af23b4d3 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/5box-donut_chaos.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/6box-donut1.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/6box-donut1.png new file mode 100644 index 00000000000..4c59d3a28cc Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/6box-donut1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/6box-donut_chaos.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/6box-donut_chaos.png new file mode 100644 index 00000000000..4c59d3a28cc Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/6box-donut_chaos.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/aesirsalad.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/aesirsalad.png new file mode 100644 index 00000000000..468475995b6 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/aesirsalad.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/aghrassh-cake.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/aghrassh-cake.png new file mode 100644 index 00000000000..4abc0f2b3ff Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/aghrassh-cake.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/amanita_pie.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/amanita_pie.png new file mode 100644 index 00000000000..3c507593080 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/amanita_pie.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/amanitajelly.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/amanitajelly.png new file mode 100644 index 00000000000..4f3fc019473 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/amanitajelly.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ancient_burger.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ancient_burger.png new file mode 100644 index 00000000000..affb0cc2d9c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ancient_burger.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ancient_fries.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ancient_fries.png new file mode 100644 index 00000000000..4999db34959 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ancient_fries.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ancient_hburger.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ancient_hburger.png new file mode 100644 index 00000000000..fe305bd8487 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ancient_hburger.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ancient_hotdog.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ancient_hotdog.png new file mode 100644 index 00000000000..e82cbbe8f8a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ancient_hotdog.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ancient_pizza.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ancient_pizza.png new file mode 100644 index 00000000000..a921f7d58e7 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ancient_pizza.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ancient_taco.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ancient_taco.png new file mode 100644 index 00000000000..a75eec5d760 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ancient_taco.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/applecake.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/applecake.png new file mode 100644 index 00000000000..06a22353265 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/applecake.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/applecakeslice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/applecakeslice.png new file mode 100644 index 00000000000..a575f23eafc Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/applecakeslice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/applepie.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/applepie.png new file mode 100644 index 00000000000..e225797ec81 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/applepie.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bacon.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bacon.png new file mode 100644 index 00000000000..4de5c439d19 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bacon.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/badrecipe.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/badrecipe.png new file mode 100644 index 00000000000..acd740c0172 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/badrecipe.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/baguette.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/baguette.png new file mode 100644 index 00000000000..91de73aedb0 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/baguette.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bananabread.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bananabread.png new file mode 100644 index 00000000000..5d2ebb4c0d1 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bananabread.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bananabreadslice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bananabreadslice.png new file mode 100644 index 00000000000..6f4926bbe2b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bananabreadslice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/barbecue.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/barbecue.png new file mode 100644 index 00000000000..1f1d04f9be3 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/barbecue.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bearmeat.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bearmeat.png new file mode 100644 index 00000000000..7c02703f2f7 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bearmeat.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/beetsoup.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/beetsoup.png new file mode 100644 index 00000000000..211e4533505 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/beetsoup.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/berryclafoutis.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/berryclafoutis.png new file mode 100644 index 00000000000..9192b395308 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/berryclafoutis.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bigbiteburger.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bigbiteburger.png new file mode 100644 index 00000000000..c12c04fe7af Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bigbiteburger.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/birdmeat.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/birdmeat.png new file mode 100644 index 00000000000..e78fdc5cdfb Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/birdmeat.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/birdsteak.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/birdsteak.png new file mode 100644 index 00000000000..a23a344b25e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/birdsteak.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/birthdaycake.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/birthdaycake.png new file mode 100644 index 00000000000..0f8d99283bc Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/birthdaycake.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/birthdaycakeslice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/birthdaycakeslice.png new file mode 100644 index 00000000000..f35a08a88ef Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/birthdaycakeslice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/biscotti.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/biscotti.png new file mode 100644 index 00000000000..7fb83946b16 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/biscotti.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bisque.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bisque.png new file mode 100644 index 00000000000..afeaca4c158 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bisque.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/boiledrice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/boiledrice.png new file mode 100644 index 00000000000..c1c843d3973 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/boiledrice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/boiledslimecore.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/boiledslimecore.png new file mode 100644 index 00000000000..b2d7dec77a8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/boiledslimecore.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/brainburger.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/brainburger.png new file mode 100644 index 00000000000..bfd085ef04d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/brainburger.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/braincake.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/braincake.png new file mode 100644 index 00000000000..33a25e5224d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/braincake.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/braincakeslice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/braincakeslice.png new file mode 100644 index 00000000000..35018c29915 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/braincakeslice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bread.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bread.png new file mode 100644 index 00000000000..fb15a90af9d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bread.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/breadslice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/breadslice.png new file mode 100644 index 00000000000..d9b8c0d175c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/breadslice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bunbun.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bunbun.png new file mode 100644 index 00000000000..c7a0956c48c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/bunbun.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/candiedapple.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/candiedapple.png new file mode 100644 index 00000000000..103e99c5159 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/candiedapple.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/candy.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/candy.png new file mode 100644 index 00000000000..13ba51c2106 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/candy.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/candy_corn.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/candy_corn.png new file mode 100644 index 00000000000..434e26b8419 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/candy_corn.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/carrotcake.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/carrotcake.png new file mode 100644 index 00000000000..3d7dce86600 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/carrotcake.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/carrotcake_slice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/carrotcake_slice.png new file mode 100644 index 00000000000..947ff02ace7 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/carrotcake_slice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/carrotfries.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/carrotfries.png new file mode 100644 index 00000000000..adbc7db7776 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/carrotfries.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cereal_box.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cereal_box.png new file mode 100644 index 00000000000..bcb6251397e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cereal_box.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chawanmushi.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chawanmushi.png new file mode 100644 index 00000000000..696b4829455 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chawanmushi.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chazuke.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chazuke.png new file mode 100644 index 00000000000..f904d1e39a8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chazuke.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheeseburger.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheeseburger.png new file mode 100644 index 00000000000..2ae2d7e9b88 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheeseburger.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesecake.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesecake.png new file mode 100644 index 00000000000..5d829e712eb Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesecake.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesecake_slice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesecake_slice.png new file mode 100644 index 00000000000..23ef5075659 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesecake_slice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesewedge-blue.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesewedge-blue.png new file mode 100644 index 00000000000..f901ff881dd Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesewedge-blue.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesewedge-fresh.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesewedge-fresh.png new file mode 100644 index 00000000000..9f576c67661 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesewedge-fresh.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesewedge.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesewedge.png new file mode 100644 index 00000000000..ea0d1caa424 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesewedge.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesewheel-blue.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesewheel-blue.png new file mode 100644 index 00000000000..4200576f78b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesewheel-blue.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesewheel-fresh.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesewheel-fresh.png new file mode 100644 index 00000000000..b02d6406144 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesewheel-fresh.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesewheel.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesewheel.png new file mode 100644 index 00000000000..3b8562fd53d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesewheel.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesie_honkers.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesie_honkers.png new file mode 100644 index 00000000000..203f3e425e0 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesie_honkers.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesyfries.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesyfries.png new file mode 100644 index 00000000000..03f3fab988b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cheesyfries.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cherrypie.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cherrypie.png new file mode 100644 index 00000000000..374fcdd5fa5 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cherrypie.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chilied-eggs.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chilied-eggs.png new file mode 100644 index 00000000000..90edfe671cd Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chilied-eggs.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chips.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chips.png new file mode 100644 index 00000000000..bdf1b8dfcfa Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chips.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chocobanana.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chocobanana.png new file mode 100644 index 00000000000..ddc8217d596 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chocobanana.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chocolatebar.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chocolatebar.png new file mode 100644 index 00000000000..a3f308a6bf8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chocolatebar.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chocolatecake.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chocolatecake.png new file mode 100644 index 00000000000..96f3e700afe Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chocolatecake.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chocolatecake_slice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chocolatecake_slice.png new file mode 100644 index 00000000000..a0159511fcd Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chocolatecake_slice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chocolateegg.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chocolateegg.png new file mode 100644 index 00000000000..585ab525bb2 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/chocolateegg.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/clam-chowder.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/clam-chowder.png new file mode 100644 index 00000000000..5640186a573 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/clam-chowder.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/clownburger.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/clownburger.png new file mode 100644 index 00000000000..bc5f68c7841 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/clownburger.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/clownstears.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/clownstears.png new file mode 100644 index 00000000000..18464ccfb7e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/clownstears.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/coldchili.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/coldchili.png new file mode 100644 index 00000000000..4876b1c54d5 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/coldchili.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/coldsauce.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/coldsauce.png new file mode 100644 index 00000000000..b1519fd495b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/coldsauce.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cookie.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cookie.png new file mode 100644 index 00000000000..8296dc90792 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cookie.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/corpsecube.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/corpsecube.png new file mode 100644 index 00000000000..cb8caab9d0f Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/corpsecube.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crab-cakes.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crab-cakes.png new file mode 100644 index 00000000000..dbce817e995 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crab-cakes.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crab-dinner.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crab-dinner.png new file mode 100644 index 00000000000..a5d50136e16 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crab-dinner.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crab-rangoon.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crab-rangoon.png new file mode 100644 index 00000000000..777c97147e6 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crab-rangoon.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cracker.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cracker.png new file mode 100644 index 00000000000..b3801098114 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cracker.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag.png new file mode 100644 index 00000000000..b65dcfee049 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag0.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag0.png new file mode 100644 index 00000000000..55ae18d7c2e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag0.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag1.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag1.png new file mode 100644 index 00000000000..1fabbc5d5ff Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag2.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag2.png new file mode 100644 index 00000000000..4f97de5347a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag2.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag3.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag3.png new file mode 100644 index 00000000000..6650fe7d54a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag3.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag4.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag4.png new file mode 100644 index 00000000000..414345fed23 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag4.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag5.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag5.png new file mode 100644 index 00000000000..cc63a9afff0 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag5.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag6.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag6.png new file mode 100644 index 00000000000..6d80912eed6 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crackerbag6.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crayonmre.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crayonmre.png new file mode 100644 index 00000000000..0c9c3eb82eb Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crayonmre.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crayonmre1.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crayonmre1.png new file mode 100644 index 00000000000..4dcf57c6d1d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/crayonmre1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/creamcheesebread.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/creamcheesebread.png new file mode 100644 index 00000000000..ba3c8be02fe Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/creamcheesebread.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/creamcheesebreadslice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/creamcheesebreadslice.png new file mode 100644 index 00000000000..938b2db4457 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/creamcheesebreadslice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/croutons.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/croutons.png new file mode 100644 index 00000000000..eb8d9152efd Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/croutons.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cubancarp.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cubancarp.png new file mode 100644 index 00000000000..6da7a461380 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/cubancarp.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/dango.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/dango.png new file mode 100644 index 00000000000..11b151dce29 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/dango.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/dionaroast.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/dionaroast.png new file mode 100644 index 00000000000..9403a6850b1 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/dionaroast.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/donkpocket.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/donkpocket.png new file mode 100644 index 00000000000..0c0e3d53492 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/donkpocket.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/donut1.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/donut1.png new file mode 100644 index 00000000000..87b2e60b86b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/donut1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/donut2.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/donut2.png new file mode 100644 index 00000000000..6be43be15db Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/donut2.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/donut_chaos.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/donut_chaos.png new file mode 100644 index 00000000000..2d4e51e32b8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/donut_chaos.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/donutbox.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/donutbox.png new file mode 100644 index 00000000000..08ca03e1f67 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/donutbox.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/driedfish.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/driedfish.png new file mode 100644 index 00000000000..fdc94a02b8e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/driedfish.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-blue.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-blue.png new file mode 100644 index 00000000000..525dddaa7ab Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-blue.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-green.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-green.png new file mode 100644 index 00000000000..20c77479df5 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-green.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-mime.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-mime.png new file mode 100644 index 00000000000..a779609dbcf Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-mime.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-orange.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-orange.png new file mode 100644 index 00000000000..8d80b7e2ffb Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-orange.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-purple.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-purple.png new file mode 100644 index 00000000000..5553e98193f Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-purple.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-rainbow.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-rainbow.png new file mode 100644 index 00000000000..b65ef5b9d55 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-rainbow.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-red.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-red.png new file mode 100644 index 00000000000..db17aded90c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-red.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-yellow.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-yellow.png new file mode 100644 index 00000000000..becbac7b4c4 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg-yellow.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg.png new file mode 100644 index 00000000000..4e4684e1b2d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/egg.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox.png new file mode 100644 index 00000000000..19f7a3fa4ce Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox0.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox0.png new file mode 100644 index 00000000000..6b9ea775e55 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox0.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox1.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox1.png new file mode 100644 index 00000000000..f21813468e3 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox10.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox10.png new file mode 100644 index 00000000000..587440479ae Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox10.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox11.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox11.png new file mode 100644 index 00000000000..87ff736c894 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox11.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox12.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox12.png new file mode 100644 index 00000000000..3522ca71e8c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox12.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox2.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox2.png new file mode 100644 index 00000000000..9c13a11bdbc Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox2.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox3.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox3.png new file mode 100644 index 00000000000..53906bc57b1 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox3.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox4.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox4.png new file mode 100644 index 00000000000..0f2b42a1f37 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox4.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox5.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox5.png new file mode 100644 index 00000000000..d5ef4c1ef49 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox5.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox6.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox6.png new file mode 100644 index 00000000000..ab4770a953b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox6.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox7.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox7.png new file mode 100644 index 00000000000..a44b1c08028 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox7.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox8.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox8.png new file mode 100644 index 00000000000..9393d8afad3 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox8.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox9.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox9.png new file mode 100644 index 00000000000..ba039da54f2 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggbox9.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggplantparm.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggplantparm.png new file mode 100644 index 00000000000..5378d48a6ca Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/eggplantparm.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/emptycondiment.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/emptycondiment.png new file mode 100644 index 00000000000..226a6be461b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/emptycondiment.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/enchiladas.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/enchiladas.png new file mode 100644 index 00000000000..acab1bf72f7 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/enchiladas.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/enzyme.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/enzyme.png new file mode 100644 index 00000000000..c00aa17b699 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/enzyme.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fishandchips.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fishandchips.png new file mode 100644 index 00000000000..364737b59b5 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fishandchips.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fishburger.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fishburger.png new file mode 100644 index 00000000000..46139e21f31 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fishburger.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fishfillet.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fishfillet.png new file mode 100644 index 00000000000..8b6aafeba4f Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fishfillet.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fishfingers.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fishfingers.png new file mode 100644 index 00000000000..a607ae660ac Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fishfingers.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/flour.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/flour.png new file mode 100644 index 00000000000..5f97bff67fd Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/flour.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fortune_cookie.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fortune_cookie.png new file mode 100644 index 00000000000..f092835b016 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fortune_cookie.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/friedegg.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/friedegg.png new file mode 100644 index 00000000000..8a9f9885bbb Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/friedegg.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fries.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fries.png new file mode 100644 index 00000000000..e20190c6ffa Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fries.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fruitpizza.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fruitpizza.png new file mode 100644 index 00000000000..32bd20271cf Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fruitpizza.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fruitpizzaslice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fruitpizzaslice.png new file mode 100644 index 00000000000..147ee3cc1d4 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/fruitpizzaslice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/gappletart.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/gappletart.png new file mode 100644 index 00000000000..897883a4b82 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/gappletart.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ghostburger.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ghostburger.png new file mode 100644 index 00000000000..edb9f701892 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ghostburger.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/gukhe-fish.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/gukhe-fish.png new file mode 100644 index 00000000000..d29fd2f9a29 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/gukhe-fish.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hatchling-surprise.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hatchling-surprise.png new file mode 100644 index 00000000000..fb2af2a11d5 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hatchling-surprise.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hburger.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hburger.png new file mode 100644 index 00000000000..e19475a9c6d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hburger.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/herbsalad.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/herbsalad.png new file mode 100644 index 00000000000..015b56c0129 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/herbsalad.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hotchili.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hotchili.png new file mode 100644 index 00000000000..3aa8ab0d4cf Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hotchili.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hotcorgi.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hotcorgi.png new file mode 100644 index 00000000000..ec064f5f7c6 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hotcorgi.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hotdog.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hotdog.png new file mode 100644 index 00000000000..06aa2c7881f Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hotdog.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hotsauce.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hotsauce.png new file mode 100644 index 00000000000..5f62c9ed0e0 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hotsauce.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hugemushroomslice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hugemushroomslice.png new file mode 100644 index 00000000000..11c3fd2c38b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/hugemushroomslice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_banana.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_banana.png new file mode 100644 index 00000000000..4ef529fe950 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_banana.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_blue.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_blue.png new file mode 100644 index 00000000000..56456ffed33 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_blue.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_cherry.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_cherry.png new file mode 100644 index 00000000000..c4bde3470fb Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_cherry.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_chocolate.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_chocolate.png new file mode 100644 index 00000000000..5b9532fcfba Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_chocolate.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_cone_chocolate.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_cone_chocolate.png new file mode 100644 index 00000000000..91fef3dadd4 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_cone_chocolate.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_cone_waffle.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_cone_waffle.png new file mode 100644 index 00000000000..6abac4789ff Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_cone_waffle.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_strawberry.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_strawberry.png new file mode 100644 index 00000000000..13f00165162 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_strawberry.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_vanilla.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_vanilla.png new file mode 100644 index 00000000000..48b576eb50b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/icecream_vanilla.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/jdonut1.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/jdonut1.png new file mode 100644 index 00000000000..e5f7755a6d4 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/jdonut1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/jdonut2.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/jdonut2.png new file mode 100644 index 00000000000..c558ad1a748 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/jdonut2.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/jellyburger.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/jellyburger.png new file mode 100644 index 00000000000..05b8471852e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/jellyburger.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/jellysandwich.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/jellysandwich.png new file mode 100644 index 00000000000..d319cc8792d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/jellysandwich.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/jellytoast.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/jellytoast.png new file mode 100644 index 00000000000..f04105f1cf8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/jellytoast.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/jupiter.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/jupiter.png new file mode 100644 index 00000000000..814e469b112 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/jupiter.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/kabob.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/kabob.png new file mode 100644 index 00000000000..0a531b167e3 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/kabob.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/katsu.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/katsu.png new file mode 100644 index 00000000000..9e274aa1d84 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/katsu.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ketchup.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ketchup.png new file mode 100644 index 00000000000..5e9cee52225 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ketchup.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/lemoncake.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/lemoncake.png new file mode 100644 index 00000000000..a448abd866f Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/lemoncake.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/lemoncake_slice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/lemoncake_slice.png new file mode 100644 index 00000000000..331a19a5d31 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/lemoncake_slice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/limecake.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/limecake.png new file mode 100644 index 00000000000..e3031e0c5b4 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/limecake.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/limecake_slice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/limecake_slice.png new file mode 100644 index 00000000000..4e79098c184 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/limecake_slice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/liquidfood.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/liquidfood.png new file mode 100644 index 00000000000..7f99b4975ef Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/liquidfood.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/lizard_egg.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/lizard_egg.png new file mode 100644 index 00000000000..908b9a6d5bf Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/lizard_egg.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/loadedbakedpotato.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/loadedbakedpotato.png new file mode 100644 index 00000000000..1841e582c46 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/loadedbakedpotato.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/lunacake.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/lunacake.png new file mode 100644 index 00000000000..bfcf3634874 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/lunacake.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/lunacake_wrapped.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/lunacake_wrapped.png new file mode 100644 index 00000000000..e62d46edbf8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/lunacake_wrapped.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mars.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mars.png new file mode 100644 index 00000000000..b2682cc25db Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mars.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mayo.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mayo.png new file mode 100644 index 00000000000..833f9be077c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mayo.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meat.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meat.png new file mode 100644 index 00000000000..e893a21ff71 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meat.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatball.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatball.png new file mode 100644 index 00000000000..b2ab65fa8bb Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatball.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatballsoup.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatballsoup.png new file mode 100644 index 00000000000..644ad1e2986 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatballsoup.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatballspagetti.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatballspagetti.png new file mode 100644 index 00000000000..d5807ca6db2 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatballspagetti.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatbread.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatbread.png new file mode 100644 index 00000000000..d2875dd29d7 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatbread.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatbreadslice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatbreadslice.png new file mode 100644 index 00000000000..f8a85479170 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatbreadslice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatcube.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatcube.png new file mode 100644 index 00000000000..6dbc37cc7a6 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatcube.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatmre.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatmre.png new file mode 100644 index 00000000000..6814a4412bf Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatmre.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatmre1.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatmre1.png new file mode 100644 index 00000000000..e29fe2a51ce Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatmre1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatpie.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatpie.png new file mode 100644 index 00000000000..872fbe61ec8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatpie.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatpizza.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatpizza.png new file mode 100644 index 00000000000..ad60b7fc5c8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatpizza.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatpizzaslice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatpizzaslice.png new file mode 100644 index 00000000000..4f6f749d500 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatpizzaslice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatsteak.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatsteak.png new file mode 100644 index 00000000000..11ec2c66038 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meatsteak.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meta.json new file mode 100644 index 00000000000..8140ad5affe --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/meta.json @@ -0,0 +1,1231 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation12 at https://github.com/Baystation12/Baystation12/blob/464342c5dc8c417b7e79d56c69aa30445bdf3b75/icons/obj/food/food.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "plaincake" + }, + { + "name": "cheesecake" + }, + { + "name": "chocolatecake" + }, + { + "name": "birthdaycake" + }, + { + "name": "applecake" + }, + { + "name": "orangecake" + }, + { + "name": "lemoncake" + }, + { + "name": "carrotcake" + }, + { + "name": "limecake" + }, + { + "name": "pumpkinpie" + }, + { + "name": "braincake" + }, + { + "name": "plaincake_slice" + }, + { + "name": "cheesecake_slice" + }, + { + "name": "chocolatecake_slice" + }, + { + "name": "birthdaycakeslice" + }, + { + "name": "applecakeslice" + }, + { + "name": "orangecake_slice" + }, + { + "name": "lemoncake_slice" + }, + { + "name": "carrotcake_slice" + }, + { + "name": "limecake_slice" + }, + { + "name": "pumpkinpieslice" + }, + { + "name": "braincakeslice" + }, + { + "name": "pie" + }, + { + "name": "applepie" + }, + { + "name": "meatpie" + }, + { + "name": "cherrypie" + }, + { + "name": "xenomeatpie" + }, + { + "name": "waffles" + }, + { + "name": "soylent_green" + }, + { + "name": "soylent_yellow" + }, + { + "name": "rofflewaffles" + }, + { + "name": "bread" + }, + { + "name": "bananabread" + }, + { + "name": "creamcheesebread" + }, + { + "name": "meatbread" + }, + { + "name": "tofubread" + }, + { + "name": "xenomeatbread" + }, + { + "name": "breadslice" + }, + { + "name": "sandwich_top" + }, + { + "name": "bananabreadslice" + }, + { + "name": "creamcheesebreadslice" + }, + { + "name": "meatbreadslice" + }, + { + "name": "tofubreadslice" + }, + { + "name": "xenobreadslice" + }, + { + "name": "hburger" + }, + { + "name": "cheeseburger" + }, + { + "name": "xburger" + }, + { + "name": "brainburger" + }, + { + "name": "jellyburger" + }, + { + "name": "fishburger" + }, + { + "name": "tofuburger" + }, + { + "name": "ghostburger", + "delays": [ + [ + 0.1, + 0.08, + 0.060000002, + 0.05, + 0.04, + 0.04, + 0.07, + 0.1, + 0.13, + 0.11, + 0.089999996, + 0.07, + 0.05, + 0.060000002, + 0.07, + 0.08, + 0.1, + 0.120000005 + ] + ] + }, + { + "name": "spellburger" + }, + { + "name": "clownburger" + }, + { + "name": "mimeburger" + }, + { + "name": "roburger", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.4 + ] + ] + }, + { + "name": "bigbiteburger" + }, + { + "name": "superbiteburger" + }, + { + "name": "pizzamargherita" + }, + { + "name": "meatpizza" + }, + { + "name": "mushroompizza" + }, + { + "name": "vegetablepizza" + }, + { + "name": "fruitpizza" + }, + { + "name": "pizzamargheritaslice" + }, + { + "name": "meatpizzaslice" + }, + { + "name": "mushroompizzaslice" + }, + { + "name": "vegetablepizzaslice" + }, + { + "name": "fruitpizzaslice" + }, + { + "name": "cookie" + }, + { + "name": "phelmbiscuit" + }, + { + "name": "spagetti" + }, + { + "name": "spagettiboiled" + }, + { + "name": "meatballspagetti" + }, + { + "name": "pastatomato" + }, + { + "name": "spesslaw" + }, + { + "name": "stewedsoymeat" + }, + { + "name": "coldchili" + }, + { + "name": "hotchili" + }, + { + "name": "meatballsoup" + }, + { + "name": "onionsoup" + }, + { + "name": "nettlesoup" + }, + { + "name": "wishsoup" + }, + { + "name": "tomatosoup" + }, + { + "name": "vegetablesoup" + }, + { + "name": "clownstears" + }, + { + "name": "mushroomsoup" + }, + { + "name": "mysterysoup", + "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, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "herbsalad" + }, + { + "name": "aesirsalad" + }, + { + "name": "validsalad" + }, + { + "name": "donut1" + }, + { + "name": "donut2" + }, + { + "name": "jdonut1" + }, + { + "name": "jdonut2" + }, + { + "name": "donut_chaos", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "fries" + }, + { + "name": "cheesyfries" + }, + { + "name": "carrotfries" + }, + { + "name": "meatball" + }, + { + "name": "monkeycubebox" + }, + { + "name": "monkeycubewrap" + }, + { + "name": "monkeycube" + }, + { + "name": "egg" + }, + { + "name": "egg-purple" + }, + { + "name": "egg-blue" + }, + { + "name": "egg-red" + }, + { + "name": "egg-orange" + }, + { + "name": "egg-yellow" + }, + { + "name": "egg-green" + }, + { + "name": "egg-rainbow" + }, + { + "name": "egg-mime" + }, + { + "name": "chocolateegg" + }, + { + "name": "donkpocket" + }, + { + "name": "donutbox" + }, + { + "name": "eggbox5" + }, + { + "name": "eggbox1" + }, + { + "name": "eggbox2" + }, + { + "name": "eggbox3" + }, + { + "name": "eggbox4" + }, + { + "name": "eggbox11" + }, + { + "name": "eggbox6" + }, + { + "name": "eggbox7" + }, + { + "name": "eggbox8" + }, + { + "name": "eggbox9" + }, + { + "name": "eggbox10" + }, + { + "name": "eggbox12" + }, + { + "name": "eggbox0" + }, + { + "name": "eggbox" + }, + { + "name": "crackerbag6" + }, + { + "name": "crackerbag5" + }, + { + "name": "crackerbag4" + }, + { + "name": "crackerbag3" + }, + { + "name": "crackerbag2" + }, + { + "name": "crackerbag1" + }, + { + "name": "crackerbag0" + }, + { + "name": "crackerbag" + }, + { + "name": "tray" + }, + { + "name": "muffin" + }, + { + "name": "sugarsmall" + }, + { + "name": "liquidfood" + }, + { + "name": "tastybread" + }, + { + "name": "skrellsnacks" + }, + { + "name": "candy_corn" + }, + { + "name": "cubancarp" + }, + { + "name": "loadedbakedpotato" + }, + { + "name": "omelette" + }, + { + "name": "kabob" + }, + { + "name": "tofu" + }, + { + "name": "meat" + }, + { + "name": "rottenmeat", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 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": "xenomeat" + }, + { + "name": "birdmeat" + }, + { + "name": "birdsteak" + }, + { + "name": "popcorn" + }, + { + "name": "eggplantparm" + }, + { + "name": "fortune_cookie" + }, + { + "name": "berryclafoutis" + }, + { + "name": "badrecipe" + }, + { + "name": "meatsteak" + }, + { + "name": "spacylibertyduff", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "amanitajelly", + "delays": [ + [ + 5, + 0.1, + 0.1, + 0.1, + 0.1, + 1 + ] + ] + }, + { + "name": "poppypretzel" + }, + { + "name": "bacon" + }, + { + "name": "rawbacon" + }, + { + "name": "plump_pie" + }, + { + "name": "amanita_pie" + }, + { + "name": "bearmeat" + }, + { + "name": "enchiladas" + }, + { + "name": "monkeysdelight" + }, + { + "name": "baguette" + }, + { + "name": "fishandchips" + }, + { + "name": "sandwich_filling" + }, + { + "name": "sandwich" + }, + { + "name": "toastedsandwich" + }, + { + "name": "stew" + }, + { + "name": "jellytoast" + }, + { + "name": "milosoup" + }, + { + "name": "soydope" + }, + { + "name": "watermelonslice" + }, + { + "name": "candiedapple" + }, + { + "name": "chocolatebar" + }, + { + "name": "hugemushroomslice" + }, + { + "name": "tomatomeat" + }, + { + "name": "jellysandwich" + }, + { + "name": "boiledslimecore" + }, + { + "name": "twobread" + }, + { + "name": "sausage" + }, + { + "name": "fishfingers" + }, + { + "name": "friedegg" + }, + { + "name": "mint" + }, + { + "name": "chawanmushi" + }, + { + "name": "beetsoup" + }, + { + "name": "gappletart" + }, + { + "name": "pizzabox1" + }, + { + "name": "pizzabox_messy" + }, + { + "name": "pizzabox_open" + }, + { + "name": "pizzabox4" + }, + { + "name": "pizzabox2" + }, + { + "name": "pizzabox3" + }, + { + "name": "pizzabox_tag" + }, + { + "name": "pizzabox5" + }, + { + "name": "cracker" + }, + { + "name": "boiledrice" + }, + { + "name": "rpudding" + }, + { + "name": "tofurkey" + }, + { + "name": "stuffing" + }, + { + "name": "dionaroast" + }, + { + "name": "taco" + }, + { + "name": "hotdog" + }, + { + "name": "0box-donut1" + }, + { + "name": "0box-donut_chaos", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "1box-donut1" + }, + { + "name": "1box-donut_chaos", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "2box-donut1" + }, + { + "name": "2box-donut_chaos", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "3box-donut1" + }, + { + "name": "3box-donut_chaos", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "4box-donut1" + }, + { + "name": "4box-donut_chaos", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "5box-donut1" + }, + { + "name": "5box-donut_chaos", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "6box-donut1" + }, + { + "name": "6box-donut_chaos" + }, + { + "name": "icecream_cone_waffle" + }, + { + "name": "icecream_cone_chocolate" + }, + { + "name": "icecream_vanilla" + }, + { + "name": "icecream_strawberry" + }, + { + "name": "icecream_blue" + }, + { + "name": "icecream_chocolate" + }, + { + "name": "bunbun" + }, + { + "name": "barbecue" + }, + { + "name": "threebread" + }, + { + "name": "pancakes" + }, + { + "name": "icecream_cherry" + }, + { + "name": "icecream_banana" + }, + { + "name": "hotcorgi" + }, + { + "name": "onionrings" + }, + { + "name": "flour" + }, + { + "name": "emptycondiment" + }, + { + "name": "mixedcondiments" + }, + { + "name": "enzyme" + }, + { + "name": "hotsauce" + }, + { + "name": "ketchup" + }, + { + "name": "soysauce" + }, + { + "name": "mayo" + }, + { + "name": "vinegar" + }, + { + "name": "saltshakersmall" + }, + { + "name": "peppermillsmall" + }, + { + "name": "coldsauce" + }, + { + "name": "cereal_box" + }, + { + "name": "chips" + }, + { + "name": "proteinbar" + }, + { + "name": "sosjerky" + }, + { + "name": "4no_raisins" + }, + { + "name": "space_twinkie" + }, + { + "name": "syndi_cakes" + }, + { + "name": "cheesie_honkers" + }, + { + "name": "salt" + }, + { + "name": "nanopasta", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "ancient_hotdog" + }, + { + "name": "ancient_fries" + }, + { + "name": "ancient_pizza" + }, + { + "name": "ancient_burger" + }, + { + "name": "ancient_taco" + }, + { + "name": "ancient_hburger" + }, + { + "name": "pistachios" + }, + { + "name": "semki" + }, + { + "name": "salo" + }, + { + "name": "driedfish" + }, + { + "name": "squid" + }, + { + "name": "croutons" + }, + { + "name": "lizard_egg" + }, + { + "name": "mre" + }, + { + "name": "mre1" + }, + { + "name": "vegmre" + }, + { + "name": "vegmre1" + }, + { + "name": "meatmre" + }, + { + "name": "meatmre1" + }, + { + "name": "meatcube" + }, + { + "name": "spiderleg" + }, + { + "name": "spiderleg_c" + }, + { + "name": "pouch_small1" + }, + { + "name": "packet_medium" + }, + { + "name": "katsu" + }, + { + "name": "crayonmre1" + }, + { + "name": "crayonmre" + }, + { + "name": "packet_small_white" + }, + { + "name": "packet_small_red" + }, + { + "name": "pouch_medium" + }, + { + "name": "packet_small_black" + }, + { + "name": "pouch_small" + }, + { + "name": "packet_small" + }, + { + "name": "pouch_medium1" + }, + { + "name": "chazuke" + }, + { + "name": "jupiter" + }, + { + "name": "lunacake" + }, + { + "name": "tidegobs" + }, + { + "name": "saturno" + }, + { + "name": "pluto" + }, + { + "name": "mooncake_wrapped" + }, + { + "name": "mochicake_wrapped" + }, + { + "name": "lunacake_wrapped" + }, + { + "name": "venus" + }, + { + "name": "oort" + }, + { + "name": "mars" + }, + { + "name": "ricecake" + }, + { + "name": "dango" + }, + { + "name": "pokeys" + }, + { + "name": "weebonuts" + }, + { + "name": "chocobanana" + }, + { + "name": "candy" + }, + { + "name": "oliveoilsmall" + }, + { + "name": "fishfillet" + }, + { + "name": "cheesewheel" + }, + { + "name": "cheesewedge" + }, + { + "name": "cheesewheel-fresh" + }, + { + "name": "cheesewedge-fresh" + }, + { + "name": "cheesewheel-blue" + }, + { + "name": "cheesewedge-blue" + }, + { + "name": "chilied-eggs" + }, + { + "name": "hatchling-surprise" + }, + { + "name": "red-sun-special" + }, + { + "name": "sea-delight" + }, + { + "name": "stok-skewers" + }, + { + "name": "gukhe-fish" + }, + { + "name": "aghrassh-cake" + }, + { + "name": "clam-chowder" + }, + { + "name": "bisque" + }, + { + "name": "stuffed-clam" + }, + { + "name": "steamed-mussels" + }, + { + "name": "oysters-rockefeller" + }, + { + "name": "crab-cakes" + }, + { + "name": "crab-rangoon" + }, + { + "name": "crab-dinner" + }, + { + "name": "shrimp-cocktail" + }, + { + "name": "shrimp-tempura" + }, + { + "name": "seafood-paella" + }, + { + "name": "unscottiloaf" + }, + { + "name": "unscotti" + }, + { + "name": "biscotti" + }, + { + "name": "corpsecube" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/milosoup.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/milosoup.png new file mode 100644 index 00000000000..b69aa608abe Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/milosoup.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mimeburger.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mimeburger.png new file mode 100644 index 00000000000..41d7e913d78 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mimeburger.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mint.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mint.png new file mode 100644 index 00000000000..5f7cf405c14 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mint.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mixedcondiments.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mixedcondiments.png new file mode 100644 index 00000000000..afb10fe85de Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mixedcondiments.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mochicake_wrapped.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mochicake_wrapped.png new file mode 100644 index 00000000000..ef0cef23835 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mochicake_wrapped.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/monkeycube.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/monkeycube.png new file mode 100644 index 00000000000..1f1c979f2ee Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/monkeycube.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/monkeycubebox.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/monkeycubebox.png new file mode 100644 index 00000000000..9ca103d29ec Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/monkeycubebox.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/monkeycubewrap.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/monkeycubewrap.png new file mode 100644 index 00000000000..27a4019c6d9 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/monkeycubewrap.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/monkeysdelight.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/monkeysdelight.png new file mode 100644 index 00000000000..71e3184924c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/monkeysdelight.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mooncake_wrapped.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mooncake_wrapped.png new file mode 100644 index 00000000000..dc4a9ccce70 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mooncake_wrapped.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mre.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mre.png new file mode 100644 index 00000000000..b0ce8dfec25 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mre.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mre1.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mre1.png new file mode 100644 index 00000000000..aa1f249a7f1 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mre1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/muffin.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/muffin.png new file mode 100644 index 00000000000..5652b636dc4 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/muffin.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mushroompizza.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mushroompizza.png new file mode 100644 index 00000000000..a69b2cdfcf1 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mushroompizza.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mushroompizzaslice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mushroompizzaslice.png new file mode 100644 index 00000000000..a8f8a3a456c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mushroompizzaslice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mushroomsoup.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mushroomsoup.png new file mode 100644 index 00000000000..977f25e9c02 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mushroomsoup.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mysterysoup.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mysterysoup.png new file mode 100644 index 00000000000..b44508d276c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/mysterysoup.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/nanopasta.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/nanopasta.png new file mode 100644 index 00000000000..7c8c123a452 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/nanopasta.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/nettlesoup.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/nettlesoup.png new file mode 100644 index 00000000000..0aa01789894 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/nettlesoup.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/oliveoilsmall.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/oliveoilsmall.png new file mode 100644 index 00000000000..b29b4a8dd64 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/oliveoilsmall.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/omelette.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/omelette.png new file mode 100644 index 00000000000..348e0e1c9a1 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/omelette.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/onionrings.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/onionrings.png new file mode 100644 index 00000000000..6ea49d88531 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/onionrings.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/onionsoup.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/onionsoup.png new file mode 100644 index 00000000000..c19d4c0c999 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/onionsoup.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/oort.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/oort.png new file mode 100644 index 00000000000..48bf96b34bf Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/oort.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/orangecake.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/orangecake.png new file mode 100644 index 00000000000..adff03d692f Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/orangecake.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/orangecake_slice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/orangecake_slice.png new file mode 100644 index 00000000000..263b997c81a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/orangecake_slice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/oysters-rockefeller.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/oysters-rockefeller.png new file mode 100644 index 00000000000..2bb59721c37 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/oysters-rockefeller.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/packet_medium.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/packet_medium.png new file mode 100644 index 00000000000..3631a7e19a7 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/packet_medium.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/packet_small.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/packet_small.png new file mode 100644 index 00000000000..bfbf77d5274 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/packet_small.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/packet_small_black.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/packet_small_black.png new file mode 100644 index 00000000000..a807de43699 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/packet_small_black.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/packet_small_red.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/packet_small_red.png new file mode 100644 index 00000000000..744f8c54b8e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/packet_small_red.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/packet_small_white.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/packet_small_white.png new file mode 100644 index 00000000000..9840407ee0c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/packet_small_white.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pancakes.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pancakes.png new file mode 100644 index 00000000000..ee14dbe315b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pancakes.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pastatomato.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pastatomato.png new file mode 100644 index 00000000000..d049627f4c0 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pastatomato.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/peppermillsmall.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/peppermillsmall.png new file mode 100644 index 00000000000..3116ebff2d4 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/peppermillsmall.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/phelmbiscuit.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/phelmbiscuit.png new file mode 100644 index 00000000000..1921356bac6 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/phelmbiscuit.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pie.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pie.png new file mode 100644 index 00000000000..5f5a01c1353 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pie.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pistachios.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pistachios.png new file mode 100644 index 00000000000..57ef100b0f1 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pistachios.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox1.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox1.png new file mode 100644 index 00000000000..eaec5a90985 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox2.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox2.png new file mode 100644 index 00000000000..67b598002d6 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox2.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox3.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox3.png new file mode 100644 index 00000000000..0ffa6c8609f Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox3.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox4.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox4.png new file mode 100644 index 00000000000..31cb9cda18d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox4.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox5.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox5.png new file mode 100644 index 00000000000..d19c8e98013 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox5.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox_messy.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox_messy.png new file mode 100644 index 00000000000..e234f4b28ba Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox_messy.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox_open.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox_open.png new file mode 100644 index 00000000000..5ed171c85d8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox_open.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox_tag.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox_tag.png new file mode 100644 index 00000000000..20e2333400b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzabox_tag.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzamargherita.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzamargherita.png new file mode 100644 index 00000000000..8e6387bb23e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzamargherita.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzamargheritaslice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzamargheritaslice.png new file mode 100644 index 00000000000..c2d1c66266a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pizzamargheritaslice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/plaincake.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/plaincake.png new file mode 100644 index 00000000000..706b6ce452d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/plaincake.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/plaincake_slice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/plaincake_slice.png new file mode 100644 index 00000000000..7b5b57ec1de Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/plaincake_slice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/plump_pie.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/plump_pie.png new file mode 100644 index 00000000000..a2d689f11f6 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/plump_pie.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pluto.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pluto.png new file mode 100644 index 00000000000..51f572917f4 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pluto.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pokeys.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pokeys.png new file mode 100644 index 00000000000..6ed10e4ff74 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pokeys.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/popcorn.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/popcorn.png new file mode 100644 index 00000000000..56911cdb855 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/popcorn.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/poppypretzel.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/poppypretzel.png new file mode 100644 index 00000000000..14d5944783d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/poppypretzel.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pouch_medium.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pouch_medium.png new file mode 100644 index 00000000000..24807feb81f Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pouch_medium.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pouch_medium1.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pouch_medium1.png new file mode 100644 index 00000000000..bcc0ab654fc Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pouch_medium1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pouch_small.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pouch_small.png new file mode 100644 index 00000000000..8b54c4266d2 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pouch_small.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pouch_small1.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pouch_small1.png new file mode 100644 index 00000000000..04322ecedd2 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pouch_small1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/proteinbar.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/proteinbar.png new file mode 100644 index 00000000000..6b00cbf9d26 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/proteinbar.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pumpkinpie.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pumpkinpie.png new file mode 100644 index 00000000000..6f6faa6c656 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pumpkinpie.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pumpkinpieslice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pumpkinpieslice.png new file mode 100644 index 00000000000..2281c9d3001 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/pumpkinpieslice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/rawbacon.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/rawbacon.png new file mode 100644 index 00000000000..17c1003702b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/rawbacon.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/red-sun-special.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/red-sun-special.png new file mode 100644 index 00000000000..bbf29b0e7a3 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/red-sun-special.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ricecake.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ricecake.png new file mode 100644 index 00000000000..f276a7c838b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/ricecake.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/roburger.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/roburger.png new file mode 100644 index 00000000000..811f6865ba4 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/roburger.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/rofflewaffles.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/rofflewaffles.png new file mode 100644 index 00000000000..69ab3845548 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/rofflewaffles.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/rottenmeat.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/rottenmeat.png new file mode 100644 index 00000000000..00502cdf846 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/rottenmeat.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/rpudding.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/rpudding.png new file mode 100644 index 00000000000..6abcc52f813 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/rpudding.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/salo.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/salo.png new file mode 100644 index 00000000000..149c3ee706a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/salo.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/salt.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/salt.png new file mode 100644 index 00000000000..1f632b1d621 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/salt.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/saltshakersmall.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/saltshakersmall.png new file mode 100644 index 00000000000..d92e3aad05d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/saltshakersmall.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sandwich.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sandwich.png new file mode 100644 index 00000000000..433e39f3004 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sandwich.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sandwich_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sandwich_filling.png new file mode 100644 index 00000000000..3cba7fcbe39 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sandwich_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sandwich_top.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sandwich_top.png new file mode 100644 index 00000000000..b4fe2e4ac8a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sandwich_top.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/saturno.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/saturno.png new file mode 100644 index 00000000000..d99b721b4a0 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/saturno.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sausage.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sausage.png new file mode 100644 index 00000000000..bf6804318de Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sausage.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sea-delight.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sea-delight.png new file mode 100644 index 00000000000..4f23618f047 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sea-delight.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/seafood-paella.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/seafood-paella.png new file mode 100644 index 00000000000..e19922b132d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/seafood-paella.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/semki.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/semki.png new file mode 100644 index 00000000000..f1790565a04 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/semki.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/shrimp-cocktail.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/shrimp-cocktail.png new file mode 100644 index 00000000000..dd2a7678b84 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/shrimp-cocktail.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/shrimp-tempura.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/shrimp-tempura.png new file mode 100644 index 00000000000..8b7df660b3a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/shrimp-tempura.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/skrellsnacks.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/skrellsnacks.png new file mode 100644 index 00000000000..6b39f54e2d4 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/skrellsnacks.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sosjerky.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sosjerky.png new file mode 100644 index 00000000000..5cd71e2a57f Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sosjerky.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/soydope.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/soydope.png new file mode 100644 index 00000000000..e439a7e058b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/soydope.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/soylent_green.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/soylent_green.png new file mode 100644 index 00000000000..fecf1c978b4 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/soylent_green.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/soylent_yellow.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/soylent_yellow.png new file mode 100644 index 00000000000..5657b0b1a1c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/soylent_yellow.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/soysauce.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/soysauce.png new file mode 100644 index 00000000000..cba2acb6f73 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/soysauce.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/space_twinkie.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/space_twinkie.png new file mode 100644 index 00000000000..9850645121b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/space_twinkie.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spacylibertyduff.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spacylibertyduff.png new file mode 100644 index 00000000000..79f455ed2f9 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spacylibertyduff.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spagetti.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spagetti.png new file mode 100644 index 00000000000..c4add268251 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spagetti.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spagettiboiled.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spagettiboiled.png new file mode 100644 index 00000000000..0a7d64f616b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spagettiboiled.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spellburger.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spellburger.png new file mode 100644 index 00000000000..5a5c050f3a8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spellburger.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spesslaw.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spesslaw.png new file mode 100644 index 00000000000..69371c2b469 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spesslaw.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spiderleg.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spiderleg.png new file mode 100644 index 00000000000..5fc1d1550b8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spiderleg.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spiderleg_c.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spiderleg_c.png new file mode 100644 index 00000000000..91159e508f5 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/spiderleg_c.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/squid.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/squid.png new file mode 100644 index 00000000000..1b129363b08 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/squid.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/steamed-mussels.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/steamed-mussels.png new file mode 100644 index 00000000000..764eeb7e04f Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/steamed-mussels.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/stew.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/stew.png new file mode 100644 index 00000000000..74c5ebd858a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/stew.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/stewedsoymeat.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/stewedsoymeat.png new file mode 100644 index 00000000000..6d69305c52c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/stewedsoymeat.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/stok-skewers.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/stok-skewers.png new file mode 100644 index 00000000000..52c0c8e1a35 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/stok-skewers.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/stuffed-clam.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/stuffed-clam.png new file mode 100644 index 00000000000..f8d34475a8f Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/stuffed-clam.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/stuffing.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/stuffing.png new file mode 100644 index 00000000000..8c552d498b8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/stuffing.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sugarsmall.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sugarsmall.png new file mode 100644 index 00000000000..b9eb5904abd Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/sugarsmall.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/superbiteburger.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/superbiteburger.png new file mode 100644 index 00000000000..4aa6f13be10 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/superbiteburger.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/syndi_cakes.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/syndi_cakes.png new file mode 100644 index 00000000000..eac6bdfd9aa Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/syndi_cakes.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/taco.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/taco.png new file mode 100644 index 00000000000..e6f0ce26a7a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/taco.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tastybread.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tastybread.png new file mode 100644 index 00000000000..4c6e4d39f17 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tastybread.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/threebread.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/threebread.png new file mode 100644 index 00000000000..7902d44546f Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/threebread.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tidegobs.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tidegobs.png new file mode 100644 index 00000000000..24b8a1ff37a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tidegobs.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/toastedsandwich.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/toastedsandwich.png new file mode 100644 index 00000000000..94d7ede7de0 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/toastedsandwich.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tofu.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tofu.png new file mode 100644 index 00000000000..965e5c9166e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tofu.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tofubread.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tofubread.png new file mode 100644 index 00000000000..bd96096fcf7 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tofubread.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tofubreadslice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tofubreadslice.png new file mode 100644 index 00000000000..7d23b43bf59 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tofubreadslice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tofuburger.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tofuburger.png new file mode 100644 index 00000000000..b8132530169 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tofuburger.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tofurkey.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tofurkey.png new file mode 100644 index 00000000000..b0fb4acebe2 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tofurkey.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tomatomeat.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tomatomeat.png new file mode 100644 index 00000000000..efe887ed85d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tomatomeat.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tomatosoup.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tomatosoup.png new file mode 100644 index 00000000000..040b44338cc Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tomatosoup.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tray.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tray.png new file mode 100644 index 00000000000..a35d30ba178 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/tray.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/twobread.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/twobread.png new file mode 100644 index 00000000000..16efd87f91a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/twobread.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/unscotti.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/unscotti.png new file mode 100644 index 00000000000..8251d814e28 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/unscotti.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/unscottiloaf.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/unscottiloaf.png new file mode 100644 index 00000000000..955d679c7ca Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/unscottiloaf.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/validsalad.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/validsalad.png new file mode 100644 index 00000000000..86233b749bf Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/validsalad.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/vegetablepizza.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/vegetablepizza.png new file mode 100644 index 00000000000..68f8c5960ab Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/vegetablepizza.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/vegetablepizzaslice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/vegetablepizzaslice.png new file mode 100644 index 00000000000..1f78ff38b7b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/vegetablepizzaslice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/vegetablesoup.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/vegetablesoup.png new file mode 100644 index 00000000000..92a96de29a4 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/vegetablesoup.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/vegmre.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/vegmre.png new file mode 100644 index 00000000000..2b691e41891 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/vegmre.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/vegmre1.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/vegmre1.png new file mode 100644 index 00000000000..1f8b7e2c2de Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/vegmre1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/venus.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/venus.png new file mode 100644 index 00000000000..c3475ff88f1 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/venus.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/vinegar.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/vinegar.png new file mode 100644 index 00000000000..22e6418b61a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/vinegar.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/waffles.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/waffles.png new file mode 100644 index 00000000000..6d091468589 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/waffles.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/watermelonslice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/watermelonslice.png new file mode 100644 index 00000000000..40fb8710b78 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/watermelonslice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/weebonuts.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/weebonuts.png new file mode 100644 index 00000000000..782319e4c91 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/weebonuts.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/wishsoup.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/wishsoup.png new file mode 100644 index 00000000000..3239d6db3c0 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/wishsoup.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/xburger.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/xburger.png new file mode 100644 index 00000000000..e24047835f9 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/xburger.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/xenobreadslice.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/xenobreadslice.png new file mode 100644 index 00000000000..29926b182ec Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/xenobreadslice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/xenomeat.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/xenomeat.png new file mode 100644 index 00000000000..98687e584f8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/xenomeat.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/xenomeatbread.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/xenomeatbread.png new file mode 100644 index 00000000000..41bbe611647 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/xenomeatbread.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/xenomeatpie.png b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/xenomeatpie.png new file mode 100644 index 00000000000..963a8f6c078 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food.rsi/xenomeatpie.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/bacon.png b/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/bacon.png new file mode 100644 index 00000000000..5eb1a301062 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/bacon.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/box-open.png b/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/box-open.png new file mode 100644 index 00000000000..c2114de74f0 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/box-open.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/box.png b/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/box.png new file mode 100644 index 00000000000..3f1f0411ad8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/box.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/cutlet.png b/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/cutlet.png new file mode 100644 index 00000000000..08b40878fac Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/cutlet.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/meta.json new file mode 100644 index 00000000000..33e1ce3b05e --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/meta.json @@ -0,0 +1,29 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from baystation at commit https://github.com/Baystation12/Baystation12/commit/464342c5dc8c417b7e79d56c69aa30445bdf3b75", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "box" + }, + { + "name": "box-open" + }, + { + "name": "rawcutlet" + }, + { + "name": "cutlet" + }, + { + "name": "rawbacon" + }, + { + "name": "bacon" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/rawbacon.png b/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/rawbacon.png new file mode 100644 index 00000000000..610ea9518b3 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/rawbacon.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/rawcutlet.png b/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/rawcutlet.png new file mode 100644 index 00000000000..15a7a83e59e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_bugmeat.rsi/rawcutlet.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/beans-open.png b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/beans-open.png new file mode 100644 index 00000000000..4a4c0f6cb5e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/beans-open.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/beans.png b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/beans.png new file mode 100644 index 00000000000..16e13a16d5f Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/beans.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/beef-open.png b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/beef-open.png new file mode 100644 index 00000000000..02ff311aab3 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/beef-open.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/beef.png b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/beef.png new file mode 100644 index 00000000000..5751ae2322b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/beef.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/berries-open.png b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/berries-open.png new file mode 100644 index 00000000000..554aa3d6808 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/berries-open.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/berries.png b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/berries.png new file mode 100644 index 00000000000..4f6d6049a66 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/berries.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/blank-open.png b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/blank-open.png new file mode 100644 index 00000000000..127d3dff3a1 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/blank-open.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/blank.png b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/blank.png new file mode 100644 index 00000000000..bafce30f9c2 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/blank.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/carpeggs-open.png b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/carpeggs-open.png new file mode 100644 index 00000000000..c4b2c42727b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/carpeggs-open.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/carpeggs.png b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/carpeggs.png new file mode 100644 index 00000000000..78fc904f2da Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/carpeggs.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/fisheggs-open.png b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/fisheggs-open.png new file mode 100644 index 00000000000..7d2398a0b1f Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/fisheggs-open.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/fisheggs.png b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/fisheggs.png new file mode 100644 index 00000000000..bb424c94b1d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/fisheggs.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/meta.json new file mode 100644 index 00000000000..30e24696d02 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/meta.json @@ -0,0 +1,59 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from baystation at commit https://github.com/Baystation12/Baystation12/commit/464342c5dc8c417b7e79d56c69aa30445bdf3b75", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "blank" + }, + { + "name": "blank-open" + }, + { + "name": "beef" + }, + { + "name": "beef-open" + }, + { + "name": "beans" + }, + { + "name": "beans-open" + }, + { + "name": "tomato" + }, + { + "name": "tomato-open" + }, + { + "name": "spinach" + }, + { + "name": "spinach-open" + }, + { + "name": "berries" + }, + { + "name": "berries-open" + }, + { + "name": "fisheggs" + }, + { + "name": "fisheggs-open" + }, + { + "name": "carpeggs-open" + }, + { + "name": "carpeggs" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/spinach-open.png b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/spinach-open.png new file mode 100644 index 00000000000..b8f434a9f07 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/spinach-open.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/spinach.png b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/spinach.png new file mode 100644 index 00000000000..e3dd654dfb1 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/spinach.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/tomato-open.png b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/tomato-open.png new file mode 100644 index 00000000000..a5e3cd0f0e4 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/tomato-open.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/tomato.png b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/tomato.png new file mode 100644 index 00000000000..0fa6292879e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_canned.rsi/tomato.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/bar.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/bar.png new file mode 100644 index 00000000000..a3f308a6bf8 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/bar.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/bar_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/bar_filling.png new file mode 100644 index 00000000000..1ad190aa6eb Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/bar_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/breadcustom.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/breadcustom.png new file mode 100644 index 00000000000..2cbe405a6f3 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/breadcustom.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/breadcustom_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/breadcustom_filling.png new file mode 100644 index 00000000000..754bed77150 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/breadcustom_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/breadcustom_slice.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/breadcustom_slice.png new file mode 100644 index 00000000000..2e0134fbb6b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/breadcustom_slice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/breadcustom_slice_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/breadcustom_slice_filling.png new file mode 100644 index 00000000000..b6f917b4956 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/breadcustom_slice_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/cakecustom.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/cakecustom.png new file mode 100644 index 00000000000..10a87626a6e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/cakecustom.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/cakecustom_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/cakecustom_filling.png new file mode 100644 index 00000000000..a14d4a02239 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/cakecustom_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/cakecustom_slice.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/cakecustom_slice.png new file mode 100644 index 00000000000..5ab53b3e55b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/cakecustom_slice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/cakecustom_slice_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/cakecustom_slice_filling.png new file mode 100644 index 00000000000..a2697b47ad5 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/cakecustom_slice_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/cookie.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/cookie.png new file mode 100644 index 00000000000..8296dc90792 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/cookie.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/cookie_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/cookie_filling.png new file mode 100644 index 00000000000..e7228f5b672 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/cookie_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/customburger.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/customburger.png new file mode 100644 index 00000000000..197e3210c73 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/customburger.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/customburger_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/customburger_filling.png new file mode 100644 index 00000000000..afc2e4bad82 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/customburger_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/donk.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/donk.png new file mode 100644 index 00000000000..e6fe86ab5d7 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/donk.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/donk_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/donk_filling.png new file mode 100644 index 00000000000..92c6846211b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/donk_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/donut.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/donut.png new file mode 100644 index 00000000000..9c84ead6a74 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/donut.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/donut_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/donut_filling.png new file mode 100644 index 00000000000..c888986d2db Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/donut_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/jawbreaker.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/jawbreaker.png new file mode 100644 index 00000000000..f20dcba79bb Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/jawbreaker.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/jawbreaker_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/jawbreaker_filling.png new file mode 100644 index 00000000000..f20dcba79bb Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/jawbreaker_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/jellycustom.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/jellycustom.png new file mode 100644 index 00000000000..c389eb4348d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/jellycustom.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/jellycustom_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/jellycustom_filling.png new file mode 100644 index 00000000000..5402d7e1ad2 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/jellycustom_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/kabob.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/kabob.png new file mode 100644 index 00000000000..8ac16eb96ee Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/kabob.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/kabob_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/kabob_filling.png new file mode 100644 index 00000000000..c75c184a639 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/kabob_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/meta.json new file mode 100644 index 00000000000..fc56b7048e8 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/meta.json @@ -0,0 +1,152 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation12 at https://github.com/Baystation12/Baystation12/blob/464342c5dc8c417b7e79d56c69aa30445bdf3b75/icons/obj/food/food_custom.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "pizza" + }, + { + "name": "pizza_filling" + }, + { + "name": "pizza_slice" + }, + { + "name": "pizza_slice_filling" + }, + { + "name": "cakecustom" + }, + { + "name": "cakecustom_filling" + }, + { + "name": "cakecustom_slice" + }, + { + "name": "cakecustom_slice_filling" + }, + { + "name": "piecustom" + }, + { + "name": "piecustom_filling" + }, + { + "name": "breadcustom" + }, + { + "name": "breadcustom_filling" + }, + { + "name": "breadcustom_slice" + }, + { + "name": "breadcustom_slice_filling" + }, + { + "name": "kabob" + }, + { + "name": "kabob_filling" + }, + { + "name": "waffles" + }, + { + "name": "waffles_filling" + }, + { + "name": "cookie" + }, + { + "name": "cookie_filling" + }, + { + "name": "donut" + }, + { + "name": "donut_filling" + }, + { + "name": "donk" + }, + { + "name": "donk_filling" + }, + { + "name": "bar" + }, + { + "name": "bar_filling" + }, + { + "name": "sucker" + }, + { + "name": "sucker_filling" + }, + { + "name": "jellycustom_filling" + }, + { + "name": "jellycustom" + }, + { + "name": "jawbreaker" + }, + { + "name": "jawbreaker_filling" + }, + { + "name": "pancakescustom" + }, + { + "name": "pancakescustom_filling" + }, + { + "name": "stuffing" + }, + { + "name": "stuffing_filling" + }, + { + "name": "shreds" + }, + { + "name": "shreds_filling" + }, + { + "name": "stew" + }, + { + "name": "stew_filling" + }, + { + "name": "serving_bowl" + }, + { + "name": "serving_bowl_4" + }, + { + "name": "serving_bowl_3" + }, + { + "name": "serving_bowl_2" + }, + { + "name": "serving_bowl_1" + }, + { + "name": "customburger" + }, + { + "name": "customburger_filling" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/pancakescustom.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/pancakescustom.png new file mode 100644 index 00000000000..c2ec0f3dd55 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/pancakescustom.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/pancakescustom_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/pancakescustom_filling.png new file mode 100644 index 00000000000..ae776a1e340 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/pancakescustom_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/piecustom.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/piecustom.png new file mode 100644 index 00000000000..3b7eb5c1f8c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/piecustom.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/piecustom_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/piecustom_filling.png new file mode 100644 index 00000000000..d07c6ff6fb5 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/piecustom_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/pizza.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/pizza.png new file mode 100644 index 00000000000..5848355aefd Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/pizza.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/pizza_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/pizza_filling.png new file mode 100644 index 00000000000..3d7081c700c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/pizza_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/pizza_slice.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/pizza_slice.png new file mode 100644 index 00000000000..4b184d9e79e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/pizza_slice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/pizza_slice_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/pizza_slice_filling.png new file mode 100644 index 00000000000..2279b731343 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/pizza_slice_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/serving_bowl.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/serving_bowl.png new file mode 100644 index 00000000000..2abd8de27bc Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/serving_bowl.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/serving_bowl_1.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/serving_bowl_1.png new file mode 100644 index 00000000000..067d27e9175 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/serving_bowl_1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/serving_bowl_2.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/serving_bowl_2.png new file mode 100644 index 00000000000..d3a7364bf5b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/serving_bowl_2.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/serving_bowl_3.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/serving_bowl_3.png new file mode 100644 index 00000000000..4575764a351 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/serving_bowl_3.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/serving_bowl_4.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/serving_bowl_4.png new file mode 100644 index 00000000000..4a4abf75758 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/serving_bowl_4.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/shreds.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/shreds.png new file mode 100644 index 00000000000..f740bff24f4 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/shreds.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/shreds_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/shreds_filling.png new file mode 100644 index 00000000000..f740bff24f4 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/shreds_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/stew.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/stew.png new file mode 100644 index 00000000000..738ca978420 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/stew.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/stew_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/stew_filling.png new file mode 100644 index 00000000000..57c0667e4ff Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/stew_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/stuffing.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/stuffing.png new file mode 100644 index 00000000000..4dd597bb002 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/stuffing.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/stuffing_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/stuffing_filling.png new file mode 100644 index 00000000000..6047563638e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/stuffing_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/sucker.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/sucker.png new file mode 100644 index 00000000000..13379afc87e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/sucker.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/sucker_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/sucker_filling.png new file mode 100644 index 00000000000..4b524e5e5ef Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/sucker_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/waffles.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/waffles.png new file mode 100644 index 00000000000..6d091468589 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/waffles.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/waffles_filling.png b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/waffles_filling.png new file mode 100644 index 00000000000..6d1a340abf5 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_custom.rsi/waffles_filling.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/bun.png b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/bun.png new file mode 100644 index 00000000000..6927a0811a7 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/bun.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/cutlet.png b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/cutlet.png new file mode 100644 index 00000000000..82eca65c4cf Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/cutlet.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/dough.png b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/dough.png new file mode 100644 index 00000000000..a9d4c3b39ad Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/dough.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/doughslice.png b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/doughslice.png new file mode 100644 index 00000000000..9760276cfdf Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/doughslice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/egg.png b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/egg.png new file mode 100644 index 00000000000..4e4684e1b2d Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/egg.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/flat_dough.png b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/flat_dough.png new file mode 100644 index 00000000000..1fcc0e299d5 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/flat_dough.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/flatbread.png b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/flatbread.png new file mode 100644 index 00000000000..5a42d0dba07 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/flatbread.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/lizard_egg.png b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/lizard_egg.png new file mode 100644 index 00000000000..908b9a6d5bf Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/lizard_egg.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/meatball.png b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/meatball.png new file mode 100644 index 00000000000..b2ab65fa8bb Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/meatball.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/meta.json new file mode 100644 index 00000000000..e0633e80ced --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/meta.json @@ -0,0 +1,50 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from baystation at commit https://github.com/Baystation12/Baystation12/commit/464342c5dc8c417b7e79d56c69aa30445bdf3b75", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "dough" + }, + { + "name": "flat_dough" + }, + { + "name": "doughslice" + }, + { + "name": "rawcutlet" + }, + { + "name": "rawmeatball" + }, + { + "name": "egg" + }, + { + "name": "lizard_egg" + }, + { + "name": "bun" + }, + { + "name": "flatbread" + }, + { + "name": "cutlet" + }, + { + "name": "sausage" + }, + { + "name": "meatball" + }, + { + "name": "rawsticks" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/rawcutlet.png b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/rawcutlet.png new file mode 100644 index 00000000000..9329c230b38 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/rawcutlet.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/rawmeatball.png b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/rawmeatball.png new file mode 100644 index 00000000000..a7a4e7294a6 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/rawmeatball.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/rawsticks.png b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/rawsticks.png new file mode 100644 index 00000000000..9768f65063e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/rawsticks.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/sausage.png b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/sausage.png new file mode 100644 index 00000000000..28d58683cd9 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_ingredients.rsi/sausage.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/.png b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/.png new file mode 100644 index 00000000000..7608f1e8f31 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/clam.png b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/clam.png new file mode 100644 index 00000000000..5edfe83073a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/clam.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/clam_empty.png b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/clam_empty.png new file mode 100644 index 00000000000..59a7a43eaa6 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/clam_empty.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/clam_open.png b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/clam_open.png new file mode 100644 index 00000000000..e1fd0927c1a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/clam_open.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/crab.png b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/crab.png new file mode 100644 index 00000000000..8c4f63fbc54 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/crab.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/crab_meat.png b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/crab_meat.png new file mode 100644 index 00000000000..5f878dfce93 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/crab_meat.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/meta.json new file mode 100644 index 00000000000..9ebd9ba1b76 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/meta.json @@ -0,0 +1,53 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation12 at https://github.com/Baystation12/Baystation12/blob/464342c5dc8c417b7e79d56c69aa30445bdf3b75/icons/obj/food/food_shellfish.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "" + }, + { + "name": "clam" + }, + { + "name": "clam_open" + }, + { + "name": "clam_empty" + }, + { + "name": "mussel" + }, + { + "name": "mussel_open" + }, + { + "name": "mussel_empty" + }, + { + "name": "oyster" + }, + { + "name": "oyster_open" + }, + { + "name": "oyster_empty" + }, + { + "name": "shrimp" + }, + { + "name": "shrimp_meat" + }, + { + "name": "crab" + }, + { + "name": "crab_meat" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/mussel.png b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/mussel.png new file mode 100644 index 00000000000..8035de8aad6 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/mussel.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/mussel_empty.png b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/mussel_empty.png new file mode 100644 index 00000000000..01c5e5c4e6e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/mussel_empty.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/mussel_open.png b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/mussel_open.png new file mode 100644 index 00000000000..82d2801a233 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/mussel_open.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/oyster.png b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/oyster.png new file mode 100644 index 00000000000..43e63e52ffe Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/oyster.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/oyster_empty.png b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/oyster_empty.png new file mode 100644 index 00000000000..5f1d408b296 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/oyster_empty.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/oyster_open.png b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/oyster_open.png new file mode 100644 index 00000000000..6e25a8eca25 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/oyster_open.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/shrimp.png b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/shrimp.png new file mode 100644 index 00000000000..2e4f2e7dc40 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/shrimp.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/shrimp_meat.png b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/shrimp_meat.png new file mode 100644 index 00000000000..09e6c36c1d6 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_food_shellfish.rsi/shrimp_meat.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/4no_raisins.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/4no_raisins.png new file mode 100644 index 00000000000..9763e242cad Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/4no_raisins.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/beans.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/beans.png new file mode 100644 index 00000000000..5588b4d0a9b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/beans.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/beef.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/beef.png new file mode 100644 index 00000000000..46727ef2215 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/beef.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/berries.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/berries.png new file mode 100644 index 00000000000..5d2cbb00fce Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/berries.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/blank.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/blank.png new file mode 100644 index 00000000000..127d3dff3a1 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/blank.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/cakewrap.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/cakewrap.png new file mode 100644 index 00000000000..1a4815dbf28 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/cakewrap.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/candy.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/candy.png new file mode 100644 index 00000000000..3f34635a80f Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/candy.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/carpeggs.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/carpeggs.png new file mode 100644 index 00000000000..77460786fc0 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/carpeggs.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/cheesie_honkers.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/cheesie_honkers.png new file mode 100644 index 00000000000..761a4a62934 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/cheesie_honkers.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/chips.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/chips.png new file mode 100644 index 00000000000..264a9761e3b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/chips.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/corncob.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/corncob.png new file mode 100644 index 00000000000..0666e2c9218 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/corncob.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/croutons.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/croutons.png new file mode 100644 index 00000000000..da7ca46d982 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/croutons.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/driedfish.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/driedfish.png new file mode 100644 index 00000000000..6ee338a6d4a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/driedfish.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/fisheggs.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/fisheggs.png new file mode 100644 index 00000000000..48bed2d577c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/fisheggs.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/hollowcoconut.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/hollowcoconut.png new file mode 100644 index 00000000000..4bdc0358084 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/hollowcoconut.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/hollowpineapple.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/hollowpineapple.png new file mode 100644 index 00000000000..c1f1fd567f3 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/hollowpineapple.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/jupiter.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/jupiter.png new file mode 100644 index 00000000000..cc613d0e1a6 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/jupiter.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/liquidfood.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/liquidfood.png new file mode 100644 index 00000000000..4bb69aef4be Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/liquidfood.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/liquidfood_old.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/liquidfood_old.png new file mode 100644 index 00000000000..d183ad86b4a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/liquidfood_old.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/mars.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/mars.png new file mode 100644 index 00000000000..685999820f9 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/mars.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/meta.json new file mode 100644 index 00000000000..5c505136e52 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/meta.json @@ -0,0 +1,164 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from baystation at commit https://github.com/Baystation12/Baystation12/commit/464342c5dc8c417b7e79d56c69aa30445bdf3b75", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "waffles" + }, + { + "name": "plate" + }, + { + "name": "snack_bowl" + }, + { + "name": "tray" + }, + { + "name": "trashbag0" + }, + { + "name": "trashbag1" + }, + { + "name": "trashbag2" + }, + { + "name": "trashbag3" + }, + { + "name": "liquidfood" + }, + { + "name": "plasticbag" + }, + { + "name": "corncob" + }, + { + "name": "tastybread" + }, + { + "name": "liquidfood_old" + }, + { + "name": "4no_raisins" + }, + { + "name": "proteinbar" + }, + { + "name": "chips" + }, + { + "name": "popcorn" + }, + { + "name": "cheesie_honkers" + }, + { + "name": "sosjerky" + }, + { + "name": "syndi_cakes" + }, + { + "name": "pistachios_pack" + }, + { + "name": "semki_pack" + }, + { + "name": "candy" + }, + { + "name": "fisheggs" + }, + { + "name": "salo" + }, + { + "name": "driedfish" + }, + { + "name": "squid" + }, + { + "name": "monkeywrap" + }, + { + "name": "croutons" + }, + { + "name": "blank" + }, + { + "name": "beef" + }, + { + "name": "beans" + }, + { + "name": "tomato" + }, + { + "name": "spinach" + }, + { + "name": "berries" + }, + { + "name": "carpeggs" + }, + { + "name": "cakewrap" + }, + { + "name": "mochicakewrap" + }, + { + "name": "mooncakewrap" + }, + { + "name": "jupiter" + }, + { + "name": "tidegobs" + }, + { + "name": "saturno" + }, + { + "name": "pluto" + }, + { + "name": "venus" + }, + { + "name": "oort" + }, + { + "name": "mars" + }, + { + "name": "stick" + }, + { + "name": "weebonuts" + }, + { + "name": "hollowpineapple" + }, + { + "name": "hollowcoconut" + }, + { + "name": "usedplatter" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/mochicakewrap.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/mochicakewrap.png new file mode 100644 index 00000000000..276b8b05962 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/mochicakewrap.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/monkeywrap.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/monkeywrap.png new file mode 100644 index 00000000000..7afc02e2950 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/monkeywrap.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/mooncakewrap.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/mooncakewrap.png new file mode 100644 index 00000000000..c4ea9880039 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/mooncakewrap.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/oort.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/oort.png new file mode 100644 index 00000000000..4063a0d1fff Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/oort.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/pistachios_pack.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/pistachios_pack.png new file mode 100644 index 00000000000..f87f252bbce Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/pistachios_pack.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/plasticbag.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/plasticbag.png new file mode 100644 index 00000000000..7584ed1a6df Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/plasticbag.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/plate.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/plate.png new file mode 100644 index 00000000000..45379bbe6db Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/plate.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/pluto.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/pluto.png new file mode 100644 index 00000000000..2f4a6d3bbaa Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/pluto.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/popcorn.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/popcorn.png new file mode 100644 index 00000000000..fb5ac26fd4e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/popcorn.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/proteinbar.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/proteinbar.png new file mode 100644 index 00000000000..f004d7e873b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/proteinbar.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/salo.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/salo.png new file mode 100644 index 00000000000..59d1da93687 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/salo.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/saturno.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/saturno.png new file mode 100644 index 00000000000..97feeb26aa1 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/saturno.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/semki_pack.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/semki_pack.png new file mode 100644 index 00000000000..1a58fce7602 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/semki_pack.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/snack_bowl.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/snack_bowl.png new file mode 100644 index 00000000000..aeca559f3ea Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/snack_bowl.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/sosjerky.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/sosjerky.png new file mode 100644 index 00000000000..7dd3c82ff5b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/sosjerky.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/spinach.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/spinach.png new file mode 100644 index 00000000000..d9f8d73519f Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/spinach.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/squid.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/squid.png new file mode 100644 index 00000000000..c433f7b6c0e Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/squid.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/stick.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/stick.png new file mode 100644 index 00000000000..26f8d4d44c0 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/stick.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/syndi_cakes.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/syndi_cakes.png new file mode 100644 index 00000000000..8be9e8b6dda Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/syndi_cakes.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/tastybread.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/tastybread.png new file mode 100644 index 00000000000..42bc2c8ca3b Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/tastybread.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/tidegobs.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/tidegobs.png new file mode 100644 index 00000000000..528c00b75ad Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/tidegobs.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/tomato.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/tomato.png new file mode 100644 index 00000000000..644f80f8024 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/tomato.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/trashbag0.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/trashbag0.png new file mode 100644 index 00000000000..c3f511a2d77 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/trashbag0.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/trashbag1.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/trashbag1.png new file mode 100644 index 00000000000..5a1b5182288 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/trashbag1.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/trashbag2.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/trashbag2.png new file mode 100644 index 00000000000..20f785221a7 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/trashbag2.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/trashbag3.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/trashbag3.png new file mode 100644 index 00000000000..037acd24248 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/trashbag3.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/tray.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/tray.png new file mode 100644 index 00000000000..0291f5d02b9 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/tray.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/usedplatter.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/usedplatter.png new file mode 100644 index 00000000000..f6343a89574 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/usedplatter.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/venus.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/venus.png new file mode 100644 index 00000000000..c1285db19f3 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/venus.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/waffles.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/waffles.png new file mode 100644 index 00000000000..391c8b74da5 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/waffles.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/weebonuts.png b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/weebonuts.png new file mode 100644 index 00000000000..18ffab02ae7 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bay_trash.rsi/weebonuts.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/meals.rsi/harpywings.png b/Resources/Textures/Objects/Consumable/Food/meals.rsi/harpywings.png new file mode 100644 index 00000000000..e355802a95a Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/meals.rsi/harpywings.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/meals.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/meals.rsi/meta.json index e3fa26223a2..320257ad198 100644 --- a/Resources/Textures/Objects/Consumable/Food/meals.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Food/meals.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/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24, taco from https://github.com/ss220-space/Paradise/commit/6c9bd827610433093a79d814b96bd50f9cf12eec, corn in butter from im_kreks", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24, taco from https://github.com/ss220-space/Paradise/commit/6c9bd827610433093a79d814b96bd50f9cf12eec, corn in butter from im_kreks, harpywings from dootythefrooty", "size": { "x": 32, "y": 32 @@ -150,6 +150,9 @@ }, { "name": "corn-in-butter" + }, + { + "name": "harpywings" } ] } diff --git a/Resources/Textures/Objects/Devices/translator.rsi/icon.png b/Resources/Textures/Objects/Devices/translator.rsi/icon.png new file mode 100644 index 00000000000..6871c808ccd Binary files /dev/null and b/Resources/Textures/Objects/Devices/translator.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Devices/translator.rsi/meta.json b/Resources/Textures/Objects/Devices/translator.rsi/meta.json new file mode 100644 index 00000000000..0202c0c39c7 --- /dev/null +++ b/Resources/Textures/Objects/Devices/translator.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 2, + "license": "CC-BY-SA-3.0", + "copyright": "baystation12", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "translator" + } + ] +} diff --git a/Resources/Textures/Objects/Devices/translator.rsi/translator.png b/Resources/Textures/Objects/Devices/translator.rsi/translator.png new file mode 100644 index 00000000000..6c54a0b8636 Binary files /dev/null and b/Resources/Textures/Objects/Devices/translator.rsi/translator.png differ diff --git a/Resources/Textures/Objects/Fun/toys.rsi/meta.json b/Resources/Textures/Objects/Fun/toys.rsi/meta.json index fc92a479367..cae7880e414 100644 --- a/Resources/Textures/Objects/Fun/toys.rsi/meta.json +++ b/Resources/Textures/Objects/Fun/toys.rsi/meta.json @@ -104,6 +104,9 @@ { "name": "plushie_diona" }, + { + "name": "plushie_arachne" + }, { "name": "plushie_human" }, diff --git a/Resources/Textures/Objects/Fun/toys.rsi/plushie_arachne.png b/Resources/Textures/Objects/Fun/toys.rsi/plushie_arachne.png new file mode 100644 index 00000000000..4f72c31ddf6 Binary files /dev/null and b/Resources/Textures/Objects/Fun/toys.rsi/plushie_arachne.png differ diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json b/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json index 5117df77356..b57f9844bc7 100644 --- a/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json +++ b/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432. paper_stamp-syndicate by Veritius. paper_receipt, paper_receipt_horizontal by eoineoineoin. pen_centcom is a resprited version of pen_cap by PuroSlavKing (Github). Luxury pen is drawn by Ubaser. Lawyer and psychologist paper stamp resprited by Guess-My-Name", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432. paper_stamp-syndicate by Veritius. paper_receipt, paper_receipt_horizontal by eoineoineoin. pen_centcom is a resprited version of pen_cap by PuroSlavKing (Github). Luxury pen is drawn by Ubaser. Lawyer and psychologist paper stamp resprited by Guess-My-Name. paper_stamp-signature by Mnemotechnician.", "size": { "x": 32, "y": 32 @@ -259,6 +259,9 @@ }, { "name": "paper_stamp-psychologist" + }, + { + "name": "paper_stamp-signature" } ] } diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-signature.png b/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-signature.png new file mode 100644 index 00000000000..6a7aa083ee5 Binary files /dev/null and b/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-signature.png differ diff --git a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_closed.png b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_closed.png index 7c99615ffec..b84389a06bd 100644 Binary files a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_closed.png and b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_closed.png differ diff --git a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_open.png b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_open.png index 7909d14f269..0cf52827fca 100644 Binary files a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_open.png and b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_open.png differ diff --git a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/meta.json b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/meta.json index 990bbf93567..2e60d4f4041 100644 --- a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/meta.json +++ b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/tgstation/tgstation at commit 9bebd81ae0b0a7f952b59886a765c681205de31f", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise // Hand Sprites taken from https://github.com/tgstation/tgstation at commit 9bebd81ae0b0a7f952b59886a765c681205de31f", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/assistant.png b/Resources/Textures/Objects/Misc/id_cards.rsi/assistant.png new file mode 100644 index 00000000000..a3e83280f72 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/assistant.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/atmospherictechnician.png b/Resources/Textures/Objects/Misc/id_cards.rsi/atmospherictechnician.png new file mode 100644 index 00000000000..99e10c276d7 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/atmospherictechnician.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/bartender.png b/Resources/Textures/Objects/Misc/id_cards.rsi/bartender.png new file mode 100644 index 00000000000..24a1b62fe24 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/bartender.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/black.png b/Resources/Textures/Objects/Misc/id_cards.rsi/black.png new file mode 100644 index 00000000000..6958c6d4490 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/black.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/botanist.png b/Resources/Textures/Objects/Misc/id_cards.rsi/botanist.png new file mode 100644 index 00000000000..4d62c18a60a Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/botanist.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/boxer.png b/Resources/Textures/Objects/Misc/id_cards.rsi/boxer.png new file mode 100644 index 00000000000..90b9165c049 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/boxer.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/captain.png b/Resources/Textures/Objects/Misc/id_cards.rsi/captain.png new file mode 100644 index 00000000000..72ec0038427 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/captain.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/cargotechnician.png b/Resources/Textures/Objects/Misc/id_cards.rsi/cargotechnician.png new file mode 100644 index 00000000000..7f5fba10169 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/cargotechnician.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/carp.png b/Resources/Textures/Objects/Misc/id_cards.rsi/carp.png new file mode 100644 index 00000000000..1ef99e1cef6 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/carp.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/cc.png b/Resources/Textures/Objects/Misc/id_cards.rsi/cc.png new file mode 100644 index 00000000000..9a28b7780c6 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/cc.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/centcom.png b/Resources/Textures/Objects/Misc/id_cards.rsi/centcom.png index ff1e293183c..3ed8b4045a7 100644 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/centcom.png and b/Resources/Textures/Objects/Misc/id_cards.rsi/centcom.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/chaplain.png b/Resources/Textures/Objects/Misc/id_cards.rsi/chaplain.png new file mode 100644 index 00000000000..1e134c3911b Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/chaplain.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/chemist.png b/Resources/Textures/Objects/Misc/id_cards.rsi/chemist.png new file mode 100644 index 00000000000..11a34b3f053 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/chemist.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/clown.png b/Resources/Textures/Objects/Misc/id_cards.rsi/clown.png new file mode 100644 index 00000000000..24dea8a6d00 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/clown.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/cook.png b/Resources/Textures/Objects/Misc/id_cards.rsi/cook.png new file mode 100644 index 00000000000..8a4e8c15d1e Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/cook.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/curator.png b/Resources/Textures/Objects/Misc/id_cards.rsi/curator.png new file mode 100644 index 00000000000..534150e6de3 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/curator.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/death.png b/Resources/Textures/Objects/Misc/id_cards.rsi/death.png new file mode 100644 index 00000000000..c2190596169 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/death.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/default.png b/Resources/Textures/Objects/Misc/id_cards.rsi/default.png index 95b3d54c270..a7142e353ea 100644 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/default.png and b/Resources/Textures/Objects/Misc/id_cards.rsi/default.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/department.png b/Resources/Textures/Objects/Misc/id_cards.rsi/department.png new file mode 100644 index 00000000000..001c8d75f5e Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/department.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/departmenthead.png b/Resources/Textures/Objects/Misc/id_cards.rsi/departmenthead.png new file mode 100644 index 00000000000..09f48fbb838 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/departmenthead.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/detective.png b/Resources/Textures/Objects/Misc/id_cards.rsi/detective.png new file mode 100644 index 00000000000..8e21d3539c4 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/detective.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/ert_chaplain.png b/Resources/Textures/Objects/Misc/id_cards.rsi/ert_chaplain.png deleted file mode 100644 index 624bb4864db..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/ert_chaplain.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/ert_commander.png b/Resources/Textures/Objects/Misc/id_cards.rsi/ert_commander.png deleted file mode 100644 index d9c8b6e261d..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/ert_commander.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/ert_engineer.png b/Resources/Textures/Objects/Misc/id_cards.rsi/ert_engineer.png deleted file mode 100644 index a7c8b683556..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/ert_engineer.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/ert_janitor.png b/Resources/Textures/Objects/Misc/id_cards.rsi/ert_janitor.png deleted file mode 100644 index afbe56e5f0d..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/ert_janitor.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/ert_medic.png b/Resources/Textures/Objects/Misc/id_cards.rsi/ert_medic.png deleted file mode 100644 index 6fe2ce6698f..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/ert_medic.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/ert_security.png b/Resources/Textures/Objects/Misc/id_cards.rsi/ert_security.png deleted file mode 100644 index 6bb3134b557..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/ert_security.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/flame.png b/Resources/Textures/Objects/Misc/id_cards.rsi/flame.png new file mode 100644 index 00000000000..014c98322aa Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/flame.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/geneticist.png b/Resources/Textures/Objects/Misc/id_cards.rsi/geneticist.png new file mode 100644 index 00000000000..0980bb306c3 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/geneticist.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/gladiator.png b/Resources/Textures/Objects/Misc/id_cards.rsi/gladiator.png new file mode 100644 index 00000000000..407a927b6a4 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/gladiator.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/gold.png b/Resources/Textures/Objects/Misc/id_cards.rsi/gold.png index bb20387315c..859a9ec99cf 100644 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/gold.png and b/Resources/Textures/Objects/Misc/id_cards.rsi/gold.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/headofpersonnel.png b/Resources/Textures/Objects/Misc/id_cards.rsi/headofpersonnel.png new file mode 100644 index 00000000000..d0b4235c816 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/headofpersonnel.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idatmospherictechnician.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idatmospherictechnician.png deleted file mode 100644 index 3bd5446a3bc..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idatmospherictechnician.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idbartender.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idbartender.png deleted file mode 100644 index 435ea39ad6a..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idbartender.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idbotanist.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idbotanist.png deleted file mode 100644 index f5dfdb86629..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idbotanist.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idboxer.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idboxer.png deleted file mode 100644 index 0c2b5298e5f..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idboxer.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idbrigmedic.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idbrigmedic.png deleted file mode 100644 index 1f64eb4845a..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idbrigmedic.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idcaptain.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idcaptain.png deleted file mode 100644 index e59e7c3d042..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idcaptain.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idcargotechnician.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idcargotechnician.png deleted file mode 100644 index cfa0a35dcc5..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idcargotechnician.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idcentcom.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idcentcom.png deleted file mode 100644 index 25b7017a708..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idcentcom.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idchaplain.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idchaplain.png deleted file mode 100644 index e10e3c82a6e..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idchaplain.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idchemist.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idchemist.png deleted file mode 100644 index 2dba29c2060..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idchemist.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idchiefengineer.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idchiefengineer.png deleted file mode 100644 index f105b4f88ad..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idchiefengineer.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idchiefmedicalofficer.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idchiefmedicalofficer.png deleted file mode 100644 index 82a608a9a1a..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idchiefmedicalofficer.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idclown.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idclown.png deleted file mode 100644 index e0372020448..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idclown.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idcluwne.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idcluwne.png deleted file mode 100644 index d57a7e3d416..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idcluwne.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idcook.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idcook.png deleted file mode 100644 index 09527688a46..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idcook.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idcurator.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idcurator.png deleted file mode 100644 index cd01dc77702..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idcurator.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/iddetective.png b/Resources/Textures/Objects/Misc/id_cards.rsi/iddetective.png deleted file mode 100644 index 3b749d582a5..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/iddetective.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idgeneticist.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idgeneticist.png deleted file mode 100644 index 1303135aa5a..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idgeneticist.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idheadofpersonnel.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idheadofpersonnel.png deleted file mode 100644 index be72e37e574..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idheadofpersonnel.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idheadofsecurity.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idheadofsecurity.png deleted file mode 100644 index bb03adc665c..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idheadofsecurity.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idintern-cadet.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idintern-cadet.png deleted file mode 100644 index cebf46fade2..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idintern-cadet.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idintern-med.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idintern-med.png deleted file mode 100644 index 15c7cde5e86..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idintern-med.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idintern-sci.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idintern-sci.png deleted file mode 100644 index de676944766..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idintern-sci.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idintern-service.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idintern-service.png deleted file mode 100644 index 5fc1f43c05b..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idintern-service.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idintern-tech.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idintern-tech.png deleted file mode 100644 index f7ed302b23a..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idintern-tech.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idjanitor.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idjanitor.png deleted file mode 100644 index 320c3885e7e..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idjanitor.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idlawyer.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idlawyer.png deleted file mode 100644 index b86f437aee1..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idlawyer.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idmedicaldoctor.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idmedicaldoctor.png deleted file mode 100644 index 9e390bb606f..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idmedicaldoctor.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idmime.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idmime.png deleted file mode 100644 index b917612dae2..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idmime.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idmusician.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idmusician.png deleted file mode 100644 index b51dfaaab8e..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idmusician.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idparamedic.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idparamedic.png deleted file mode 100644 index 1881839e965..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idparamedic.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idpassenger.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idpassenger.png deleted file mode 100644 index 88866eb1693..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idpassenger.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idprisoner.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idprisoner.png deleted file mode 100644 index f9337a37c53..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idprisoner.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idpsychologist.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idpsychologist.png deleted file mode 100644 index 038a5321d4b..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idpsychologist.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idquartermaster.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idquartermaster.png deleted file mode 100644 index bfdd0678724..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idquartermaster.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idreporter.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idreporter.png deleted file mode 100644 index e4ea4f95882..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idreporter.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idresearchdirector.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idresearchdirector.png deleted file mode 100644 index fdb1fd2648b..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idresearchdirector.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idroboticist.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idroboticist.png deleted file mode 100644 index a9d6c5facd5..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idroboticist.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idscientist.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idscientist.png deleted file mode 100644 index 893346a9c90..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idscientist.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idsecurityofficer.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idsecurityofficer.png deleted file mode 100644 index 6456d644396..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idsecurityofficer.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idseniorengineer.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idseniorengineer.png deleted file mode 100644 index 73c8b6d00fe..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idseniorengineer.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idseniorofficer.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idseniorofficer.png deleted file mode 100644 index f3a87d6fa4b..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idseniorofficer.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idseniorphysician.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idseniorphysician.png deleted file mode 100644 index 2d00cf7a164..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idseniorphysician.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idseniorresearcher.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idseniorresearcher.png deleted file mode 100644 index 47a2ccb7485..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idseniorresearcher.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idshaftminer.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idshaftminer.png deleted file mode 100644 index c232dd439d4..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idshaftminer.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idstationengineer.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idstationengineer.png deleted file mode 100644 index 2e046fbacdd..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idstationengineer.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idunknown.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idunknown.png deleted file mode 100644 index bc792fe1a17..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idunknown.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idvirologist.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idvirologist.png deleted file mode 100644 index 1d4b2f2d474..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idvirologist.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idwarden.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idwarden.png deleted file mode 100644 index 0b4086478ca..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idwarden.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idzookeeper.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idzookeeper.png deleted file mode 100644 index c24212aab8d..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idzookeeper.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/janitor.png b/Resources/Textures/Objects/Misc/id_cards.rsi/janitor.png new file mode 100644 index 00000000000..19eb0d52482 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/janitor.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/lawyer.png b/Resources/Textures/Objects/Misc/id_cards.rsi/lawyer.png new file mode 100644 index 00000000000..973bbf66e1e Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/lawyer.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/mailcarrier.png b/Resources/Textures/Objects/Misc/id_cards.rsi/mailcarrier.png new file mode 100644 index 00000000000..db33a5ead4c Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/mailcarrier.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/martialartist.png b/Resources/Textures/Objects/Misc/id_cards.rsi/martialartist.png new file mode 100644 index 00000000000..e49e4478429 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/martialartist.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/medicaldoctor.png b/Resources/Textures/Objects/Misc/id_cards.rsi/medicaldoctor.png new file mode 100644 index 00000000000..92832dcaad6 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/medicaldoctor.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/meta.json b/Resources/Textures/Objects/Misc/id_cards.rsi/meta.json index a84c76a46c9..eeed695ca3c 100644 --- a/Resources/Textures/Objects/Misc/id_cards.rsi/meta.json +++ b/Resources/Textures/Objects/Misc/id_cards.rsi/meta.json @@ -1,261 +1,204 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/d917f4c2a088419d5c3aec7656b7ff8cebd1822e idcluwne made by brainfood1183 (github) for ss14, idbrigmedic made by PuroSlavKing (Github), pirate made by brainfood1183 (github)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "default" - }, - { - "name": "centcom" - }, - { - "name": "ert_chaplain" - }, - { - "name": "ert_commander" - }, - { - "name": "ert_engineer" - }, - { - "name": "ert_janitor" - }, - { - "name": "ert_medic" - }, - { - "name": "ert_security" - }, - { - "name": "gold" - }, - { - "name": "idpassenger" - }, - { - "name": "idatmospherictechnician" - }, - { - "name": "idbartender" - }, - { - "name": "idbotanist" - }, - { - "name": "idboxer" - }, - { - "name": "idcaptain" - }, - { - "name": "idcargotechnician" - }, - { - "name": "idcentcom" - }, - { - "name": "idchaplain" - }, - { - "name": "idchemist" - }, - { - "name": "idchiefengineer" - }, - { - "name": "idchiefmedicalofficer" - }, - { - "name": "idclown" - }, - { - "name": "idcook" - }, - { - "name": "idcurator" - }, - { - "name": "iddetective" - }, - { - "name": "idgeneticist" - }, - { - "name": "idheadofpersonnel" - }, - { - "name": "idheadofsecurity" - }, - { - "name": "idbrigmedic" - }, - { - "name": "idjanitor" - }, - { - "name": "idlawyer" - }, - { - "name": "idmedicaldoctor" - }, - { - "name": "idmime" - }, - { - "name": "idparamedic" - }, - { - "name": "idpsychologist" - }, - { - "name": "idreporter" - }, - { - "name": "idprisoner" - }, - { - "name": "idquartermaster" - }, - { - "name": "idresearchdirector" - }, - { - "name": "idroboticist" - }, - { - "name": "idscientist" - }, - { - "name": "idsecurityofficer" - }, - { - "name": "idshaftminer" - }, - { - "name": "idstationengineer" - }, - { - "name": "idunknown" - }, - { - "name": "idvirologist" - }, - { - "name": "idwarden" - }, - { - "name": "idmusician" - }, - { - "name": "idzookeeper" - }, - { - "name": "idintern-sci" - }, - { - "name": "idintern-cadet" - }, - { - "name": "idintern-med" - }, - { - "name": "idintern-service" - }, - { - "name": "idintern-tech" - }, - { - "name": "orange" - }, - { - "name": "pirate" - }, - { - "name": "prisoner_001" - }, - { - "name": "prisoner_002" - }, - { - "name": "prisoner_003" - }, - { - "name": "prisoner_004" - }, - { - "name": "prisoner_005" - }, - { - "name": "prisoner_006" - }, - { - "name": "prisoner_007" - }, - { - "name": "silver" - }, - { - "name": "syndie" - }, - { - "name": "idcluwne" - }, - { - "name": "idseniorengineer" - }, - { - "name": "idseniorresearcher" - }, - { - "name": "idseniorphysician" - }, - { - "name": "idseniorofficer" - }, - { - "name": "gold-inhand-left", - "directions": 4 - }, - { - "name": "gold-inhand-right", - "directions": 4 - }, - { - "name": "default-inhand-left", - "directions": 4 - }, - { - "name": "default-inhand-right", - "directions": 4 - }, - { - "name": "silver-inhand-left", - "directions": 4 - }, - { - "name": "silver-inhand-right", - "directions": 4 - }, - { - "name": "orange-inhand-left", - "directions": 4 - }, - { - "name": "orange-inhand-right", - "directions": 4 - }, - { - "name": "blue-inhand-left", - "directions": 4 - }, - { - "name": "blue-inhand-right", - "directions": 4 - } - ] + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation // Icon Edit by FoxxoTrystan", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "default" + }, + { + "name": "centcom" + }, + { + "name": "gold" + }, + { + "name": "silver" + }, + { + "name": "rainbow" + }, + { + "name": "prisoner" + }, + { + "name": "flame" + }, + { + "name": "rpg" + }, + { + "name": "carp" + }, + { + "name": "black" + }, + { + "name": "department" + }, + { + "name": "departmenthead" + }, + { + "name": "subdepartment" + }, + { + "name": "captain" + }, + { + "name": "passenger" + }, + { + "name": "assistant" + }, + { + "name": "securityofficer" + }, + { + "name": "warden" + }, + { + "name": "stationengineer" + }, + { + "name": "medicaldoctor" + }, + { + "name": "paramedic" + }, + { + "name": "chemist" + }, + { + "name": "cargotechnician" + }, + { + "name": "shaftminer" + }, + { + "name": "scientist" + }, + { + "name": "clown" + }, + { + "name": "mime" + }, + { + "name": "chaplain" + }, + { + "name": "janitor" + }, + { + "name": "bartender" + }, + { + "name": "cook" + }, + { + "name": "botanist" + }, + { + "name": "curator" + }, + { + "name": "lawyer" + }, + { + "name": "headofpersonnel" + }, + { + "name": "cc" + }, + { + "name": "musician" + }, + { + "name": "death" + }, + { + "name": "roboticist" + }, + { + "name": "atmospherictechnician" + }, + { + "name": "syndicate" + }, + { + "name": "geneticist" + }, + { + "name": "zookeeper" + }, + { + "name": "detective" + }, + { + "name": "senior" + }, + { + "name": "mailcarrier" + }, + { + "name": "prisonguard" + }, + { + "name": "psychologist" + }, + { + "name": "boxer" + }, + { + "name": "gladiator" + }, + { + "name": "martialartist" + }, + { + "name": "gold-inhand-left", + "directions": 4 + }, + { + "name": "gold-inhand-right", + "directions": 4 + }, + { + "name": "default-inhand-left", + "directions": 4 + }, + { + "name": "default-inhand-right", + "directions": 4 + }, + { + "name": "silver-inhand-left", + "directions": 4 + }, + { + "name": "silver-inhand-right", + "directions": 4 + }, + { + "name": "orange-inhand-left", + "directions": 4 + }, + { + "name": "orange-inhand-right", + "directions": 4 + }, + { + "name": "blue-inhand-left", + "directions": 4 + }, + { + "name": "blue-inhand-right", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/mime.png b/Resources/Textures/Objects/Misc/id_cards.rsi/mime.png new file mode 100644 index 00000000000..8368027151f Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/mime.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/musician.png b/Resources/Textures/Objects/Misc/id_cards.rsi/musician.png new file mode 100644 index 00000000000..1f1df6370ce Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/musician.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/orange.png b/Resources/Textures/Objects/Misc/id_cards.rsi/orange.png deleted file mode 100644 index a44da608ec0..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/orange.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/paramedic.png b/Resources/Textures/Objects/Misc/id_cards.rsi/paramedic.png new file mode 100644 index 00000000000..d1f48a111d3 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/paramedic.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/passenger.png b/Resources/Textures/Objects/Misc/id_cards.rsi/passenger.png new file mode 100644 index 00000000000..9f04507a9c5 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/passenger.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/pirate.png b/Resources/Textures/Objects/Misc/id_cards.rsi/pirate.png deleted file mode 100644 index d5670a71aa1..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/pirate.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner.png b/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner.png new file mode 100644 index 00000000000..ad8052cc01b Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_001.png b/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_001.png deleted file mode 100644 index 67dd3e88622..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_001.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_002.png b/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_002.png deleted file mode 100644 index 004677ba4ab..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_002.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_003.png b/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_003.png deleted file mode 100644 index 23c998f1507..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_003.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_004.png b/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_004.png deleted file mode 100644 index c6e31412cc7..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_004.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_005.png b/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_005.png deleted file mode 100644 index d1d29bb0558..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_005.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_006.png b/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_006.png deleted file mode 100644 index 8b2305d7587..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_006.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_007.png b/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_007.png deleted file mode 100644 index a5041faa88b..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/prisoner_007.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/prisonguard.png b/Resources/Textures/Objects/Misc/id_cards.rsi/prisonguard.png new file mode 100644 index 00000000000..f8570b2595c Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/prisonguard.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/psychologist.png b/Resources/Textures/Objects/Misc/id_cards.rsi/psychologist.png new file mode 100644 index 00000000000..d7d24d69470 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/psychologist.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/rainbow.png b/Resources/Textures/Objects/Misc/id_cards.rsi/rainbow.png new file mode 100644 index 00000000000..a0ccc1758c8 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/rainbow.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/roboticist.png b/Resources/Textures/Objects/Misc/id_cards.rsi/roboticist.png new file mode 100644 index 00000000000..ea7bda6c41e Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/roboticist.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/rpg.png b/Resources/Textures/Objects/Misc/id_cards.rsi/rpg.png new file mode 100644 index 00000000000..f6aa05e158b Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/rpg.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/scientist.png b/Resources/Textures/Objects/Misc/id_cards.rsi/scientist.png new file mode 100644 index 00000000000..7942e128b03 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/scientist.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/securityofficer.png b/Resources/Textures/Objects/Misc/id_cards.rsi/securityofficer.png new file mode 100644 index 00000000000..fffc7d2a065 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/securityofficer.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/senior.png b/Resources/Textures/Objects/Misc/id_cards.rsi/senior.png new file mode 100644 index 00000000000..28729bd5626 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/senior.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/shaftminer.png b/Resources/Textures/Objects/Misc/id_cards.rsi/shaftminer.png new file mode 100644 index 00000000000..4b42f5bbb67 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/shaftminer.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/silver.png b/Resources/Textures/Objects/Misc/id_cards.rsi/silver.png index b13153a246e..81d9626a727 100644 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/silver.png and b/Resources/Textures/Objects/Misc/id_cards.rsi/silver.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/stationengineer.png b/Resources/Textures/Objects/Misc/id_cards.rsi/stationengineer.png new file mode 100644 index 00000000000..c04b4761ea8 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/stationengineer.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/subdepartment.png b/Resources/Textures/Objects/Misc/id_cards.rsi/subdepartment.png new file mode 100644 index 00000000000..cc1547cbf73 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/subdepartment.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/syndicate.png b/Resources/Textures/Objects/Misc/id_cards.rsi/syndicate.png new file mode 100644 index 00000000000..5ed1c8ffe54 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/syndicate.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/syndie.png b/Resources/Textures/Objects/Misc/id_cards.rsi/syndie.png deleted file mode 100644 index 3d5cc6e384f..00000000000 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/syndie.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/warden.png b/Resources/Textures/Objects/Misc/id_cards.rsi/warden.png new file mode 100644 index 00000000000..754ac67a883 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/warden.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/zookeeper.png b/Resources/Textures/Objects/Misc/id_cards.rsi/zookeeper.png new file mode 100644 index 00000000000..29b8dbca067 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/zookeeper.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_capacitor.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_capacitor.png index 039817e37b9..2be12b48a64 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_capacitor.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_capacitor.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_scan_module.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_scan_module.png index 1871b477b63..0ee37e653da 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_scan_module.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_scan_module.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/advanced_matter_bin.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/advanced_matter_bin.png index 819275417ba..7533331b835 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/advanced_matter_bin.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/advanced_matter_bin.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/bluespace_matter_bin.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/bluespace_matter_bin.png index ba244f3f297..56d1aa2a36a 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/bluespace_matter_bin.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/bluespace_matter_bin.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/capacitor.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/capacitor.png index 305087c37b6..242f217e4af 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/capacitor.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/capacitor.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/femto_mani.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/femto_mani.png index f7e231248e5..04057ffa822 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/femto_mani.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/femto_mani.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/high_micro_laser.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/high_micro_laser.png index 2bd8d3837da..c23c941e150 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/high_micro_laser.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/high_micro_laser.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/matter_bin.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/matter_bin.png index c4603632dff..494582986fd 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/matter_bin.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/matter_bin.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/meta.json b/Resources/Textures/Objects/Misc/stock_parts.rsi/meta.json index fac73084019..50a7fd96d53 100644 --- a/Resources/Textures/Objects/Misc/stock_parts.rsi/meta.json +++ b/Resources/Textures/Objects/Misc/stock_parts.rsi/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/tgstation/tgstation at 0d9c9a8233dfc3fc55edc538955a761a6328bee0, micro_mani by EmoGarbage404 (github)", + "copyright": "Taken from https://github.com/tgstation/tgstation at 0d9c9a8233dfc3fc55edc538955a761a6328bee0 // Taken from https://github.com/ParadiseSS13/Paradise/", "states": [ { "name": "adv_capacitor" @@ -27,6 +27,7 @@ 0.1, 0.1, 0.1, + 0.1, 0.1 ] ] @@ -53,7 +54,13 @@ "name": "bluespace_matter_bin", "delays": [ [ - 0.3, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, 0.1, 0.1, 0.1 @@ -146,15 +153,7 @@ ] }, { - "name": "femto_mani", - "delays": [ - [ - 0.3, - 0.1, - 0.1, - 0.1 - ] - ] + "name": "femto_mani" }, { "name": "hdd1" @@ -184,24 +183,10 @@ "name": "pico_mani" }, { - "name": "quadratic_capacitor", - "delays": [ - [ - 0.3, - 0.1, - 0.1, - 0.1 - ] - ] + "name": "quadratic_capacitor" }, { - "name": "quadultra_micro_laser", - "delays": [ - [ - 0.1, - 0.1 - ] - ] + "name": "quadultra_micro_laser" }, { "name": "rom1" @@ -222,7 +207,6 @@ 0.1, 0.1, 0.1, - 0.1, 0.1 ] ] @@ -260,7 +244,15 @@ "name": "super_matter_bin" }, { - "name": "super_scan_module" + "name": "super_scan_module", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] }, { "name": "treatment_disk" diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_laser.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_laser.png index c23eea56f85..0bf4296e9b3 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_laser.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_laser.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_mani.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_mani.png index 8dca252f688..c63b141f11d 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_mani.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_mani.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/nano_mani.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/nano_mani.png index 93b2d06f098..0c3defdefa4 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/nano_mani.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/nano_mani.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/pico_mani.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/pico_mani.png index f3d1ff54dc9..2da4e416464 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/pico_mani.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/pico_mani.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/quadratic_capacitor.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/quadratic_capacitor.png index 11633f753de..0cb5de4a3fd 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/quadratic_capacitor.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/quadratic_capacitor.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/quadultra_micro_laser.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/quadultra_micro_laser.png index cc907fa5e26..b3bbe275e15 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/quadultra_micro_laser.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/quadultra_micro_laser.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/scan_module.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/scan_module.png index b95b803d8f7..a05d626eea0 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/scan_module.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/scan_module.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/super_capacitor.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/super_capacitor.png index d6d1f9d555a..054299f6d7a 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/super_capacitor.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/super_capacitor.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/super_matter_bin.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/super_matter_bin.png index 54678e59150..b56c920f7be 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/super_matter_bin.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/super_matter_bin.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/super_scan_module.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/super_scan_module.png index 240ab514d76..7fa4ceedfbd 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/super_scan_module.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/super_scan_module.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/triphasic_scan_module.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/triphasic_scan_module.png index d3e7d72b57d..e2fd4e6fbff 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/triphasic_scan_module.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/triphasic_scan_module.png differ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/ultra_high_micro_laser.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/ultra_high_micro_laser.png index 3e65d639a5e..6aec80e9dd5 100644 Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/ultra_high_micro_laser.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/ultra_high_micro_laser.png differ diff --git a/Resources/Textures/Objects/Specific/barbershop.rsi/dye-e.png b/Resources/Textures/Objects/Specific/barbershop.rsi/dye-e.png new file mode 100644 index 00000000000..9d35b161a42 Binary files /dev/null and b/Resources/Textures/Objects/Specific/barbershop.rsi/dye-e.png differ diff --git a/Resources/Textures/Objects/Specific/barbershop.rsi/dye-f.png b/Resources/Textures/Objects/Specific/barbershop.rsi/dye-f.png new file mode 100644 index 00000000000..9e113d439c4 Binary files /dev/null and b/Resources/Textures/Objects/Specific/barbershop.rsi/dye-f.png differ diff --git a/Resources/Textures/Objects/Specific/barbershop.rsi/dye.png b/Resources/Textures/Objects/Specific/barbershop.rsi/dye.png new file mode 100644 index 00000000000..65c9048ef35 Binary files /dev/null and b/Resources/Textures/Objects/Specific/barbershop.rsi/dye.png differ diff --git a/Resources/Textures/Objects/Specific/barbershop.rsi/dye_color.png b/Resources/Textures/Objects/Specific/barbershop.rsi/dye_color.png new file mode 100644 index 00000000000..1e35ab83d8d Binary files /dev/null and b/Resources/Textures/Objects/Specific/barbershop.rsi/dye_color.png differ diff --git a/Resources/Textures/Objects/Specific/barbershop.rsi/meta.json b/Resources/Textures/Objects/Specific/barbershop.rsi/meta.json new file mode 100644 index 00000000000..4450663ba46 --- /dev/null +++ b/Resources/Textures/Objects/Specific/barbershop.rsi/meta.json @@ -0,0 +1,35 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from goonstation at https://github.com/goonstation/goonstation/blob/16f8a5c31a6cfc019a1549b0b97f18865002a44c/icons/obj/barber_shop.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "dye" + }, + { + "name": "dye_color" + }, + { + "name": "dye-e" + }, + { + "name": "dye-f" + }, + { + "name": "scissors" + }, + { + "name": "razorblade" + }, + { + "name": "tonic1" + }, + { + "name": "tonic0" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Specific/barbershop.rsi/razorblade.png b/Resources/Textures/Objects/Specific/barbershop.rsi/razorblade.png new file mode 100644 index 00000000000..47b3afac180 Binary files /dev/null and b/Resources/Textures/Objects/Specific/barbershop.rsi/razorblade.png differ diff --git a/Resources/Textures/Objects/Specific/barbershop.rsi/scissors.png b/Resources/Textures/Objects/Specific/barbershop.rsi/scissors.png new file mode 100644 index 00000000000..81022ca37b6 Binary files /dev/null and b/Resources/Textures/Objects/Specific/barbershop.rsi/scissors.png differ diff --git a/Resources/Textures/Objects/Specific/barbershop.rsi/tonic0.png b/Resources/Textures/Objects/Specific/barbershop.rsi/tonic0.png new file mode 100644 index 00000000000..76daf43be28 Binary files /dev/null and b/Resources/Textures/Objects/Specific/barbershop.rsi/tonic0.png differ diff --git a/Resources/Textures/Objects/Specific/barbershop.rsi/tonic1.png b/Resources/Textures/Objects/Specific/barbershop.rsi/tonic1.png new file mode 100644 index 00000000000..969fc2e7ec1 Binary files /dev/null and b/Resources/Textures/Objects/Specific/barbershop.rsi/tonic1.png differ diff --git a/Resources/Textures/Objects/Storage/boxes.rsi/meta.json b/Resources/Textures/Objects/Storage/boxes.rsi/meta.json index 23868a906f4..53ac39b639b 100644 --- a/Resources/Textures/Objects/Storage/boxes.rsi/meta.json +++ b/Resources/Textures/Objects/Storage/boxes.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/cc65477c04f7403ca8a457bd5bae69a01abadbf0, encryptokey was taken from Baystation12 at https://github.com/infinitystation/Baystation12/blob/073f678cdce92edb8fcd55f9ffc9f0523bf31506/icons/obj/radio.dmi and modified by lapatison. boxwidetoy, shelltoy, swab, flare, inflatable, trashbag, magazine, holo and forensic created by potato1234x (github) for ss14 based on toys.rsi, mouth_swab.rsi, flare.rsi, inflatable_wall.rsi, trashbag.rsi, caseless_pistol_mag.rsi, guardians.rsi and bureaucracy.rsi respectively, candle and darts created by TheShuEd for ss14, vials was drawn by Ubaser, evidence_markers by moomoobeef.", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/cc65477c04f7403ca8a457bd5bae69a01abadbf0, encryptokey was taken from Baystation12 at https://github.com/infinitystation/Baystation12/blob/073f678cdce92edb8fcd55f9ffc9f0523bf31506/icons/obj/radio.dmi and modified by lapatison. boxwidetoy, shelltoy, swab, flare, inflatable, trashbag, magazine, holo and forensic created by potato1234x (github) for ss14 based on toys.rsi, mouth_swab.rsi, flare.rsi, inflatable_wall.rsi, trashbag.rsi, caseless_pistol_mag.rsi, guardians.rsi and bureaucracy.rsi respectively, candle and darts created by TheShuEd for ss14, throwing_knives and vials was drawn by Ubaser, evidence_markers by moomoobeef.", "size": { "x": 32, "y": 32 @@ -35,7 +35,7 @@ "name": "sechud" }, { - "name": "bottle" + "name": "bottle" }, { "name": "box" @@ -142,6 +142,9 @@ { "name": "syringe" }, + { + "name": "throwing_knives" + }, { "name": "trashbag" }, @@ -152,12 +155,12 @@ "name": "writing_of_doom" }, { - "name": "headset" - }, + "name": "headset" + }, { - "name": "encryptokey" - }, - { + "name": "encryptokey" + }, + { "name": "inhand-left", "directions": 4 }, diff --git a/Resources/Textures/Objects/Storage/boxes.rsi/throwing_knives.png b/Resources/Textures/Objects/Storage/boxes.rsi/throwing_knives.png new file mode 100644 index 00000000000..834410a43ef Binary files /dev/null and b/Resources/Textures/Objects/Storage/boxes.rsi/throwing_knives.png differ diff --git a/Resources/Textures/Objects/Storage/boxicons.rsi/meta.json b/Resources/Textures/Objects/Storage/boxicons.rsi/meta.json index 858fc7c4e54..935b0b9f8b3 100644 --- a/Resources/Textures/Objects/Storage/boxicons.rsi/meta.json +++ b/Resources/Textures/Objects/Storage/boxicons.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from baystation at https://github.com/Baystation12/Baystation12/commit/bc9fbb1722530596e3aa7522ee407280b323ad43, vials drawn by Ubaser, tracks made by Fazansen(https://github.com/Fazansen).", + "copyright": "Taken from baystation at https://github.com/Baystation12/Baystation12/commit/bc9fbb1722530596e3aa7522ee407280b323ad43, throwing_knives and vials are drawn by Ubaser, tracks made by Fazansen(https://github.com/Fazansen).", "size": { "x": 32, "y": 32 @@ -76,6 +76,9 @@ { "name": "syringe" }, + { + "name": "throwing_knives" + }, { "name": "ziptie" }, diff --git a/Resources/Textures/Objects/Storage/boxicons.rsi/throwing_knives.png b/Resources/Textures/Objects/Storage/boxicons.rsi/throwing_knives.png new file mode 100644 index 00000000000..b2af7bce884 Binary files /dev/null and b/Resources/Textures/Objects/Storage/boxicons.rsi/throwing_knives.png differ diff --git a/Resources/Textures/Objects/Tools/emag.rsi/icon.png b/Resources/Textures/Objects/Tools/emag.rsi/icon.png index 61c283cfd01..912fd6be821 100644 Binary files a/Resources/Textures/Objects/Tools/emag.rsi/icon.png and b/Resources/Textures/Objects/Tools/emag.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Tools/emag.rsi/meta.json b/Resources/Textures/Objects/Tools/emag.rsi/meta.json index 66fc62d663d..d90e37eb584 100644 --- a/Resources/Textures/Objects/Tools/emag.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/emag.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation wiki at https://tgstation13.org/wiki/File:Emag.png, inhand sprites modified from tgstation at commit https://github.com/tgstation/tgstation/commit/d917f4c2a088419d5c3aec7656b7ff8cebd1822e", + "copyright": "Taken from https://github.com/tgstation/tgstation", "size": { "x": 32, "y": 32 @@ -16,7 +16,17 @@ "directions": 4 }, { - "name": "icon" + "name": "icon", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] } ] } diff --git a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/meta.json index fc15bfadef2..d75e46fbf42 100644 --- a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from vgstation at https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/ // Hands sprites taken from vgstation at https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_nocell.png b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_nocell.png index 8c4fbac7fdb..bf08ef9cc76 100644 Binary files a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_nocell.png and b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_nocell.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_off.png b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_off.png index 59940f44ca4..8704ab6bcfc 100644 Binary files a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_off.png and b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_off.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_on.png b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_on.png index 2132190ad45..2adbe76e9e1 100644 Binary files a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_on.png and b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_on.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/equipped-BELT.png b/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/equipped-BELT.png new file mode 100644 index 00000000000..ea2a6bbc072 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/equipped-BELT.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/icon.png b/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/icon.png new file mode 100644 index 00000000000..2c61755b52c Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/inhand-left.png b/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/inhand-left.png new file mode 100644 index 00000000000..5988d571dc1 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/inhand-left.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/inhand-right.png b/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/inhand-right.png new file mode 100644 index 00000000000..09c015efac5 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/inhand-right.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/meta.json new file mode 100644 index 00000000000..373d2d77701 --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Drawn by Ubaser.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-BELT", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner.png index 8daa67ae23e..8db1e80fdd1 100644 Binary files a/Resources/Textures/Structures/Decoration/banner.rsi/banner.png and b/Resources/Textures/Structures/Decoration/banner.rsi/banner.png differ diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner_cargo.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner_cargo.png index ff808bbc8bb..899c8d6e4cb 100644 Binary files a/Resources/Textures/Structures/Decoration/banner.rsi/banner_cargo.png and b/Resources/Textures/Structures/Decoration/banner.rsi/banner_cargo.png differ diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner_engineering.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner_engineering.png index da76b044c1e..e45b9e35303 100644 Binary files a/Resources/Textures/Structures/Decoration/banner.rsi/banner_engineering.png and b/Resources/Textures/Structures/Decoration/banner.rsi/banner_engineering.png differ diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner_medical.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner_medical.png index 5bbd100773c..c2dc11d21bf 100644 Binary files a/Resources/Textures/Structures/Decoration/banner.rsi/banner_medical.png and b/Resources/Textures/Structures/Decoration/banner.rsi/banner_medical.png differ diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner_science.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner_science.png index 8ae607cdcd4..1da59b8a315 100644 Binary files a/Resources/Textures/Structures/Decoration/banner.rsi/banner_science.png and b/Resources/Textures/Structures/Decoration/banner.rsi/banner_science.png differ diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner_security.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner_security.png index 42114c515b2..cfd18620e04 100644 Binary files a/Resources/Textures/Structures/Decoration/banner.rsi/banner_security.png and b/Resources/Textures/Structures/Decoration/banner.rsi/banner_security.png differ diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner_syndicate.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner_syndicate.png index c8424057d02..6b39694e7a7 100644 Binary files a/Resources/Textures/Structures/Decoration/banner.rsi/banner_syndicate.png and b/Resources/Textures/Structures/Decoration/banner.rsi/banner_syndicate.png differ diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/meta.json b/Resources/Textures/Structures/Decoration/banner.rsi/meta.json index 2de33ea0290..2df45b016ce 100644 --- a/Resources/Textures/Structures/Decoration/banner.rsi/meta.json +++ b/Resources/Textures/Structures/Decoration/banner.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "https://github.com/tgstation/tgstation/commit/fa9e44d937026d5a2ba72615afccf2f18a87c485 | banner_syndicate sprited by mureixlol (Discord)", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise // banner_revolution, banner-red, banner-blue, banner-yellow, banner-green Taken from https://github.com/tgstation/tgstation/commit/fa9e44d937026d5a2ba72615afccf2f18a87c485", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Furniture/furniture.rsi/meta.json b/Resources/Textures/Structures/Furniture/furniture.rsi/meta.json index 1f7049dfbe1..5afc1b2b0f1 100644 --- a/Resources/Textures/Structures/Furniture/furniture.rsi/meta.json +++ b/Resources/Textures/Structures/Furniture/furniture.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/d5cb4288ec5f7cb9fb5b6f6e798f4c64cd82cd09, Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/9d7ff729b6b89eee0b3d750327f9fbaff4aeb045", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/d5cb4288ec5f7cb9fb5b6f6e798f4c64cd82cd09, Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/9d7ff729b6b89eee0b3d750327f9fbaff4aeb045, Taken from https://github.com/ParadiseSS13/Paradise", "size": { "x": 32, "y": 32 @@ -29,4 +29,4 @@ "name": "dresser" } ] -} \ No newline at end of file +} diff --git a/Resources/Textures/Structures/Furniture/furniture.rsi/rack.png b/Resources/Textures/Structures/Furniture/furniture.rsi/rack.png index b299cc49e14..cb146b54125 100644 Binary files a/Resources/Textures/Structures/Furniture/furniture.rsi/rack.png and b/Resources/Textures/Structures/Furniture/furniture.rsi/rack.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/adh-tool-broken.png b/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/adh-tool-broken.png new file mode 100644 index 00000000000..97d8197527d Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/adh-tool-broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/adh-tool-deny.png b/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/adh-tool-deny.png new file mode 100644 index 00000000000..e2f4b80384a Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/adh-tool-deny.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/adh-tool-off.png b/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/adh-tool-off.png new file mode 100644 index 00000000000..04e2ecd0d4a Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/adh-tool-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/adh-tool-panel.png b/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/adh-tool-panel.png new file mode 100644 index 00000000000..e50605569e8 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/adh-tool-panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/adh-tool-vend.png b/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/adh-tool-vend.png new file mode 100644 index 00000000000..660e82299f2 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/adh-tool-vend.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/adh-tool.png b/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/adh-tool.png new file mode 100644 index 00000000000..23d4581828a Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/adh-tool.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/meta.json new file mode 100644 index 00000000000..257c756722c --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/adh.rsi/meta.json @@ -0,0 +1,91 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "adh-tool", + "directions": 4 + }, + { + "name": "adh-tool-vend", + "directions": 4, + "delays": [ + [ + 0.1, + 0.4, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1 + ] + ] + }, + { + "name": "adh-tool-deny", + "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, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "adh-tool-off", + "directions": 4 + }, + { + "name": "adh-tool-broken", + "directions": 4 + }, + { + "name": "adh-tool-panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/broken.png index 671a4701fe5..69a18345dd6 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/deny-unshaded.png index 4b8fc2a3e58..1200d326bdc 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/deny-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/eject-unshaded.png index 505d5f3861a..5479f208ea0 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/eject-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/meta.json index 1c53b7c6ccc..6467c185806 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/meta.json @@ -1,45 +1,87 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from baystation at https://github.com/Baystation12/Baystation12/commit/f200ae08d71ecbc91412ee650a334981892f5177 and modified by potato1234x", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", "size": { "x": 32, "y": 32 }, "states": [ { - "name": "normal-unshaded" + "name": "normal-unshaded", + "directions": 4 }, { - "name": "broken" - }, - { - "name": "deny-unshaded", + "name": "eject-unshaded", + "directions": 4, "delays": [ [ 0.1, 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, 0.1 ] ] }, { - "name": "off" - }, - { - "name": "panel" - }, - { - "name": "eject-unshaded", + "name": "deny-unshaded", + "directions": 4, "delays": [ [ 0.1, 0.1, - 0.8, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, 0.1, 0.1 ] ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 } ] -} +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/normal-unshaded.png index f92b13efd1d..25b8cbb6eaf 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/normal-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/off.png index c0e947c93fd..c2f1a7370aa 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/panel.png index 15e5dbcafb1..9c868ef2cd0 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/panel.png and b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/broken.png index a7608d24c10..0b413ac46da 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/coffee-hellfire.png b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/coffee-hellfire.png new file mode 100644 index 00000000000..bbca7da7b69 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/coffee-hellfire.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/deny-unshaded.png index 826a5517e3c..e16f8bea12e 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/deny-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/eject-unshaded.png index 8b66206bd75..283918001c0 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/eject-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/meta.json index 6a11e09a83e..578976fe854 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/meta.json @@ -1,38 +1,49 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from baystation at https://github.com/Baystation12/Baystation12/commit/f200ae08d71ecbc91412ee650a334981892f5177 and modified by potato1234x (github) for ss14", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", "size": { "x": 32, "y": 32 }, "states": [ { - "name": "normal-unshaded" - }, - { - "name": "broken" - }, - { - "name": "deny-unshaded", + "name": "coffee-hellfire", "delays": [ [ - 0.1, - 0.1, - 0.1 + 0.25, + 0.25, + 0.25 ] ] }, { - "name": "off" - }, - { - "name": "panel" - }, - { - "name": "screen", + "name": "normal-unshaded", + "directions": 4, "delays": [ [ + 0.6, + 0.6, + 0.6, + 0.6, + 0.6 + ], + [ + 0.6, + 0.6, + 0.6, + 0.6, + 0.6 + ], + [ + 0.6, + 0.6, + 0.6, + 0.6, + 0.6 + ], + [ + 0.6, 0.6, 0.6, 0.6, @@ -42,6 +53,7 @@ }, { "name": "eject-unshaded", + "directions": 4, "delays": [ [ 0.2, @@ -58,8 +70,124 @@ 0.2, 0.2, 0.8 + ], + [ + 0.2, + 0.2, + 0.6, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.2, + 0.2, + 0.2, + 0.2, + 0.8 + ], + [ + 0.2, + 0.2, + 0.6, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.2, + 0.2, + 0.2, + 0.2, + 0.8 + ], + [ + 0.2, + 0.2, + 0.6, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.2, + 0.2, + 0.2, + 0.2, + 0.8 + ] + ] + }, + { + "name": "deny-unshaded", + "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 ] ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "screen", + "directions": 4, + "delays": [ + [ + 0.6, + 0.6, + 0.6, + 0.6 + ], + [ + 0.6, + 0.6, + 0.6, + 0.6 + ], + [ + 0.6, + 0.6, + 0.6, + 0.6 + ], + [ + 0.6, + 0.6, + 0.6, + 0.6 + ] + ] + }, + { + "name": "panel", + "directions": 4 } ] -} +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/normal-unshaded.png index 1a7fd066cda..b58f33c4333 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/normal-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/off.png index 8e7814af604..d314913811b 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/panel.png index 1d9416bb74c..33fb7adec2c 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/panel.png and b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/screen.png b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/screen.png index cc64a9de577..4e18d0b306e 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/screen.png and b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/screen.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/broken.png index 6c296eb7b62..3cc0c94f530 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/deny-unshaded.png index 0a5ff43f0ce..a2506b18b30 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/deny-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/eject-unshaded.png index 9efb08705fa..15d0bf6f27f 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/eject-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/meta.json index 3f7f1d8a0a7..83bee56da64 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/1516a728931b4985c1e86f0c5995a5aa1554a1ad and modified by Swept", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", "size": { "x": 32, "y": 32 @@ -9,48 +9,82 @@ "states": [ { "name": "normal-unshaded", + "directions": 4 + }, + { + "name": "eject-unshaded", + "directions": 4, "delays": [ [ - 2.5, 0.1, - 3.4, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, 0.1 ] ] }, - { - "name": "broken" - }, - { - "name": "normal" - }, { "name": "deny-unshaded", + "directions": 4, "delays": [ [ 0.1, 0.1, 0.1 - ] - ] - }, - { - "name": "eject-unshaded", - "delays": [ + ], + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ], [ - 0.5, 0.1, - 1.0, 0.1, 0.1 ] ] }, { - "name": "off" + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 }, { - "name": "panel" + "name": "normal" } ] } diff --git a/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/normal-unshaded.png index 96ee10550b6..2861c3d7beb 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/normal-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/off.png index acc26679bd3..e8c9485dcc4 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/panel.png index 9e3049e07d7..4a1a54be105 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/panel.png and b/Resources/Textures/Structures/Machines/VendingMachines/cola.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/broken.png index 0f9501592a8..1f7d6214ca0 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/deny-unshaded.png new file mode 100644 index 00000000000..bf94ebee5eb Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/eject-unshaded.png index 73678935bc4..89fa2934a61 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/eject-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/meta.json index 5c200a94a96..05888a69835 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/meta.json @@ -1,54 +1,99 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/1516a728931b4985c1e86f0c5995a5aa1554a1ad and modified by Swept", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", "size": { "x": 32, "y": 32 }, "states": [ { - "name": "broken" + "name": "normal-unshaded", + "directions": 4 }, { "name": "eject-unshaded", + "directions": 4, "delays": [ [ 0.1, - 0.7, - 0.7, - 0.7, - 0.7, - 0.7, - 0.7, - 0.7, - 0.7, - 0.7, - 0.7, - 0.7, - 0.7, - 0.7, - 0.7, + 0.1, + 0.1, + 0.6, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.6, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.6, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.6, + 0.1, + 0.1, + 0.1, 0.1 ] ] }, { - "name": "normal-unshaded", + "name": "deny-unshaded", + "directions": 4, "delays": [ [ - 2.5, - 0.05, - 3.4, - 0.05 + 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": "off" + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 }, { - "name": "panel" + "name": "panel", + "directions": 4 } ] -} +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/normal-unshaded.png index 5625997714f..b0084972030 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/normal-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/off.png index dc61f221c0e..9463f7ce992 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/panel.png index 80912168e4e..c0a5b763bcd 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/panel.png and b/Resources/Textures/Structures/Machines/VendingMachines/dinnerware.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/drying_rack-close-off.png b/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/drying_rack-close-off.png new file mode 100644 index 00000000000..0eaaf7378ea Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/drying_rack-close-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/drying_rack-close.png b/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/drying_rack-close.png new file mode 100644 index 00000000000..26925d12932 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/drying_rack-close.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/drying_rack-off.png b/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/drying_rack-off.png new file mode 100644 index 00000000000..5faefa4a5b6 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/drying_rack-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/drying_rack-plant-off.png b/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/drying_rack-plant-off.png new file mode 100644 index 00000000000..41dd42d3654 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/drying_rack-plant-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/drying_rack-plant.png b/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/drying_rack-plant.png new file mode 100644 index 00000000000..57c3f453828 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/drying_rack-plant.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/drying_rack.png b/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/drying_rack.png new file mode 100644 index 00000000000..8f571bcadf3 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/drying_rack.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/meta.json new file mode 100644 index 00000000000..45c704ee8f8 --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/dryingrack.rsi/meta.json @@ -0,0 +1,61 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "drying_rack", + "directions": 4 + }, + { + "name": "drying_rack-plant", + "directions": 4 + }, + { + "name": "drying_rack-close", + "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 + ] + ] + }, + { + "name": "drying_rack-off", + "directions": 4 + }, + { + "name": "drying_rack-plant-off", + "directions": 4 + }, + { + "name": "drying_rack-close-off", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/broken.png index cfd081cf6b4..e90228b1bc2 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/deny-unshaded.png index 4bac2c91b1d..1de356b1457 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/deny-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/eject-unshaded.png index 99c7cfeea1f..65ba08ddf02 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/eject-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/meta.json index 35b29c7356e..24c7cd05f45 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/meta.json @@ -1,52 +1,91 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/1516a728931b4985c1e86f0c5995a5aa1554a1ad and modified by Swept", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", "size": { "x": 32, "y": 32 }, "states": [ { - "name": "broken" + "name": "normal-unshaded", + "directions": 4 }, { - "name": "deny-unshaded", + "name": "eject-unshaded", + "directions": 4, "delays": [ [ 0.1, + 0.4, 0.1 - ] - ] - }, - { - "name": "eject-unshaded", - "delays": [ + ], + [ + 0.1, + 0.4, + 0.1 + ], [ 0.1, 0.4, - 0.2, + 0.1 + ], + [ + 0.1, 0.4, 0.1 ] ] }, { - "name": "normal-unshaded", + "name": "deny-unshaded", + "directions": 4, "delays": [ [ - 2.5, - 0.05, - 3.4, - 0.05 + 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, + 0.1, + 0.1, + 0.1, + 0.1 ] ] }, { - "name": "off" + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 }, { - "name": "panel" + "name": "panel", + "directions": 4 } ] -} +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/normal-unshaded.png index d9f4a8ab47f..a15f723ec9f 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/normal-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/off.png index b38fbe41330..9eb4e5e6501 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/panel.png index faddc533514..e50605569e8 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/panel.png and b/Resources/Textures/Structures/Machines/VendingMachines/engivend.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/broken.png new file mode 100644 index 00000000000..c7b4d893d56 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/deny-unshaded.png new file mode 100644 index 00000000000..c0a2ff42dc8 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/eject-unshaded.png new file mode 100644 index 00000000000..9386d30925d Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/meta.json new file mode 100644 index 00000000000..24c7cd05f45 --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/meta.json @@ -0,0 +1,91 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "normal-unshaded", + "directions": 4 + }, + { + "name": "eject-unshaded", + "directions": 4, + "delays": [ + [ + 0.1, + 0.4, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1 + ] + ] + }, + { + "name": "deny-unshaded", + "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, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/normal-unshaded.png new file mode 100644 index 00000000000..ef5dbcba22a Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/off.png new file mode 100644 index 00000000000..e58a27fcc38 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/panel.png new file mode 100644 index 00000000000..3b9c62a5241 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/engivend_green.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/broken.png new file mode 100644 index 00000000000..f91f26a9189 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/deny-unshaded.png new file mode 100644 index 00000000000..4beea443bb9 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/eject-unshaded.png new file mode 100644 index 00000000000..ba4b8c488ac Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/meta.json new file mode 100644 index 00000000000..5bf6de474a7 --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/meta.json @@ -0,0 +1,165 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "normal-unshaded", + "directions": 4 + }, + { + "name": "eject-unshaded", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ] + ] + }, + { + "name": "deny-unshaded", + "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 + ] + ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "screen", + "directions": 4, + "delays": [ + [ + 2, + 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 + ], + [ + 2, + 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 + ], + [ + 2, + 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 + ], + [ + 2, + 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": "panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/normal-unshaded.png new file mode 100644 index 00000000000..3d28dddae28 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/off.png new file mode 100644 index 00000000000..84269ea1c17 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/panel.png new file mode 100644 index 00000000000..f61777362a1 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/screen.png b/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/screen.png new file mode 100644 index 00000000000..ca53e57d5c1 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fitness.rsi/screen.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-1-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-1-off.png new file mode 100644 index 00000000000..baa3dbd9e75 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-1-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-1.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-1.png new file mode 100644 index 00000000000..b9c3f06e0bf Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-1.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-2-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-2-off.png new file mode 100644 index 00000000000..895d100f0e0 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-2-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-2.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-2.png new file mode 100644 index 00000000000..e5affd170d8 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-2.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-3-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-3-off.png new file mode 100644 index 00000000000..27296a3e5a1 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-3-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-3.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-3.png new file mode 100644 index 00000000000..05c766a42a8 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-3.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-4-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-4-off.png new file mode 100644 index 00000000000..4cd21925199 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-4-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-4.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-4.png new file mode 100644 index 00000000000..929907ef5ce Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/chem-4.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-1-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-1-off.png new file mode 100644 index 00000000000..4409660a221 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-1-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-1.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-1.png new file mode 100644 index 00000000000..84ba74ff81a Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-1.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-2-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-2-off.png new file mode 100644 index 00000000000..9f8857c0b12 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-2-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-2.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-2.png new file mode 100644 index 00000000000..47399e6d5f7 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-2.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-3-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-3-off.png new file mode 100644 index 00000000000..22ac52faba5 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-3-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-3.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-3.png new file mode 100644 index 00000000000..14deaf5226f Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-3.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-4-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-4-off.png new file mode 100644 index 00000000000..1695b513853 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-4-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-4.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-4.png new file mode 100644 index 00000000000..844039637b9 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/drink-4.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/empty-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/empty-off.png new file mode 100644 index 00000000000..e799fd79b02 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/empty-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/empty.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/empty.png new file mode 100644 index 00000000000..61660ac2297 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/empty.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-1-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-1-off.png new file mode 100644 index 00000000000..db83adbad36 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-1-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-1.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-1.png new file mode 100644 index 00000000000..4914d8278c0 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-1.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-2-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-2-off.png new file mode 100644 index 00000000000..0189382852c Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-2-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-2.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-2.png new file mode 100644 index 00000000000..fec9938613f Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-2.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-3-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-3-off.png new file mode 100644 index 00000000000..b1280d3c1a7 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-3-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-3.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-3.png new file mode 100644 index 00000000000..782f9fdf7d3 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-3.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-4-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-4-off.png new file mode 100644 index 00000000000..a4f547f3db8 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-4-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-4.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-4.png new file mode 100644 index 00000000000..4cf55699a58 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/food-4.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/meta.json new file mode 100644 index 00000000000..a9902bf2343 --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/meta.json @@ -0,0 +1,147 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "empty", + "directions": 4 + }, + { + "name": "chem-1", + "directions": 4 + }, + { + "name": "chem-2", + "directions": 4 + }, + { + "name": "chem-3", + "directions": 4 + }, + { + "name": "chem-4", + "directions": 4 + }, + { + "name": "drink-1", + "directions": 4 + }, + { + "name": "drink-2", + "directions": 4 + }, + { + "name": "drink-3", + "directions": 4 + }, + { + "name": "drink-4", + "directions": 4 + }, + { + "name": "slime-1", + "directions": 4 + }, + { + "name": "slime-2", + "directions": 4 + }, + { + "name": "slime-3", + "directions": 4 + }, + { + "name": "slime-4", + "directions": 4 + }, + { + "name": "food-1", + "directions": 4 + }, + { + "name": "food-2", + "directions": 4 + }, + { + "name": "food-3", + "directions": 4 + }, + { + "name": "food-4", + "directions": 4 + }, + { + "name": "empty-off", + "directions": 4 + }, + { + "name": "chem-1-off", + "directions": 4 + }, + { + "name": "chem-2-off", + "directions": 4 + }, + { + "name": "chem-3-off", + "directions": 4 + }, + { + "name": "chem-4-off", + "directions": 4 + }, + { + "name": "drink-1-off", + "directions": 4 + }, + { + "name": "drink-2-off", + "directions": 4 + }, + { + "name": "drink-3-off", + "directions": 4 + }, + { + "name": "drink-4-off", + "directions": 4 + }, + { + "name": "slime-1-off", + "directions": 4 + }, + { + "name": "slime-2-off", + "directions": 4 + }, + { + "name": "slime-3-off", + "directions": 4 + }, + { + "name": "slime-4-off", + "directions": 4 + }, + { + "name": "food-1-off", + "directions": 4 + }, + { + "name": "food-2-off", + "directions": 4 + }, + { + "name": "food-3-off", + "directions": 4 + }, + { + "name": "food-4-off", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-1-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-1-off.png new file mode 100644 index 00000000000..4566bfba4f2 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-1-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-1.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-1.png new file mode 100644 index 00000000000..c39b376b758 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-1.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-2-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-2-off.png new file mode 100644 index 00000000000..5d9301b63c0 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-2-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-2.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-2.png new file mode 100644 index 00000000000..05eb40cc810 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-2.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-3-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-3-off.png new file mode 100644 index 00000000000..c491bcbf10e Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-3-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-3.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-3.png new file mode 100644 index 00000000000..20ecf0f0877 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-3.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-4-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-4-off.png new file mode 100644 index 00000000000..789b278a0b6 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-4-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-4.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-4.png new file mode 100644 index 00000000000..dd526f98103 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgecontents.rsi/slime-4.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-broken.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-broken.png new file mode 100644 index 00000000000..79c103b4729 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-deny.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-deny.png new file mode 100644 index 00000000000..aa3ed702229 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-deny.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-off.png new file mode 100644 index 00000000000..3eda6154dca Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-panel-broken.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-panel-broken.png new file mode 100644 index 00000000000..751b80af286 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-panel-broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-panel.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-panel.png new file mode 100644 index 00000000000..907ada864fb Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-sidepanel.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-sidepanel.png new file mode 100644 index 00000000000..13002e5d4dc Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-sidepanel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-top-broken.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-top-broken.png new file mode 100644 index 00000000000..800fa6ae176 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-top-broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-top.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-top.png new file mode 100644 index 00000000000..dba2c6a9017 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-top.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-vend.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-vend.png new file mode 100644 index 00000000000..62eb44a95dc Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark-vend.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark.png new file mode 100644 index 00000000000..edcf630e5be Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/fridge_dark.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/meta.json new file mode 100644 index 00000000000..9754994b516 --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/meta.json @@ -0,0 +1,197 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "screen_small", + "directions": 4, + "delays": [ + [ + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "fridge_dark-top", + "directions": 4 + }, + { + "name": "fridge_dark-top-broken", + "directions": 4 + }, + { + "name": "fridge_dark-sidepanel", + "directions": 4 + }, + { + "name": "fridge_dark-panel-broken", + "directions": 4 + }, + { + "name": "fridge_dark", + "directions": 4 + }, + { + "name": "fridge_dark-vend", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.8 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.8 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.8 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.8 + ] + ] + }, + { + "name": "fridge_dark-deny", + "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, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "fridge_dark-off", + "directions": 4 + }, + { + "name": "fridge_dark-broken", + "directions": 4 + }, + { + "name": "fridge_dark-panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/screen_small.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/screen_small.png new file mode 100644 index 00000000000..8f7e3ae2882 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedark.rsi/screen_small.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-broken.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-broken.png new file mode 100644 index 00000000000..7295f0f4fd7 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-deny.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-deny.png new file mode 100644 index 00000000000..cf531e92c7c Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-deny.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-off.png new file mode 100644 index 00000000000..e788c2b4b91 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-panel-broken.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-panel-broken.png new file mode 100644 index 00000000000..d955bc3ce27 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-panel-broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-panel.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-panel.png new file mode 100644 index 00000000000..aa50a1978db Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-sidepanel.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-sidepanel.png new file mode 100644 index 00000000000..802fedbec3e Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-sidepanel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-top-broken.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-top-broken.png new file mode 100644 index 00000000000..615af3fd214 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-top-broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-top.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-top.png new file mode 100644 index 00000000000..468f253660b Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-top.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-vend.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-vend.png new file mode 100644 index 00000000000..ca5fd3177e5 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks-vend.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks.png new file mode 100644 index 00000000000..a48da3512ce Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/fridge_drinks.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/meta.json new file mode 100644 index 00000000000..fe0f8a6680b --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/meta.json @@ -0,0 +1,197 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "screen_small", + "directions": 4, + "delays": [ + [ + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "fridge_drinks-top", + "directions": 4 + }, + { + "name": "fridge_drinks-top-broken", + "directions": 4 + }, + { + "name": "fridge_drinks-sidepanel", + "directions": 4 + }, + { + "name": "fridge_drinks-panel-broken", + "directions": 4 + }, + { + "name": "fridge_drinks", + "directions": 4 + }, + { + "name": "fridge_drinks-vend", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.8 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.8 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.8 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.8 + ] + ] + }, + { + "name": "fridge_drinks-deny", + "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, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "fridge_drinks-off", + "directions": 4 + }, + { + "name": "fridge_drinks-broken", + "directions": 4 + }, + { + "name": "fridge_drinks-panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/screen_small.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/screen_small.png new file mode 100644 index 00000000000..8f7e3ae2882 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgedrink.rsi/screen_small.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-broken.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-broken.png new file mode 100644 index 00000000000..cb8558ca3a7 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-deny.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-deny.png new file mode 100644 index 00000000000..654387df9d1 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-deny.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-off.png new file mode 100644 index 00000000000..22f0fdf1966 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-panel-broken.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-panel-broken.png new file mode 100644 index 00000000000..d955bc3ce27 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-panel-broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-panel.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-panel.png new file mode 100644 index 00000000000..aa50a1978db Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-sidepanel.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-sidepanel.png new file mode 100644 index 00000000000..802fedbec3e Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-sidepanel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-top-broken.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-top-broken.png new file mode 100644 index 00000000000..615af3fd214 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-top-broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-top.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-top.png new file mode 100644 index 00000000000..468f253660b Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-top.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-vend.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-vend.png new file mode 100644 index 00000000000..fa21a3a11a4 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food-vend.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food.png new file mode 100644 index 00000000000..7ac7d9801a7 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/fridge_food.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/meta.json new file mode 100644 index 00000000000..5cb6003982c --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/meta.json @@ -0,0 +1,189 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "screen_small", + "directions": 4, + "delays": [ + [ + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "fridge_food-top", + "directions": 4 + }, + { + "name": "fridge_food-top-broken", + "directions": 4 + }, + { + "name": "fridge_food-sidepanel", + "directions": 4 + }, + { + "name": "fridge_food-panel-broken", + "directions": 4 + }, + { + "name": "fridge_food", + "directions": 4 + }, + { + "name": "fridge_food-vend", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.8 + ], + [ + 0.1, + 0.1, + 0.8 + ], + [ + 0.1, + 0.1, + 0.8 + ], + [ + 0.1, + 0.1, + 0.8 + ] + ] + }, + { + "name": "fridge_food-deny", + "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, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "fridge_food-off", + "directions": 4 + }, + { + "name": "fridge_food-broken", + "directions": 4 + }, + { + "name": "fridge_food-panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/screen_small.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/screen_small.png new file mode 100644 index 00000000000..8f7e3ae2882 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgefood.rsi/screen_small.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-broken.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-broken.png new file mode 100644 index 00000000000..c3b5de48af7 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-deny.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-deny.png new file mode 100644 index 00000000000..ee13f27c570 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-deny.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-off.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-off.png new file mode 100644 index 00000000000..2481ff6769e Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-panel.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-panel.png new file mode 100644 index 00000000000..1b51bec320a Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-sidepanel-broken.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-sidepanel-broken.png new file mode 100644 index 00000000000..5b773eef69a Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-sidepanel-broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-sidepanel.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-sidepanel.png new file mode 100644 index 00000000000..900359268b8 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-sidepanel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-top-broken.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-top-broken.png new file mode 100644 index 00000000000..995b9d07309 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-top-broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-top.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-top.png new file mode 100644 index 00000000000..8fbd5dfc1a1 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-top.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-vend.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-vend.png new file mode 100644 index 00000000000..33faefc1fa1 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci-vend.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci.png new file mode 100644 index 00000000000..79d5e92ec07 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/fridge_sci.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/meta.json new file mode 100644 index 00000000000..0cb0e891e88 --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/meta.json @@ -0,0 +1,193 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "screen_big", + "directions": 4, + "delays": [ + [ + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 2, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "fridge_sci-top", + "directions": 4 + }, + { + "name": "fridge_sci-top-broken", + "directions": 4 + }, + { + "name": "fridge_sci-sidepanel", + "directions": 4 + }, + { + "name": "fridge_sci-sidepanel-broken", + "directions": 4 + }, + { + "name": "fridge_sci", + "directions": 4 + }, + { + "name": "fridge_sci-vend", + "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 + ] + ] + }, + { + "name": "fridge_sci-deny", + "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, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "fridge_sci-off", + "directions": 4 + }, + { + "name": "fridge_sci-broken", + "directions": 4 + }, + { + "name": "fridge_sci-panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/screen_big.png b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/screen_big.png new file mode 100644 index 00000000000..9ff09281106 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/fridgesci.rsi/screen_big.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/broken.png index be3c4f4d694..83843358315 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/deny-unshaded.png new file mode 100644 index 00000000000..447914b8101 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/eject-unshaded.png index d5814969aae..329c15295bf 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/eject-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/meta.json index d45bae2bf97..6467c185806 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/meta.json @@ -1,43 +1,87 @@ { - "version": 1, - "size": { - "x": 32, - "y": 32 + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "normal-unshaded", + "directions": 4 }, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation https://github.com/tgstation/tgstation/commit/dd67e1e4e10bcf632b82b8b14b6a8479d80d5f78#diff-34173d670aca65c110ef18312c32abc4e05c84f33a9402248a32000e45acd0d3", - "states": [ - { - "name": "normal-unshaded", - "delays": [ - [ - 2.5, - 0.1, - 3.4, - 0.1 - ] - ] - }, - { - "name": "broken" - }, - { - "name": "eject-unshaded", - "delays": [ - [ - 0.5, - 0.1, - 1.0, - 0.1, - 0.1 - ] - ] - }, - { - "name": "off" - }, - { - "name": "panel" - } - ] -} + { + "name": "eject-unshaded", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ] + ] + }, + { + "name": "deny-unshaded", + "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 + ] + ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/normal-unshaded.png index d7ac9ba8c49..a1578bfc39f 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/normal-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/off.png index d688eea5252..39c2bfb50cf 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/panel.png index 9e3049e07d7..6922e23f3d1 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/panel.png and b/Resources/Textures/Structures/Machines/VendingMachines/games.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/broken.png new file mode 100644 index 00000000000..6a6c5c81bfd Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/deny-unshaded.png new file mode 100644 index 00000000000..540e1af3fcf Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/eject-unshaded.png new file mode 100644 index 00000000000..10fc965b2df Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/meta.json new file mode 100644 index 00000000000..6467c185806 --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/meta.json @@ -0,0 +1,87 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "normal-unshaded", + "directions": 4 + }, + { + "name": "eject-unshaded", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ] + ] + }, + { + "name": "deny-unshaded", + "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 + ] + ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/normal-unshaded.png new file mode 100644 index 00000000000..095c278ab9d Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/off.png new file mode 100644 index 00000000000..69ca73fbc3c Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/panel.png new file mode 100644 index 00000000000..7b9a8a6dbd7 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/generic.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/broken.png new file mode 100644 index 00000000000..d594e68a03c Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/deny-unshaded.png new file mode 100644 index 00000000000..b5e57139103 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/eject-unshaded.png new file mode 100644 index 00000000000..a99c9f5894a Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/heater.png b/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/heater.png new file mode 100644 index 00000000000..40ef8ac864c Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/heater.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/meta.json new file mode 100644 index 00000000000..11dd079a2cc --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/meta.json @@ -0,0 +1,187 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "normal-unshaded", + "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, + 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, + 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": "eject-unshaded", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "deny-unshaded", + "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 + ] + ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "heater", + "directions": 4, + "delays": [ + [ + 1, + 0.1, + 0.1 + ], + [ + 1, + 0.1, + 0.1 + ], + [ + 1, + 0.1, + 0.1 + ], + [ + 1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/normal-unshaded.png new file mode 100644 index 00000000000..03668ae185e Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/off.png new file mode 100644 index 00000000000..770bd85da2a Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/panel.png new file mode 100644 index 00000000000..8ec12cf754a Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/hotfood.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/broken.png new file mode 100644 index 00000000000..c33e51cae63 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/deny-unshaded.png new file mode 100644 index 00000000000..44041c32478 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/eject-unshaded.png new file mode 100644 index 00000000000..45e87f4f7bd Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/meta.json new file mode 100644 index 00000000000..71ffade3dd0 --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/meta.json @@ -0,0 +1,95 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "normal-unshaded", + "directions": 4 + }, + { + "name": "eject-unshaded", + "directions": 4, + "delays": [ + [ + 0.1, + 0.8, + 0.1 + ], + [ + 0.1, + 0.8, + 0.1 + ], + [ + 0.1, + 0.8, + 0.1 + ], + [ + 0.1, + 0.8, + 0.1 + ] + ] + }, + { + "name": "deny-unshaded", + "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, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/normal-unshaded.png new file mode 100644 index 00000000000..09951acb4cd Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/off.png new file mode 100644 index 00000000000..31df8b753f8 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/panel.png new file mode 100644 index 00000000000..95ca9554d39 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/laptop.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/broken.png new file mode 100644 index 00000000000..2afa82d3d9d Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/deny-unshaded.png new file mode 100644 index 00000000000..5ab0afa3820 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/eject-unshaded.png new file mode 100644 index 00000000000..a0e87b81c6d Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/meta.json new file mode 100644 index 00000000000..f66df2c0799 --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/meta.json @@ -0,0 +1,109 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "normal-unshaded", + "directions": 4, + "delays": [ + [ + 1, + 1 + ], + [ + 1, + 1 + ], + [ + 1, + 1 + ], + [ + 1, + 1 + ] + ] + }, + { + "name": "eject-unshaded", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.8, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.8, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.8, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.8, + 0.2, + 0.2 + ] + ] + }, + { + "name": "deny-unshaded", + "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 + ] + ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/normal-unshaded.png new file mode 100644 index 00000000000..810cf5086e1 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/off.png new file mode 100644 index 00000000000..22dbf40c472 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/panel.png new file mode 100644 index 00000000000..d5841bd9d3b Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/lavatory.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/broken.png index 17d7f7e5955..691470ec3a4 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/deny-unshaded.png new file mode 100644 index 00000000000..e3a99050634 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/eject-unshaded.png new file mode 100644 index 00000000000..92dacfcaf80 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/meta.json index 777f43a5fd2..b340c351685 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/meta.json @@ -1,31 +1,105 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/3e1db725c152145b1682a31e5e54da7a63595436#diff-b4b731212dc8db8859d52ef3b762bccfb667f8783ad4c36f648db7f758f7eaf2", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", "size": { "x": 32, "y": 32 }, "states": [ { - "name": "broken" - }, - { - "name": "off" + "name": "normal-unshaded", + "directions": 4, + "delays": [ + [ + 4, + 0.1 + ], + [ + 4, + 0.1 + ], + [ + 4, + 0.1 + ], + [ + 4, + 0.1 + ] + ] }, { - "name": "panel" + "name": "eject-unshaded", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.7, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.7, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.7, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.7, + 0.1, + 0.1 + ] + ] }, { - "name": "normal-unshaded", + "name": "deny-unshaded", + "directions": 4, "delays": [ [ - 2.7, 0.1, - 3.4, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, 0.1 ] ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 } ] -} +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/normal-unshaded.png index 21e74f3c7fb..0c700c9ad3a 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/normal-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/off.png index 3b3b865aa65..481e7c0fac1 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/panel.png index 9e3049e07d7..a5d5634cafa 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/panel.png and b/Resources/Textures/Structures/Machines/VendingMachines/magivend.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/broken.png new file mode 100644 index 00000000000..5a61cac92f9 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/deny-unshaded.png new file mode 100644 index 00000000000..1e094aca6d5 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/eject-unshaded.png new file mode 100644 index 00000000000..c4ff3380972 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/meta.json new file mode 100644 index 00000000000..24c7cd05f45 --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/meta.json @@ -0,0 +1,91 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "normal-unshaded", + "directions": 4 + }, + { + "name": "eject-unshaded", + "directions": 4, + "delays": [ + [ + 0.1, + 0.4, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1 + ] + ] + }, + { + "name": "deny-unshaded", + "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, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/normal-unshaded.png new file mode 100644 index 00000000000..0c8b9fbf92b Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/off.png new file mode 100644 index 00000000000..923199a2c10 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/panel.png new file mode 100644 index 00000000000..a40eb38dad6 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/medivend.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/cooler.png b/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/cooler.png new file mode 100644 index 00000000000..b6f02fb3129 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/cooler.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/green-outline.png b/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/green-outline.png new file mode 100644 index 00000000000..1654849ed94 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/green-outline.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/heater.png b/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/heater.png new file mode 100644 index 00000000000..3e0c8ff0a69 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/heater.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/meta.json new file mode 100644 index 00000000000..eb1370ebd9c --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/meta.json @@ -0,0 +1,213 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "water_cooler", + "directions": 4 + }, + { + "name": "water_cooler-vend", + "directions": 4, + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "water_cooler-broken", + "directions": 4 + }, + { + "name": "heater", + "directions": 4, + "delays": [ + [ + 0.6, + 0.6 + ], + [ + 0.6, + 0.6 + ], + [ + 0.6, + 0.6 + ], + [ + 0.6, + 0.6 + ] + ] + }, + { + "name": "cooler", + "directions": 4, + "delays": [ + [ + 0.6, + 0.6 + ], + [ + 0.6, + 0.6 + ], + [ + 0.6, + 0.6 + ], + [ + 0.6, + 0.6 + ] + ] + }, + { + "name": "green-outline", + "directions": 4, + "delays": [ + [ + 3, + 0.1, + 2.5, + 0.1, + 0.1, + 0.1, + 2, + 0.1 + ], + [ + 3, + 0.1, + 2.5, + 0.1, + 0.1, + 0.1, + 2, + 0.1 + ], + [ + 3, + 0.1, + 2.5, + 0.1, + 0.1, + 0.1, + 2, + 0.1 + ], + [ + 3, + 0.1, + 2.5, + 0.1, + 0.1, + 0.1, + 2, + 0.1 + ] + ] + }, + { + "name": "sparks", + "directions": 4, + "delays": [ + [ + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/sparks.png b/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/sparks.png new file mode 100644 index 00000000000..f4595aff2b1 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/sparks.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/water_cooler-broken.png b/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/water_cooler-broken.png new file mode 100644 index 00000000000..c05c14d9316 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/water_cooler-broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/water_cooler-vend.png b/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/water_cooler-vend.png new file mode 100644 index 00000000000..e580d4f61a6 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/water_cooler-vend.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/water_cooler.png b/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/water_cooler.png new file mode 100644 index 00000000000..aac19f3bd94 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/misc.rsi/water_cooler.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/broken.png index 265c20ed44a..0324187f46a 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/deny-unshaded.png index 51bcf34dc37..9d14d111ab1 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/deny-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/eject-unshaded.png index c49dc97d282..b1c7346ae44 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/eject-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/meta.json index 35b29c7356e..22676b9a091 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/meta.json @@ -1,18 +1,32 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/1516a728931b4985c1e86f0c5995a5aa1554a1ad and modified by Swept", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", "size": { "x": 32, "y": 32 }, "states": [ { - "name": "broken" + "name": "normal-unshaded", + "directions": 4 }, { - "name": "deny-unshaded", + "name": "eject-unshaded", + "directions": 4, "delays": [ + [ + 0.1, + 0.1 + ], + [ + 0.1, + 0.1 + ], + [ + 0.1, + 0.1 + ], [ 0.1, 0.1 @@ -20,33 +34,54 @@ ] }, { - "name": "eject-unshaded", + "name": "deny-unshaded", + "directions": 4, "delays": [ [ 0.1, - 0.4, - 0.2, - 0.4, + 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, + 0.1, + 0.1, 0.1 ] ] }, { - "name": "normal-unshaded", - "delays": [ - [ - 2.5, - 0.05, - 3.4, - 0.05 - ] - ] + "name": "off", + "directions": 4 }, { - "name": "off" + "name": "broken", + "directions": 4 }, { - "name": "panel" + "name": "panel", + "directions": 4 } ] -} +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/normal-unshaded.png index 275180babfe..b90a6b7f08d 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/normal-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/off.png index f7a48db2100..0e586d3ba46 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/panel.png index 9e3049e07d7..d8247e3b066 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/panel.png and b/Resources/Textures/Structures/Machines/VendingMachines/nutri.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/broken.png new file mode 100644 index 00000000000..788e77a1c96 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/deny-unshaded.png new file mode 100644 index 00000000000..0ad3b337e5c Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/eject-unshaded.png new file mode 100644 index 00000000000..8f10a97c649 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/meta.json new file mode 100644 index 00000000000..22676b9a091 --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/meta.json @@ -0,0 +1,87 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "normal-unshaded", + "directions": 4 + }, + { + "name": "eject-unshaded", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1 + ], + [ + 0.1, + 0.1 + ], + [ + 0.1, + 0.1 + ], + [ + 0.1, + 0.1 + ] + ] + }, + { + "name": "deny-unshaded", + "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, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/normal-unshaded.png new file mode 100644 index 00000000000..10976cf5bba Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/off.png new file mode 100644 index 00000000000..329f13911b6 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/panel.png new file mode 100644 index 00000000000..d018408a2d2 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/nutri_green.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/broken.png index 0e73b4e957a..c5a38c1b2d3 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/deny-unshaded.png index 2a2832c15df..5dbb1b66dcb 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/deny-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/eject-unshaded.png index dffb3408711..3e0b2c656dc 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/eject-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/meta.json index d0d4a1f0e95..b9b202a57b2 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/1516a728931b4985c1e86f0c5995a5aa1554a1ad. Modified by potato1234x (github) for SS14", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", "size": { "x": 32, "y": 32 @@ -9,48 +9,86 @@ "states": [ { "name": "normal-unshaded", + "directions": 4 + }, + { + "name": "eject-unshaded", + "directions": 4, "delays": [ [ - 2.5, 0.1, - 3.4, + 0.4, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1 + ], + [ + 0.1, + 0.4, 0.1 ] ] }, - { - "name": "broken" - }, - { - "name": "normal" - }, { "name": "deny-unshaded", + "directions": 4, "delays": [ [ + 0.1, + 0.1, + 0.1, 0.1, 0.1, 0.1 - ] - ] - }, - { - "name": "eject-unshaded", - "delays": [ + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], [ - 0.5, 0.1, - 1.0, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, 0.1, 0.1 ] ] }, { - "name": "off" + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 }, { - "name": "panel" + "name": "normal" } ] } diff --git a/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/normal-unshaded.png index f98b47be440..3f5a40ca5ac 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/normal-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/off.png index b9aa0c326a1..aa1857d1b6b 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/panel.png index 95f1e4d33e9..e8c4b1a79d8 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/panel.png and b/Resources/Textures/Structures/Machines/VendingMachines/robotics.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/broken.png new file mode 100644 index 00000000000..b5f044ba681 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/deny-unshaded.png new file mode 100644 index 00000000000..f9ee39fcf95 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/eject-unshaded.png new file mode 100644 index 00000000000..5ca9a51ab38 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/meta.json new file mode 100644 index 00000000000..24c7cd05f45 --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/meta.json @@ -0,0 +1,91 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "normal-unshaded", + "directions": 4 + }, + { + "name": "eject-unshaded", + "directions": 4, + "delays": [ + [ + 0.1, + 0.4, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1 + ] + ] + }, + { + "name": "deny-unshaded", + "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, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/normal-unshaded.png new file mode 100644 index 00000000000..bc32376a67c Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/off.png new file mode 100644 index 00000000000..cf829676d43 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/panel.png new file mode 100644 index 00000000000..c2148a09c87 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/security.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/broken.png index 883a4a70e61..7e7601218e9 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/deny-unshaded.png index da34b0b1046..11d9aa191d3 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/deny-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/eject-unshaded.png index 630ea5a1d04..65a59b48227 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/eject-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/meta.json index 35b29c7356e..d24e37c145f 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/meta.json @@ -1,52 +1,239 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/1516a728931b4985c1e86f0c5995a5aa1554a1ad and modified by Swept", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", "size": { "x": 32, "y": 32 }, "states": [ { - "name": "broken" + "name": "normal-unshaded", + "directions": 4 + }, + { + "name": "eject-unshaded", + "directions": 4, + "delays": [ + [ + 0.1, + 0.4, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] }, { "name": "deny-unshaded", + "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, + 0.1, + 0.1, 0.1, 0.1 ] ] }, { - "name": "eject-unshaded", + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 + }, + { + "name": "seeds-shelf0", + "directions": 4, "delays": [ [ 0.1, - 0.4, - 0.2, - 0.4, + 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": "normal-unshaded", + "name": "seeds-shelf1", + "directions": 4, "delays": [ [ - 2.5, - 0.05, - 3.4, - 0.05 + 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": "off" + "name": "seeds-shelf2", + "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": "panel" + "name": "seeds-shelf3", + "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 + ] + ] } ] -} +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/normal-unshaded.png index 8182e6a2c78..5d7ca257aaf 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/normal-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/off.png index 3ab3fec281f..c7cf3fe4f3f 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/panel.png index 9e3049e07d7..7265126ffb5 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/panel.png and b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/seeds-shelf0.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/seeds-shelf0.png new file mode 100644 index 00000000000..f52017533a3 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/seeds-shelf0.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/seeds-shelf1.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/seeds-shelf1.png new file mode 100644 index 00000000000..454ca429431 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/seeds-shelf1.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/seeds-shelf2.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/seeds-shelf2.png new file mode 100644 index 00000000000..cd379eb9384 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/seeds-shelf2.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/seeds-shelf3.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/seeds-shelf3.png new file mode 100644 index 00000000000..ad7eedec20e Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/seeds.rsi/seeds-shelf3.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/broken.png new file mode 100644 index 00000000000..84fb48d3335 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/deny-unshaded.png new file mode 100644 index 00000000000..47d437da3ff Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/eject-unshaded.png new file mode 100644 index 00000000000..ce930c3b8f8 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/meta.json new file mode 100644 index 00000000000..59ee307d291 --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/meta.json @@ -0,0 +1,295 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "normal-unshaded", + "directions": 4 + }, + { + "name": "eject-unshaded", + "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, + 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": "deny-unshaded", + "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, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 + }, + { + "name": "seeds_generic-shelf0", + "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, + 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": "seeds_generic-shelf1", + "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, + 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": "seeds_generic-shelf2", + "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, + 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": "seeds_generic-shelf3", + "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, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/normal-unshaded.png new file mode 100644 index 00000000000..2eab092987d Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/off.png new file mode 100644 index 00000000000..ded486fb6b5 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/panel.png new file mode 100644 index 00000000000..5b3e87d9d3a Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/seeds_generic-shelf0.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/seeds_generic-shelf0.png new file mode 100644 index 00000000000..5954a9c457a Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/seeds_generic-shelf0.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/seeds_generic-shelf1.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/seeds_generic-shelf1.png new file mode 100644 index 00000000000..95c15fb2ebf Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/seeds_generic-shelf1.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/seeds_generic-shelf2.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/seeds_generic-shelf2.png new file mode 100644 index 00000000000..2a59f75ff43 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/seeds_generic-shelf2.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/seeds_generic-shelf3.png b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/seeds_generic-shelf3.png new file mode 100644 index 00000000000..038a01866d3 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/seeds_green.rsi/seeds_generic-shelf3.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/broken.png index d08a87b7607..16ce86dc2d0 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/deny-unshaded.png index b8221f982ee..5a6d5e1d4bd 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/deny-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/eject-unshaded.png index 49fcef45a1d..3200386e089 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/eject-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/meta.json index eaf66cff8f9..0227985bb84 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/1516a728931b4985c1e86f0c5995a5aa1554a1ad and modified by Swept and potato1234x", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", "size": { "x": 32, "y": 32 @@ -9,44 +9,101 @@ "states": [ { "name": "normal-unshaded", + "directions": 4, "delays": [ [ - 2.5, - 0.05, - 3.4 + 0.8, + 0.8, + 0.8 + ], + [ + 0.8, + 0.8, + 0.8 + ], + [ + 0.8, + 0.8, + 0.8 + ], + [ + 0.8, + 0.8, + 0.8 ] ] }, { - "name": "broken" - }, - { - "name": "deny-unshaded", + "name": "eject-unshaded", + "directions": 4, "delays": [ [ 0.1, 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, 0.1 ] ] }, { - "name": "off" - }, - { - "name": "panel" - }, - { - "name": "eject-unshaded", + "name": "deny-unshaded", + "directions": 4, "delays": [ [ 0.1, 0.1, - 0.8, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, 0.1, 0.1 ] ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 } ] -} +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/normal-unshaded.png index f04f2db2afe..5748b25b90e 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/normal-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/off.png index 4f84067486c..20540e67f09 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/panel.png index c60f5c3069d..12864f00cb3 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/panel.png and b/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/broken.png new file mode 100644 index 00000000000..92c80e39eb8 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/deny-unshaded.png new file mode 100644 index 00000000000..753fee7feef Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/eject-unshaded.png new file mode 100644 index 00000000000..b5b9987bde2 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/fan.png b/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/fan.png new file mode 100644 index 00000000000..0fc239d6cfd Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/fan.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/meta.json new file mode 100644 index 00000000000..ef0b880049d --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/meta.json @@ -0,0 +1,163 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "normal-unshaded", + "directions": 4, + "delays": [ + [ + 4, + 0.1, + 3, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 4, + 0.1, + 3, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 4, + 0.1, + 3, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 4, + 0.1, + 3, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5 + ] + ] + }, + { + "name": "eject-unshaded", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ] + ] + }, + { + "name": "deny-unshaded", + "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 + ] + ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "fan", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1 + ], + [ + 0.1, + 0.1 + ], + [ + 0.1, + 0.1 + ], + [ + 0.1, + 0.1 + ] + ] + }, + { + "name": "panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/normal-unshaded.png new file mode 100644 index 00000000000..083570790a8 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/off.png new file mode 100644 index 00000000000..fb11ce6be8f Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/panel.png new file mode 100644 index 00000000000..d5fa87b5116 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/snix.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/broken.png index 72f84139195..835f27942a2 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/deny-unshaded.png index 7f630c601cb..b2e5c5c7a9b 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/deny-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/eject-unshaded.png index bb21e6a5c5b..47b68325efc 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/eject-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/meta.json index d0d4a1f0e95..b1083273c3d 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/1516a728931b4985c1e86f0c5995a5aa1554a1ad. Modified by potato1234x (github) for SS14", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", "size": { "x": 32, "y": 32 @@ -9,48 +9,104 @@ "states": [ { "name": "normal-unshaded", + "directions": 4, "delays": [ [ - 2.5, 0.1, - 3.4, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, 0.1 ] ] }, { - "name": "broken" - }, - { - "name": "normal" - }, - { - "name": "deny-unshaded", + "name": "eject-unshaded", + "directions": 4, "delays": [ [ 0.1, 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, 0.1 ] ] }, { - "name": "eject-unshaded", + "name": "deny-unshaded", + "directions": 4, "delays": [ [ - 0.5, 0.1, - 1.0, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, 0.1, 0.1 ] ] }, { - "name": "off" + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 }, { - "name": "panel" + "name": "normal" } ] } diff --git a/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/normal-unshaded.png index 1328a3b0414..0abc407ddb1 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/normal-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/off.png index a5d20fa418c..7b55385247f 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/panel.png index 9e3049e07d7..0dc97647769 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/panel.png and b/Resources/Textures/Structures/Machines/VendingMachines/soda.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/broken.png new file mode 100644 index 00000000000..d447296df6e Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/deny-unshaded.png new file mode 100644 index 00000000000..dfc8b949c1f Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/eject-unshaded.png new file mode 100644 index 00000000000..f005de716f5 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/meta.json new file mode 100644 index 00000000000..6467c185806 --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/meta.json @@ -0,0 +1,87 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "normal-unshaded", + "directions": 4 + }, + { + "name": "eject-unshaded", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ] + ] + }, + { + "name": "deny-unshaded", + "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 + ] + ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/normal-unshaded.png new file mode 100644 index 00000000000..394a9f792c9 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/off.png new file mode 100644 index 00000000000..8e0099b5ce9 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/panel.png new file mode 100644 index 00000000000..4a1a54be105 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/soda2.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/broken.png new file mode 100644 index 00000000000..7c8745e4f43 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/deny-unshaded.png new file mode 100644 index 00000000000..3744436645f Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/eject-unshaded.png new file mode 100644 index 00000000000..e86cd1c5670 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/meta.json new file mode 100644 index 00000000000..95be94ea05f --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/meta.json @@ -0,0 +1,83 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken at commit https://github.com/Baystation12/Baystation12/commit/c39dcc148c04065ebac05f63bf3a556e8f21cac4", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "normal-unshaded", + "directions": 4 + }, + { + "name": "eject-unshaded", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ] + ] + }, + { + "name": "deny-unshaded", + "directions": 4, + "delays": [ + [ + 0.4, + 0.4 + ], + [ + 0.4, + 0.4 + ], + [ + 0.4, + 0.4 + ], + [ + 0.4, + 0.4 + ] + ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/normal-unshaded.png new file mode 100644 index 00000000000..62ce64eb0c9 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/off.png new file mode 100644 index 00000000000..862d17f646b Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/panel.png new file mode 100644 index 00000000000..c8122097f81 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/sodasoviet.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/broken.png new file mode 100644 index 00000000000..c9fff1d29ae Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/deny-unshaded.png new file mode 100644 index 00000000000..40643888a0c Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/eject-unshaded.png new file mode 100644 index 00000000000..a7a40777ef3 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/meta.json new file mode 100644 index 00000000000..0227985bb84 --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/meta.json @@ -0,0 +1,109 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "normal-unshaded", + "directions": 4, + "delays": [ + [ + 0.8, + 0.8, + 0.8 + ], + [ + 0.8, + 0.8, + 0.8 + ], + [ + 0.8, + 0.8, + 0.8 + ], + [ + 0.8, + 0.8, + 0.8 + ] + ] + }, + { + "name": "eject-unshaded", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ] + ] + }, + { + "name": "deny-unshaded", + "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 + ] + ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/normal-unshaded.png new file mode 100644 index 00000000000..677ccd0cfe7 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/off.png new file mode 100644 index 00000000000..e214035f5b6 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/panel.png new file mode 100644 index 00000000000..c8122097f81 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/solsnack.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/broken.png index 32fdbb98f30..753f96ecb45 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/deny-unshaded.png index 66e29f2bf01..bc889ec638b 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/deny-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/eject-unshaded.png index 865de78e602..0a2d1ea2331 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/eject-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/meta.json index 8c67a03d350..057b1e8e940 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/meta.json @@ -1,54 +1,109 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from baystation at https://github.com/Baystation12/Baystation12/commit/f200ae08d71ecbc91412ee650a334981892f5177", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", "size": { "x": 32, "y": 32 }, "states": [ { - "name": "normal-unshaded" + "name": "normal-unshaded", + "directions": 4 }, { - "name": "broken" - }, - { - "name": "deny-unshaded", + "name": "eject-unshaded", + "directions": 4, "delays": [ [ 0.1, 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, 0.1 ] ] }, { - "name": "off" - }, - { - "name": "screen", + "name": "deny-unshaded", + "directions": 4, "delays": [ [ - 3, + 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": "panel" + "name": "off", + "directions": 4 }, { - "name": "eject-unshaded", + "name": "broken", + "directions": 4 + }, + { + "name": "screen", + "directions": 4, "delays": [ [ - 0.1, - 0.1, - 0.8, - 0.1, + 3, + 0.1 + ], + [ + 3, + 0.1 + ], + [ + 3, + 0.1 + ], + [ + 3, 0.1 ] ] + }, + { + "name": "panel", + "directions": 4 } ] -} +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/normal-unshaded.png index 027d2fe0098..b7e0751dddf 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/normal-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/off.png index 069d91a3737..3feefb11bf0 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/panel.png index 6c43cd885bd..a2d8ea33205 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/panel.png and b/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/screen.png b/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/screen.png index a0bf454c8d4..30c120bce78 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/screen.png and b/Resources/Textures/Structures/Machines/VendingMachines/theater.rsi/screen.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/broken.png new file mode 100644 index 00000000000..c20faa89db2 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/deny-unshaded.png new file mode 100644 index 00000000000..34d6c07accd Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/eject-unshaded.png new file mode 100644 index 00000000000..906425c3d18 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/meta.json new file mode 100644 index 00000000000..24c7cd05f45 --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/meta.json @@ -0,0 +1,91 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "normal-unshaded", + "directions": 4 + }, + { + "name": "eject-unshaded", + "directions": 4, + "delays": [ + [ + 0.1, + 0.4, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1 + ] + ] + }, + { + "name": "deny-unshaded", + "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, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/normal-unshaded.png new file mode 100644 index 00000000000..46fe98a85d1 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/off.png new file mode 100644 index 00000000000..b5de5eb5f43 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/panel.png new file mode 100644 index 00000000000..f71c43d8ce8 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/uniform.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/broken.png index 783cf8af957..3a2fbee2dd7 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/deny-unshaded.png index 75081085a9a..066f7787bc1 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/deny-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/eject-unshaded.png new file mode 100644 index 00000000000..dd792204937 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/meta.json index b34b3c2a117..0201682c862 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/meta.json @@ -1,38 +1,87 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from /tg/station at commit 6665eec76c98a4f3f89bebcd10b34b47dcc0b8ae, off.png taken from /tg/station commit ede31369cfa5ea1bed9262b5ef4bbef85f60fe26 and edited by @Flareguy", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", "size": { "x": 32, "y": 32 }, "states": [ { - "name": "broken" - }, - { - "name": "panel" + "name": "normal-unshaded", + "directions": 4 }, { - "name": "deny-unshaded", + "name": "eject-unshaded", + "directions": 4, "delays": [ [ 0.1, - 0.1 + 0.1, + 0.1, + 0.1, + 0.6 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.6 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.6 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.6 ] ] }, { - "name": "normal-unshaded", + "name": "deny-unshaded", + "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 ] ] }, { - "name": "off" + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "panel", + "directions": 4 } ] -} +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/normal-unshaded.png index c94e7ba2664..b5cd555038e 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/normal-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/off.png index fb933b86129..d3eed12c558 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/panel.png index 851c8b78938..f67e50ee909 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/panel.png and b/Resources/Textures/Structures/Machines/VendingMachines/wallmed.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/broken.png new file mode 100644 index 00000000000..7ef463bc354 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/deny-unshaded.png new file mode 100644 index 00000000000..8d9329bd55c Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/eject-unshaded.png new file mode 100644 index 00000000000..c1612ce86e3 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/fan.png b/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/fan.png new file mode 100644 index 00000000000..5c521d83808 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/fan.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/meta.json new file mode 100644 index 00000000000..76eb760cea0 --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/meta.json @@ -0,0 +1,135 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "normal-unshaded", + "directions": 4, + "delays": [ + [ + 4, + 0.1 + ], + [ + 4, + 0.1 + ], + [ + 4, + 0.1 + ], + [ + 4, + 0.1 + ] + ] + }, + { + "name": "eject-unshaded", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.8, + 0.1, + 0.1 + ] + ] + }, + { + "name": "deny-unshaded", + "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 + ] + ] + }, + { + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "fan", + "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 + ] + ] + }, + { + "name": "panel", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/normal-unshaded.png new file mode 100644 index 00000000000..02f1ab353e8 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/off.png new file mode 100644 index 00000000000..9d15cc4785f Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/panel.png new file mode 100644 index 00000000000..d5fa87b5116 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/weeb.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/broken.png index 18322391cce..f4bf0a39292 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/deny-unshaded.png index 9819fb38674..9ee002be458 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/deny-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/eject-unshaded.png index 9d19accfe1c..acc5b47a3de 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/eject-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/meta.json index 4e9ac60b73d..24c7cd05f45 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/meta.json @@ -1,52 +1,91 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/1516a728931b4985c1e86f0c5995a5aa1554a1ad and modified by Swept", + "copyright": "Taken from Baystation at commit https://github.com/Baystation12/Baystation12/commit/bddd2b27f6103e46dadb6d251c7c1832e012a84d", "size": { "x": 32, "y": 32 }, "states": [ { - "name": "broken" + "name": "normal-unshaded", + "directions": 4 }, { - "name": "deny-unshaded", + "name": "eject-unshaded", + "directions": 4, "delays": [ [ - 0.5, + 0.1, + 0.4, 0.1 - ] - ] - }, - { - "name": "eject-unshaded", - "delays": [ + ], [ 0.1, 0.4, - 0.2, + 0.1 + ], + [ + 0.1, + 0.4, + 0.1 + ], + [ + 0.1, 0.4, 0.1 ] ] }, { - "name": "normal-unshaded", + "name": "deny-unshaded", + "directions": 4, "delays": [ [ - 2.5, - 0.05, - 3.4, - 0.05 + 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, + 0.1, + 0.1, + 0.1, + 0.1 ] ] }, { - "name": "off" + "name": "off", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 }, { - "name": "panel" + "name": "panel", + "directions": 4 } ] -} +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/normal-unshaded.png index 80ca6812f74..1aa08065ff8 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/normal-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/off.png index 2ac83c2eb83..1af7d16d170 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/panel.png index faddc533514..e50605569e8 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/panel.png and b/Resources/Textures/Structures/Machines/VendingMachines/youtool.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o0.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o0.png index 5eefb01db6a..2cf968a8c32 100644 Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o0.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o0.png differ diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o1.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o1.png index 1902bbd8b96..3d461d60296 100644 Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o1.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o1.png differ diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o2.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o2.png index 57a1eaa3abf..ef543a5e09e 100644 Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o2.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o2.png differ diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o3.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o3.png index 3522af81e5c..4e1dc10c29a 100644 Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o3.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o3.png differ diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-tank.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-tank.png index 4d5049f7b4e..a48466d3b46 100644 Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-tank.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-tank.png differ diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_active.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_active.png index 134c51bccb0..184b8801124 100644 Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_active.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_active.png differ diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_deactive.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_deactive.png index e40e276e040..420179558ca 100644 Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_deactive.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_deactive.png differ diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_off.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_off.png index a3cac04acb3..9da9ba51a10 100644 Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_off.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_off.png differ diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_on.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_on.png index b9a49e1ec98..eb8cbc1f818 100644 Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_on.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_on.png differ diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/cu.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/cu.png index 896c844149d..9da9ba51a10 100644 Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/cu.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/cu.png differ diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/meta.json b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/meta.json index 1da3a0a7336..1c8714a8dbe 100644 --- a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/meta.json +++ b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from goonstation at https://github.com/goonstation/goonstation/commit/cbe076402ed43b1cd861295bbcb95608c453de7a. Edited by chromiumboy", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/. Edited by FoxxoTrystan", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/static.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/static.png index 6097982ee26..7d8c7a8c49c 100644 Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/static.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/static.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/base.png b/Resources/Textures/Structures/Power/apc.rsi/base.png index 2b42c54935a..ea2f17c062f 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/base.png and b/Resources/Textures/Structures/Power/apc.rsi/base.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/broken.png b/Resources/Textures/Structures/Power/apc.rsi/broken.png index 092694c371f..4bcd2475cdf 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/broken.png and b/Resources/Textures/Structures/Power/apc.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/channel0-auto_off.png b/Resources/Textures/Structures/Power/apc.rsi/channel0-auto_off.png index ba84b7d6db5..0d181878fcf 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/channel0-auto_off.png and b/Resources/Textures/Structures/Power/apc.rsi/channel0-auto_off.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/channel0-auto_on.png b/Resources/Textures/Structures/Power/apc.rsi/channel0-auto_on.png index 6cce72f795f..c7a0d87ccc3 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/channel0-auto_on.png and b/Resources/Textures/Structures/Power/apc.rsi/channel0-auto_on.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/channel0-manual_off.png b/Resources/Textures/Structures/Power/apc.rsi/channel0-manual_off.png index 61ae057d508..4be0bbfb0bc 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/channel0-manual_off.png and b/Resources/Textures/Structures/Power/apc.rsi/channel0-manual_off.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/channel0-manual_on.png b/Resources/Textures/Structures/Power/apc.rsi/channel0-manual_on.png index 6cc48bd1a55..720dc4976ab 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/channel0-manual_on.png and b/Resources/Textures/Structures/Power/apc.rsi/channel0-manual_on.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/channel1-auto_off.png b/Resources/Textures/Structures/Power/apc.rsi/channel1-auto_off.png index b31bed6c6ba..7f0a13a7a4c 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/channel1-auto_off.png and b/Resources/Textures/Structures/Power/apc.rsi/channel1-auto_off.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/channel1-auto_on.png b/Resources/Textures/Structures/Power/apc.rsi/channel1-auto_on.png index 959a05cde08..87191be5207 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/channel1-auto_on.png and b/Resources/Textures/Structures/Power/apc.rsi/channel1-auto_on.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/channel1-manual_off.png b/Resources/Textures/Structures/Power/apc.rsi/channel1-manual_off.png index 3bb505ecb86..031213f74ad 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/channel1-manual_off.png and b/Resources/Textures/Structures/Power/apc.rsi/channel1-manual_off.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/channel1-manual_on.png b/Resources/Textures/Structures/Power/apc.rsi/channel1-manual_on.png index bd8b013310c..ac5f1c1befe 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/channel1-manual_on.png and b/Resources/Textures/Structures/Power/apc.rsi/channel1-manual_on.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/channel2-auto_off.png b/Resources/Textures/Structures/Power/apc.rsi/channel2-auto_off.png index 0cca8602208..ff8522d2c5a 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/channel2-auto_off.png and b/Resources/Textures/Structures/Power/apc.rsi/channel2-auto_off.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/channel2-auto_on.png b/Resources/Textures/Structures/Power/apc.rsi/channel2-auto_on.png index 56802dc0437..4e04387ed3d 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/channel2-auto_on.png and b/Resources/Textures/Structures/Power/apc.rsi/channel2-auto_on.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/channel2-manual_off.png b/Resources/Textures/Structures/Power/apc.rsi/channel2-manual_off.png index 5ac134cb54b..2f9802281e0 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/channel2-manual_off.png and b/Resources/Textures/Structures/Power/apc.rsi/channel2-manual_off.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/channel2-manual_on.png b/Resources/Textures/Structures/Power/apc.rsi/channel2-manual_on.png index 5ebec4feeeb..fb9e2180bb6 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/channel2-manual_on.png and b/Resources/Textures/Structures/Power/apc.rsi/channel2-manual_on.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/display-charging.png b/Resources/Textures/Structures/Power/apc.rsi/display-charging.png index 67e3b3df19b..d5e356d943e 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/display-charging.png and b/Resources/Textures/Structures/Power/apc.rsi/display-charging.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/display-full.png b/Resources/Textures/Structures/Power/apc.rsi/display-full.png index 1739853e2b7..4a9bd7ed643 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/display-full.png and b/Resources/Textures/Structures/Power/apc.rsi/display-full.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/display-lack.png b/Resources/Textures/Structures/Power/apc.rsi/display-lack.png index c4c103eeb96..d1d2df4858d 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/display-lack.png and b/Resources/Textures/Structures/Power/apc.rsi/display-lack.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/display-remote.png b/Resources/Textures/Structures/Power/apc.rsi/display-remote.png index be343a987b0..07265ab67de 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/display-remote.png and b/Resources/Textures/Structures/Power/apc.rsi/display-remote.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/emag-unlit.png b/Resources/Textures/Structures/Power/apc.rsi/emag-unlit.png index 2713c5506a2..77c2518e63d 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/emag-unlit.png and b/Resources/Textures/Structures/Power/apc.rsi/emag-unlit.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/frame.png b/Resources/Textures/Structures/Power/apc.rsi/frame.png index 7d3529f63f5..e4c9c1b31cf 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/frame.png and b/Resources/Textures/Structures/Power/apc.rsi/frame.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/meta.json b/Resources/Textures/Structures/Power/apc.rsi/meta.json index 82f78ccb875..867e5ce0ffd 100644 --- a/Resources/Textures/Structures/Power/apc.rsi/meta.json +++ b/Resources/Textures/Structures/Power/apc.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/9c7d509354ee030300f63c701da63c17928c3b3b and modified by Swept", + "copyright": "Taken from TauCetiClassic at commit https://github.com/TauCetiStation/TauCetiClassic/commit/fca7f2a0f9154c0c6c4efc2f8f58441fb9b34759", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Power/apc.rsi/sparks-unlit.png b/Resources/Textures/Structures/Power/apc.rsi/sparks-unlit.png index 212fcb78bf8..f442757bea6 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/sparks-unlit.png and b/Resources/Textures/Structures/Power/apc.rsi/sparks-unlit.png differ diff --git a/Resources/Textures/Structures/Power/apc.rsi/static.png b/Resources/Textures/Structures/Power/apc.rsi/static.png index 43089d0d811..a7137ec2f3a 100644 Binary files a/Resources/Textures/Structures/Power/apc.rsi/static.png and b/Resources/Textures/Structures/Power/apc.rsi/static.png differ diff --git a/Resources/Textures/Structures/Power/power.rsi/meta.json b/Resources/Textures/Structures/Power/power.rsi/meta.json index 773a2b5a3e7..027655dd356 100644 --- a/Resources/Textures/Structures/Power/power.rsi/meta.json +++ b/Resources/Textures/Structures/Power/power.rsi/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation", + "copyright": "Taken from tgstation/paradise", "states": [ { "name": "eightdirwire" diff --git a/Resources/Textures/Structures/Power/power.rsi/storage.png b/Resources/Textures/Structures/Power/power.rsi/storage.png index 5f42ce89bc2..71e7cf91956 100644 Binary files a/Resources/Textures/Structures/Power/power.rsi/storage.png and b/Resources/Textures/Structures/Power/power.rsi/storage.png differ diff --git a/Resources/Textures/Structures/Power/smes.rsi/meta.json b/Resources/Textures/Structures/Power/smes.rsi/meta.json index 2ca8d1fb226..4b4193ec726 100644 --- a/Resources/Textures/Structures/Power/smes.rsi/meta.json +++ b/Resources/Textures/Structures/Power/smes.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/9c7d509354ee030300f63c701da63c17928c3b3b and modified by Swept", + "copyright": "Taken from Paradise at https://github.com/McRamon/Paradise/blob/b727162ed9dead12de42be5c5b04872934a474e1/icons/obj/power.dmi", "size": { "x": 32, "y": 32 @@ -9,33 +9,9 @@ "states": [ { "name": "smes" - }, - { - "name": "static" - }, - { - "name": "smes-open" - }, - { - "name": "smes-oc0" }, { - "name": "smes-oc1", - "delays": [ - [ - 0.5, - 0.5 - ] - ] - }, - { - "name": "smes-oc2", - "delays": [ - [ - 0.5, - 0.5 - ] - ] + "name": "static" }, { "name": "smes-og1", @@ -62,16 +38,50 @@ "name": "smes-op0" }, { - "name": "smes-op1", + "name": "smes-op1" + }, + { + "name": "smes-op2" + }, + { + "name": "smes-oc1", "delays": [ [ - 1, - 1 + 0.3, + 0.3 ] ] }, { - "name": "smes-op2" + "name": "smes-oc2", + "delays": [ + [ + 0.3, + 0.3 + ] + ] + }, + { + "name": "smes-oc0", + "delays": [ + [ + 0.5, + 0.3 + ] + ] + }, + { + "name": "smes-open", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] } ] } diff --git a/Resources/Textures/Structures/Power/smes.rsi/smes-oc0.png b/Resources/Textures/Structures/Power/smes.rsi/smes-oc0.png index 5579432d3fe..9d62074f1d8 100644 Binary files a/Resources/Textures/Structures/Power/smes.rsi/smes-oc0.png and b/Resources/Textures/Structures/Power/smes.rsi/smes-oc0.png differ diff --git a/Resources/Textures/Structures/Power/smes.rsi/smes-oc1.png b/Resources/Textures/Structures/Power/smes.rsi/smes-oc1.png index d624672613b..10f4c4678ed 100644 Binary files a/Resources/Textures/Structures/Power/smes.rsi/smes-oc1.png and b/Resources/Textures/Structures/Power/smes.rsi/smes-oc1.png differ diff --git a/Resources/Textures/Structures/Power/smes.rsi/smes-oc2.png b/Resources/Textures/Structures/Power/smes.rsi/smes-oc2.png index d624672613b..10f4c4678ed 100644 Binary files a/Resources/Textures/Structures/Power/smes.rsi/smes-oc2.png and b/Resources/Textures/Structures/Power/smes.rsi/smes-oc2.png differ diff --git a/Resources/Textures/Structures/Power/smes.rsi/smes-og1.png b/Resources/Textures/Structures/Power/smes.rsi/smes-og1.png index c65f011a070..472b013ce71 100644 Binary files a/Resources/Textures/Structures/Power/smes.rsi/smes-og1.png and b/Resources/Textures/Structures/Power/smes.rsi/smes-og1.png differ diff --git a/Resources/Textures/Structures/Power/smes.rsi/smes-og2.png b/Resources/Textures/Structures/Power/smes.rsi/smes-og2.png index 00237504051..c2d3dbbc46e 100644 Binary files a/Resources/Textures/Structures/Power/smes.rsi/smes-og2.png and b/Resources/Textures/Structures/Power/smes.rsi/smes-og2.png differ diff --git a/Resources/Textures/Structures/Power/smes.rsi/smes-og3.png b/Resources/Textures/Structures/Power/smes.rsi/smes-og3.png index 51df688e4a8..263d8e98f78 100644 Binary files a/Resources/Textures/Structures/Power/smes.rsi/smes-og3.png and b/Resources/Textures/Structures/Power/smes.rsi/smes-og3.png differ diff --git a/Resources/Textures/Structures/Power/smes.rsi/smes-og4.png b/Resources/Textures/Structures/Power/smes.rsi/smes-og4.png index ceb3db1bc31..e31794f5c70 100644 Binary files a/Resources/Textures/Structures/Power/smes.rsi/smes-og4.png and b/Resources/Textures/Structures/Power/smes.rsi/smes-og4.png differ diff --git a/Resources/Textures/Structures/Power/smes.rsi/smes-og5.png b/Resources/Textures/Structures/Power/smes.rsi/smes-og5.png index e6c0c8a2eac..26955f70a16 100644 Binary files a/Resources/Textures/Structures/Power/smes.rsi/smes-og5.png and b/Resources/Textures/Structures/Power/smes.rsi/smes-og5.png differ diff --git a/Resources/Textures/Structures/Power/smes.rsi/smes-op0.png b/Resources/Textures/Structures/Power/smes.rsi/smes-op0.png index 573b5c404ff..ab0ae9e1145 100644 Binary files a/Resources/Textures/Structures/Power/smes.rsi/smes-op0.png and b/Resources/Textures/Structures/Power/smes.rsi/smes-op0.png differ diff --git a/Resources/Textures/Structures/Power/smes.rsi/smes-op1.png b/Resources/Textures/Structures/Power/smes.rsi/smes-op1.png index f5c8e104894..58d8dbf1f5c 100644 Binary files a/Resources/Textures/Structures/Power/smes.rsi/smes-op1.png and b/Resources/Textures/Structures/Power/smes.rsi/smes-op1.png differ diff --git a/Resources/Textures/Structures/Power/smes.rsi/smes-op2.png b/Resources/Textures/Structures/Power/smes.rsi/smes-op2.png index af560237f17..58d8dbf1f5c 100644 Binary files a/Resources/Textures/Structures/Power/smes.rsi/smes-op2.png and b/Resources/Textures/Structures/Power/smes.rsi/smes-op2.png differ diff --git a/Resources/Textures/Structures/Power/smes.rsi/smes-open.png b/Resources/Textures/Structures/Power/smes.rsi/smes-open.png index 472e3fd7201..03868889f61 100644 Binary files a/Resources/Textures/Structures/Power/smes.rsi/smes-open.png and b/Resources/Textures/Structures/Power/smes.rsi/smes-open.png differ diff --git a/Resources/Textures/Structures/Power/smes.rsi/smes.png b/Resources/Textures/Structures/Power/smes.rsi/smes.png index ecfbc4cd58f..71e7cf91956 100644 Binary files a/Resources/Textures/Structures/Power/smes.rsi/smes.png and b/Resources/Textures/Structures/Power/smes.rsi/smes.png differ diff --git a/Resources/Textures/Structures/Power/smes.rsi/static.png b/Resources/Textures/Structures/Power/smes.rsi/static.png index 3e52b6c43e4..0fcc42db544 100644 Binary files a/Resources/Textures/Structures/Power/smes.rsi/static.png and b/Resources/Textures/Structures/Power/smes.rsi/static.png differ diff --git a/Resources/Textures/Structures/Power/substation.rsi/charging.png b/Resources/Textures/Structures/Power/substation.rsi/charging.png index 538dc2b7a84..fdf01dbe8de 100644 Binary files a/Resources/Textures/Structures/Power/substation.rsi/charging.png and b/Resources/Textures/Structures/Power/substation.rsi/charging.png differ diff --git a/Resources/Textures/Structures/Power/substation.rsi/dead.png b/Resources/Textures/Structures/Power/substation.rsi/dead.png index 9fbff744ca7..ba6f81f1a1a 100644 Binary files a/Resources/Textures/Structures/Power/substation.rsi/dead.png and b/Resources/Textures/Structures/Power/substation.rsi/dead.png differ diff --git a/Resources/Textures/Structures/Power/substation.rsi/full.png b/Resources/Textures/Structures/Power/substation.rsi/full.png index d1797426699..42a670ff234 100644 Binary files a/Resources/Textures/Structures/Power/substation.rsi/full.png and b/Resources/Textures/Structures/Power/substation.rsi/full.png differ diff --git a/Resources/Textures/Structures/Power/substation.rsi/meta.json b/Resources/Textures/Structures/Power/substation.rsi/meta.json index 0125458641c..a2ade57116e 100644 --- a/Resources/Textures/Structures/Power/substation.rsi/meta.json +++ b/Resources/Textures/Structures/Power/substation.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Drawn by Ubaser.", + "copyright": "Taken from cev-eris at commit https://github.com/discordia-space/CEV-Eris/commit/b63634bc17efe2f09cf06ef0e9a90d24d37f6203, wall modified by Peptide90", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Power/substation.rsi/screen.png b/Resources/Textures/Structures/Power/substation.rsi/screen.png index 60c922c53f6..c28bcbcedae 100644 Binary files a/Resources/Textures/Structures/Power/substation.rsi/screen.png and b/Resources/Textures/Structures/Power/substation.rsi/screen.png differ diff --git a/Resources/Textures/Structures/Power/substation.rsi/substation.png b/Resources/Textures/Structures/Power/substation.rsi/substation.png index b9d1eb18d8f..45524ad8b11 100644 Binary files a/Resources/Textures/Structures/Power/substation.rsi/substation.png and b/Resources/Textures/Structures/Power/substation.rsi/substation.png differ diff --git a/Resources/Textures/Structures/Power/substation.rsi/substation_static.png b/Resources/Textures/Structures/Power/substation.rsi/substation_static.png index 9d5b8598f4b..2a1de1a0661 100644 Binary files a/Resources/Textures/Structures/Power/substation.rsi/substation_static.png and b/Resources/Textures/Structures/Power/substation.rsi/substation_static.png differ diff --git a/Resources/Textures/Structures/Power/substation.rsi/substation_wall.png b/Resources/Textures/Structures/Power/substation.rsi/substation_wall.png index 155ced7128a..8e8ae3fe3c2 100644 Binary files a/Resources/Textures/Structures/Power/substation.rsi/substation_wall.png and b/Resources/Textures/Structures/Power/substation.rsi/substation_wall.png differ diff --git a/Resources/Textures/Structures/Power/substation.rsi/substation_wall_static.png b/Resources/Textures/Structures/Power/substation.rsi/substation_wall_static.png index e810e6a5a4a..ee24ff45e68 100644 Binary files a/Resources/Textures/Structures/Power/substation.rsi/substation_wall_static.png and b/Resources/Textures/Structures/Power/substation.rsi/substation_wall_static.png differ diff --git a/Resources/Textures/Structures/Specific/barbershop.rsi/barberchair.png b/Resources/Textures/Structures/Specific/barbershop.rsi/barberchair.png new file mode 100644 index 00000000000..7e8fd78ab75 Binary files /dev/null and b/Resources/Textures/Structures/Specific/barbershop.rsi/barberchair.png differ diff --git a/Resources/Textures/Structures/Specific/barbershop.rsi/dyedispenser-broken.png b/Resources/Textures/Structures/Specific/barbershop.rsi/dyedispenser-broken.png new file mode 100644 index 00000000000..a6b1937b7fa Binary files /dev/null and b/Resources/Textures/Structures/Specific/barbershop.rsi/dyedispenser-broken.png differ diff --git a/Resources/Textures/Structures/Specific/barbershop.rsi/dyedispenser-off.png b/Resources/Textures/Structures/Specific/barbershop.rsi/dyedispenser-off.png new file mode 100644 index 00000000000..ff5f77f3d3b Binary files /dev/null and b/Resources/Textures/Structures/Specific/barbershop.rsi/dyedispenser-off.png differ diff --git a/Resources/Textures/Structures/Specific/barbershop.rsi/dyedispenser.png b/Resources/Textures/Structures/Specific/barbershop.rsi/dyedispenser.png new file mode 100644 index 00000000000..b0ca6f422bc Binary files /dev/null and b/Resources/Textures/Structures/Specific/barbershop.rsi/dyedispenser.png differ diff --git a/Resources/Textures/Structures/Specific/barbershop.rsi/meta.json b/Resources/Textures/Structures/Specific/barbershop.rsi/meta.json new file mode 100644 index 00000000000..1226428bcfb --- /dev/null +++ b/Resources/Textures/Structures/Specific/barbershop.rsi/meta.json @@ -0,0 +1,37 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from goonstation at https://github.com/goonstation/goonstation/blob/16f8a5c31a6cfc019a1549b0b97f18865002a44c/icons/obj/barber_shop.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "pole", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "barberchair" + }, + { + "name": "dyedispenser" + }, + { + "name": "dyedispenser-off" + }, + { + "name": "dyedispenser-broken" + }, + { + "name": "thesnip" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Specific/barbershop.rsi/pole.png b/Resources/Textures/Structures/Specific/barbershop.rsi/pole.png new file mode 100644 index 00000000000..963cb611fc4 Binary files /dev/null and b/Resources/Textures/Structures/Specific/barbershop.rsi/pole.png differ diff --git a/Resources/Textures/Structures/Specific/barbershop.rsi/thesnip.png b/Resources/Textures/Structures/Specific/barbershop.rsi/thesnip.png new file mode 100644 index 00000000000..9f3bb58b5eb Binary files /dev/null and b/Resources/Textures/Structures/Specific/barbershop.rsi/thesnip.png differ diff --git a/Resources/Textures/Structures/Specific/fitness.rsi/bopbag.png b/Resources/Textures/Structures/Specific/fitness.rsi/bopbag.png new file mode 100644 index 00000000000..85f5da360c7 Binary files /dev/null and b/Resources/Textures/Structures/Specific/fitness.rsi/bopbag.png differ diff --git a/Resources/Textures/Structures/Specific/fitness.rsi/bopbag2.png b/Resources/Textures/Structures/Specific/fitness.rsi/bopbag2.png new file mode 100644 index 00000000000..1be1e633417 Binary files /dev/null and b/Resources/Textures/Structures/Specific/fitness.rsi/bopbag2.png differ diff --git a/Resources/Textures/Structures/Specific/fitness.rsi/fitnesslifter.png b/Resources/Textures/Structures/Specific/fitness.rsi/fitnesslifter.png new file mode 100644 index 00000000000..51317e29479 Binary files /dev/null and b/Resources/Textures/Structures/Specific/fitness.rsi/fitnesslifter.png differ diff --git a/Resources/Textures/Structures/Specific/fitness.rsi/fitnesslifter2.png b/Resources/Textures/Structures/Specific/fitness.rsi/fitnesslifter2.png new file mode 100644 index 00000000000..ccd6eb3fdb7 Binary files /dev/null and b/Resources/Textures/Structures/Specific/fitness.rsi/fitnesslifter2.png differ diff --git a/Resources/Textures/Structures/Specific/fitness.rsi/fitnessweight-c.png b/Resources/Textures/Structures/Specific/fitness.rsi/fitnessweight-c.png new file mode 100644 index 00000000000..1791c3c35bc Binary files /dev/null and b/Resources/Textures/Structures/Specific/fitness.rsi/fitnessweight-c.png differ diff --git a/Resources/Textures/Structures/Specific/fitness.rsi/fitnessweight-w.png b/Resources/Textures/Structures/Specific/fitness.rsi/fitnessweight-w.png new file mode 100644 index 00000000000..3c515a49572 Binary files /dev/null and b/Resources/Textures/Structures/Specific/fitness.rsi/fitnessweight-w.png differ diff --git a/Resources/Textures/Structures/Specific/fitness.rsi/fitnessweight.png b/Resources/Textures/Structures/Specific/fitness.rsi/fitnessweight.png new file mode 100644 index 00000000000..d60d45cb896 Binary files /dev/null and b/Resources/Textures/Structures/Specific/fitness.rsi/fitnessweight.png differ diff --git a/Resources/Textures/Structures/Specific/fitness.rsi/meta.json b/Resources/Textures/Structures/Specific/fitness.rsi/meta.json new file mode 100644 index 00000000000..a4b18d2d642 --- /dev/null +++ b/Resources/Textures/Structures/Specific/fitness.rsi/meta.json @@ -0,0 +1,147 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from vgstation13 at https://github.com/vgstation-coders/vgstation13/blob/78a56e1a22ba1d8d6023ed9bdae55a6de7fe8a39/icons/obj/fitness.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "punchingbag" + }, + { + "name": "punchingbag2", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "punchingbagwizard" + }, + { + "name": "punchingbagwizard2", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "punchingbagsyndie" + }, + { + "name": "punchingbagsyndie2", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "bopbag" + }, + { + "name": "bopbag2", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "fitnesslifter" + }, + { + "name": "fitnesslifter2", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "fitnessweight" + }, + { + "name": "fitnessweight-c" + }, + { + "name": "fitnessweight-w", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "punchingbagcaptain" + }, + { + "name": "punchingbagcaptain2", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Specific/fitness.rsi/punchingbag.png b/Resources/Textures/Structures/Specific/fitness.rsi/punchingbag.png new file mode 100644 index 00000000000..048ac4ce745 Binary files /dev/null and b/Resources/Textures/Structures/Specific/fitness.rsi/punchingbag.png differ diff --git a/Resources/Textures/Structures/Specific/fitness.rsi/punchingbag2.png b/Resources/Textures/Structures/Specific/fitness.rsi/punchingbag2.png new file mode 100644 index 00000000000..4b5efbfc8fc Binary files /dev/null and b/Resources/Textures/Structures/Specific/fitness.rsi/punchingbag2.png differ diff --git a/Resources/Textures/Structures/Specific/fitness.rsi/punchingbagcaptain.png b/Resources/Textures/Structures/Specific/fitness.rsi/punchingbagcaptain.png new file mode 100644 index 00000000000..6ef688269da Binary files /dev/null and b/Resources/Textures/Structures/Specific/fitness.rsi/punchingbagcaptain.png differ diff --git a/Resources/Textures/Structures/Specific/fitness.rsi/punchingbagcaptain2.png b/Resources/Textures/Structures/Specific/fitness.rsi/punchingbagcaptain2.png new file mode 100644 index 00000000000..efdf7c12b6d Binary files /dev/null and b/Resources/Textures/Structures/Specific/fitness.rsi/punchingbagcaptain2.png differ diff --git a/Resources/Textures/Structures/Specific/fitness.rsi/punchingbagsyndie.png b/Resources/Textures/Structures/Specific/fitness.rsi/punchingbagsyndie.png new file mode 100644 index 00000000000..86339ad36be Binary files /dev/null and b/Resources/Textures/Structures/Specific/fitness.rsi/punchingbagsyndie.png differ diff --git a/Resources/Textures/Structures/Specific/fitness.rsi/punchingbagsyndie2.png b/Resources/Textures/Structures/Specific/fitness.rsi/punchingbagsyndie2.png new file mode 100644 index 00000000000..e59e3844c5b Binary files /dev/null and b/Resources/Textures/Structures/Specific/fitness.rsi/punchingbagsyndie2.png differ diff --git a/Resources/Textures/Structures/Specific/fitness.rsi/punchingbagwizard.png b/Resources/Textures/Structures/Specific/fitness.rsi/punchingbagwizard.png new file mode 100644 index 00000000000..0b6d9dca713 Binary files /dev/null and b/Resources/Textures/Structures/Specific/fitness.rsi/punchingbagwizard.png differ diff --git a/Resources/Textures/Structures/Specific/fitness.rsi/punchingbagwizard2.png b/Resources/Textures/Structures/Specific/fitness.rsi/punchingbagwizard2.png new file mode 100644 index 00000000000..11a00d2d55f Binary files /dev/null and b/Resources/Textures/Structures/Specific/fitness.rsi/punchingbagwizard2.png differ diff --git a/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/base.png b/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/base.png index 02e8764173f..0a2e1ae76b9 100644 Binary files a/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/base.png and b/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/base.png differ diff --git a/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/broken.png b/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/broken.png index 9d10428af8d..1565cdc86d7 100644 Binary files a/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/broken.png and b/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/burned.png b/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/burned.png index 160db7c5cbb..7e14e2c2b39 100644 Binary files a/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/burned.png and b/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/burned.png differ diff --git a/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/empty.png b/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/empty.png index 0f8f9478bd8..5ead53beb0e 100644 Binary files a/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/empty.png and b/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/empty.png differ diff --git a/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/glow.png b/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/glow.png index e1258d83dc3..50cc6725c71 100644 Binary files a/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/glow.png and b/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/glow.png differ diff --git a/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/meta.json index 4b8aa5fa2f0..be5f4a804b1 100644 --- a/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/meta.json +++ b/Resources/Textures/Structures/Wallmounts/Lighting/light_tube.rsi/meta.json @@ -1,11 +1,11 @@ { "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24", "size": { "x": 32, "y": 32 }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/blob/2b969adc2dfd3e9621bf3597c5cbffeb3ac8c9f0/icons/obj/lighting.dmi", "states": [ { "name": "broken", @@ -16,14 +16,14 @@ "directions": 4 }, { - "name": "base", + "name": "empty", "directions": 4 }, { - "name": "empty", + "name": "base", "directions": 4 }, - { + { "name": "glow", "directions": 4 } diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm0.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm0.png index 3b714153de9..fdc9376d67f 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm0.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm0.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm1.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm1.png index e7a23014888..d371695e129 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm1.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm1.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm2.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm2.png index 716536cfcb2..9d8640f85b0 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm2.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm2.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm_b1.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm_b1.png index fc185734afd..5fbc157750b 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm_b1.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm_b1.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm_b2.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm_b2.png index 0cdb0466062..38b22ccd815 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm_b2.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm_b2.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm_bitem.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm_bitem.png index 192c589f26c..6f1292bb058 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm_bitem.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm_bitem.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarmp.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarmp.png index 793babbbe6a..0b3192122be 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarmp.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarmp.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarmx.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarmx.png index 0f3e60bc0e8..61ecb87ff48 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarmx.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarmx.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire0.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire0.png index aa9559b7dce..278e5cf03b2 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire0.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire0.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_0.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_0.png index 39d4e989710..621410d043e 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_0.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_0.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_1.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_1.png index 765fdc6e594..fb775d3098b 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_1.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_1.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_3.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_3.png index ad74165ec40..71b96f2130d 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_3.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_3.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_b0.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_b0.png index cc554c73944..cfe596102d2 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_b0.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_b0.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_b1.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_b1.png index f732817d47e..1a620adc144 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_b1.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_b1.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_b2.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_b2.png index d862c40a4bc..c199a7ff31e 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_b2.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_b2.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_bitem.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_bitem.png index cc2a57c4956..5be7e11fc85 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_bitem.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_bitem.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_emagged.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_emagged.png index 310bb89d41b..bafb4249565 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_emagged.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_emagged.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_off.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_off.png index 8695c8a35dc..3eb61db8b6c 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_off.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_off.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_on.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_on.png index a98566070e5..ce3697456ff 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_on.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_on.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/firex.png b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/firex.png index 5ac3fad6af8..dd31be02f80 100644 Binary files a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/firex.png and b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/firex.png differ diff --git a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/meta.json index 62e0a281bf0..7484be2ffed 100644 --- a/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/meta.json +++ b/Resources/Textures/Structures/Wallmounts/air_monitors.rsi/meta.json @@ -1,48 +1,20 @@ { "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from TauCetiClassic at commit https://github.com/TauCetiStation/TauCetiClassic/commit/b7ac5798ae0d411b0cdeaf7efbc4ac86d24b4634, fire_emagged.png edited by github:Morb0", "size": { "x": 32, "y": 32 }, - "copyright": "Taken from tgstation", - "license": "CC-BY-SA-3.0", "states": [ { "name": "alarm0", "directions": 4, "delays": [ - [ - 0.5, - 0.1, - 0.1, - 1.0, - 0.2, - 0.1 - ], - [ - 0.5, - 0.1, - 0.1, - 1.0, - 0.2, - 0.1 - ], - [ - 0.5, - 0.1, - 0.1, - 1.0, - 0.2, - 0.1 - ], - [ - 0.5, - 0.1, - 0.1, - 1.0, - 0.2, - 0.1 - ] + [2.8, 2.8], + [2.8, 2.8], + [2.8, 2.8], + [2.8, 2.8] ] }, { @@ -50,20 +22,20 @@ "directions": 4, "delays": [ [ - 0.5, - 0.5 + 0.6, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, + 0.2, 0.2, 0.2, 0.2, 0.2, 0.6, 0.6, 0.6 ], [ - 0.5, - 0.5 + 0.6, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, + 0.2, 0.2, 0.2, 0.2, 0.2, 0.6, 0.6, 0.6 ], [ - 0.5, - 0.5 + 0.6, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, + 0.2, 0.2, 0.2, 0.2, 0.2, 0.6, 0.6, 0.6 ], [ - 0.5, - 0.5 + 0.6, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, + 0.2, 0.2, 0.2, 0.2, 0.2, 0.6, 0.6, 0.6 ] ] }, @@ -72,20 +44,20 @@ "directions": 4, "delays": [ [ - 0.5, - 0.5 + 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.4, 0.4, 0.4, + 0.4, 0.4 ], [ - 0.5, - 0.5 + 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.4, 0.4, 0.4, + 0.4, 0.4 ], [ - 0.5, - 0.5 + 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.4, 0.4, 0.4, + 0.4, 0.4 ], [ - 0.5, - 0.5 + 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.4, 0.4, 0.4, + 0.4, 0.4 ] ] }, @@ -98,7 +70,8 @@ "directions": 4 }, { - "name": "alarm_bitem" + "name": "alarm_bitem", + "directions": 1 }, { "name": "alarmp", @@ -109,17 +82,14 @@ "directions": 4 }, { - "name": "auth_off" + "name": "auth_off", + "directions": 1, + "delays": [[1]] }, { "name": "auth_on", "directions": 1, - "delays": [ - [ - 0.1, - 0.1 - ] - ] + "delays": [[0.1, 0.1]] }, { "name": "fire0", @@ -137,44 +107,20 @@ "name": "fire_2", "directions": 4, "delays": [ - [ - 0.5, - 0.5 - ], - [ - 0.5, - 0.5 - ], - [ - 0.5, - 0.5 - ], - [ - 0.5, - 0.5 - ] + [0.5, 0.5], + [0.5, 0.5], + [0.5, 0.5], + [0.5, 0.5] ] }, { "name": "fire_3", "directions": 4, "delays": [ - [ - 0.5, - 0.5 - ], - [ - 0.5, - 0.5 - ], - [ - 0.5, - 0.5 - ], - [ - 0.5, - 0.5 - ] + [0.3, 0.3], + [0.3, 0.3], + [0.3, 0.3], + [0.3, 0.3] ] }, { @@ -190,67 +136,21 @@ "directions": 4 }, { - "name": "fire_bitem" + "name": "fire_bitem", + "directions": 1 }, { - "name": "fire_detected", + "name": "fire_emagged", "directions": 4, "delays": [ - [ - 0.4, - 0.4 - ], - [ - 0.4, - 0.4 - ], - [ - 0.4, - 0.4 - ], - [ - 0.4, - 0.4 - ] + [0.3, 0.3], + [0.3, 0.3], + [0.3, 0.3], + [0.3, 0.3] ] }, { - "name": "fire_emagged", - "directions": 4, - "delays": [ - [ - 0.5, - 0.5, - 0.3, - 0.5, - 0.2, - 0.5 - ], - [ - 0.5, - 0.5, - 0.3, - 0.5, - 0.2, - 0.5 - ], - [ - 0.5, - 0.5, - 0.3, - 0.5, - 0.2, - 0.5 - ], - [ - 0.5, - 0.5, - 0.3, - 0.5, - 0.2, - 0.5 - ] - ] + "name": "fire_detected" }, { "name": "fire_off", @@ -260,27 +160,14 @@ "name": "fire_on", "directions": 4, "delays": [ - [ - 0.5, - 0.5 - ], - [ - 0.5, - 0.5 - ], - [ - 0.5, - 0.5 - ], - [ - 0.5, - 0.5 - ] + [0.2, 0.2, 0.2, 0.2, 0.2, 0.2], + [0.2, 0.2, 0.2, 0.2, 0.2, 0.2], + [0.2, 0.2, 0.2, 0.2, 0.2, 0.2], + [0.2, 0.2, 0.2, 0.2, 0.2, 0.2] ] }, { - "name": "fire_overlay", - "directions": 4 + "name": "fire_overlay" }, { "name": "firex", diff --git a/Resources/Textures/Structures/Wallmounts/camera.rsi/camera.png b/Resources/Textures/Structures/Wallmounts/camera.rsi/camera.png index 19481d55a0d..f3054b57ed3 100644 Binary files a/Resources/Textures/Structures/Wallmounts/camera.rsi/camera.png and b/Resources/Textures/Structures/Wallmounts/camera.rsi/camera.png differ diff --git a/Resources/Textures/Structures/Wallmounts/camera.rsi/camera_assembly.png b/Resources/Textures/Structures/Wallmounts/camera.rsi/camera_assembly.png index 44d8460f5fc..404e4dad197 100644 Binary files a/Resources/Textures/Structures/Wallmounts/camera.rsi/camera_assembly.png and b/Resources/Textures/Structures/Wallmounts/camera.rsi/camera_assembly.png differ diff --git a/Resources/Textures/Structures/Wallmounts/camera.rsi/camera_emp.png b/Resources/Textures/Structures/Wallmounts/camera.rsi/camera_emp.png index 6a7c1a24c51..59c7f453ebc 100644 Binary files a/Resources/Textures/Structures/Wallmounts/camera.rsi/camera_emp.png and b/Resources/Textures/Structures/Wallmounts/camera.rsi/camera_emp.png differ diff --git a/Resources/Textures/Structures/Wallmounts/camera.rsi/camera_in_use.png b/Resources/Textures/Structures/Wallmounts/camera.rsi/camera_in_use.png index 42a6a6e098e..3ed85a4a6b2 100644 Binary files a/Resources/Textures/Structures/Wallmounts/camera.rsi/camera_in_use.png and b/Resources/Textures/Structures/Wallmounts/camera.rsi/camera_in_use.png differ diff --git a/Resources/Textures/Structures/Wallmounts/camera.rsi/camera_off.png b/Resources/Textures/Structures/Wallmounts/camera.rsi/camera_off.png index 7fa16ed3fdd..487a2602aa5 100644 Binary files a/Resources/Textures/Structures/Wallmounts/camera.rsi/camera_off.png and b/Resources/Textures/Structures/Wallmounts/camera.rsi/camera_off.png differ diff --git a/Resources/Textures/Structures/Wallmounts/camera.rsi/cameracase.png b/Resources/Textures/Structures/Wallmounts/camera.rsi/cameracase.png index ac3f200d1fe..f93042f15f2 100644 Binary files a/Resources/Textures/Structures/Wallmounts/camera.rsi/cameracase.png and b/Resources/Textures/Structures/Wallmounts/camera.rsi/cameracase.png differ diff --git a/Resources/Textures/Structures/Wallmounts/camera.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/camera.rsi/meta.json index b8cedc6db63..95d2b24378e 100644 --- a/Resources/Textures/Structures/Wallmounts/camera.rsi/meta.json +++ b/Resources/Textures/Structures/Wallmounts/camera.rsi/meta.json @@ -1,73 +1,490 @@ { - "version": 1, - "size": { - "x": 32, - "y": 32 + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from TauCetiClassic at commit https://github.com/TauCetiStation/TauCetiClassic/commit/f878e95210d81e1328b023feb96ec0d0b6113d8c", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "camera", + "directions": 8, + "delays": [ + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25, + 0.25 + ] + ] }, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from /tg/station at https://github.com/tgstation/tgstation/commit/6bfe3b2e4fcbcdac9159dc4f0327a82ddf05ba7bi", - "states": [ - { - "name": "camera", - "directions": 1, - "delays": [ - [ 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3 ] - ] - }, - { - "name": "camera_assembly", - "directions": 1 - }, - { - "name": "camera_emp", - "directions": 1, - "delays": [ - [ 0.2, 0.2, 0.1, 0.1 ] - ] - }, - { - "name": "camera_in_use", - "directions": 1, - "delays": [ - [ 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3 ] - ] - }, - { - "name": "camera_off", - "directions": 1 - }, - { - "name": "cameracase", - "directions": 1 - }, - { - "name": "xraycamera", - "directions": 1, - "delays": [ - [ 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3 ] - ] - }, - { - "name": "xraycamera_assembly", - "directions": 1 - }, - { - "name": "xraycamera_emp", - "directions": 1, - "delays": [ - [ 0.2, 0.2, 0.1, 0.1 ] - ] - }, - { - "name": "xraycamera_in_use", - "directions": 1, - "delays": [ - [ 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3 ] - ] - }, - { - "name": "xraycamera_off", - "directions": 1 - } - ] -} \ No newline at end of file + { + "name": "camera_in_use", + "directions": 8, + "delays": [ + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ] + ] + }, + { + "name": "camera_off", + "directions": 8 + }, + { + "name": "camera_emp", + "directions": 8, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "camera_assembly", + "directions": 8 + }, + { + "name": "xraycamera", + "directions": 8, + "delays": [ + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ] + ] + }, + { + "name": "xraycamera_emp", + "directions": 8, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "xraycamera_off", + "directions": 8 + }, + { + "name": "xraycamera_assembly", + "directions": 8 + }, + { + "name": "cameracase" + }, + { + "name": "xraycamera_in_use", + "directions": 8, + "delays": [ + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ], + [ + 0.25, + 0.25, + 0.6, + 0.25, + 0.25, + 0.25, + 0.6, + 0.25 + ] + ] + } + ] +} diff --git a/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera.png b/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera.png index 31d9892d9f6..b543be5d7b3 100644 Binary files a/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera.png and b/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera.png differ diff --git a/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera_assembly.png b/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera_assembly.png index d2f690d3c11..5dfddb08f7d 100644 Binary files a/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera_assembly.png and b/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera_assembly.png differ diff --git a/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera_emp.png b/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera_emp.png index af6f3e2ceca..434dbd575b6 100644 Binary files a/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera_emp.png and b/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera_emp.png differ diff --git a/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera_in_use.png b/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera_in_use.png index 96dc134c7f2..dadc30eba7c 100644 Binary files a/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera_in_use.png and b/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera_in_use.png differ diff --git a/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera_off.png b/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera_off.png index 9b8a1aed798..487a2602aa5 100644 Binary files a/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera_off.png and b/Resources/Textures/Structures/Wallmounts/camera.rsi/xraycamera_off.png differ diff --git a/Resources/Textures/Structures/Wallmounts/intercom.rsi/base.png b/Resources/Textures/Structures/Wallmounts/intercom.rsi/base.png index 787af3f5387..7ddea57eded 100644 Binary files a/Resources/Textures/Structures/Wallmounts/intercom.rsi/base.png and b/Resources/Textures/Structures/Wallmounts/intercom.rsi/base.png differ diff --git a/Resources/Textures/Structures/Wallmounts/intercom.rsi/broadcasting.png b/Resources/Textures/Structures/Wallmounts/intercom.rsi/broadcasting.png index 0566c70e35c..fb01e708619 100644 Binary files a/Resources/Textures/Structures/Wallmounts/intercom.rsi/broadcasting.png and b/Resources/Textures/Structures/Wallmounts/intercom.rsi/broadcasting.png differ diff --git a/Resources/Textures/Structures/Wallmounts/intercom.rsi/build.png b/Resources/Textures/Structures/Wallmounts/intercom.rsi/build.png index cfd5d5fffa0..21fc9a1bad5 100644 Binary files a/Resources/Textures/Structures/Wallmounts/intercom.rsi/build.png and b/Resources/Textures/Structures/Wallmounts/intercom.rsi/build.png differ diff --git a/Resources/Textures/Structures/Wallmounts/intercom.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/intercom.rsi/meta.json index f5a9d7b89c2..d4440c99a04 100644 --- a/Resources/Textures/Structures/Wallmounts/intercom.rsi/meta.json +++ b/Resources/Textures/Structures/Wallmounts/intercom.rsi/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "Taken from /tg/station at https://github.com/tgstation/tgstation/commit/6bfe3b2e4fcbcdac9159dc4f0327a82ddf05ba7bi", + "copyright": "Taken from https://github.com/Skyrat-SS13/Skyrat-tg/blob/6e7197f550aac62a165c0a8c6b0835de19342623/modular_skyrat/modules/aesthetics/intercom/icons/intercom.dmi & build state from DenLemp#2965", "states": [ { "name": "base", diff --git a/Resources/Textures/Structures/Wallmounts/intercom.rsi/unshaded.png b/Resources/Textures/Structures/Wallmounts/intercom.rsi/unshaded.png index 7b0bb630722..9c4c3f199e6 100644 Binary files a/Resources/Textures/Structures/Wallmounts/intercom.rsi/unshaded.png and b/Resources/Textures/Structures/Wallmounts/intercom.rsi/unshaded.png differ diff --git a/Resources/Textures/Structures/Wallmounts/screen.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/screen.rsi/meta.json index a4c3148aa8e..25f0d7f1981 100644 --- a/Resources/Textures/Structures/Wallmounts/screen.rsi/meta.json +++ b/Resources/Textures/Structures/Wallmounts/screen.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "From vgstation: https://github.com/vgstation-coders/vgstation13/commit/a7290010020e541ed6b57817a07023ca6bef26fe#diff-20395160138bed693d15eee6f16d671531b5fa533ec52c50e8df6d52370dbecd", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Wallmounts/screen.rsi/screen.png b/Resources/Textures/Structures/Wallmounts/screen.rsi/screen.png index a3e7a3fe55a..6b6329e83d0 100644 Binary files a/Resources/Textures/Structures/Wallmounts/screen.rsi/screen.png and b/Resources/Textures/Structures/Wallmounts/screen.rsi/screen.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/full.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/full.png index bac03f82f18..31911eddb81 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/full.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/full.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/meta.json b/Resources/Textures/Structures/Walls/solid_rust.rsi/meta.json index af5ebe04cf7..3b1da2fdae0 100644 --- a/Resources/Textures/Structures/Walls/solid_rust.rsi/meta.json +++ b/Resources/Textures/Structures/Walls/solid_rust.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/tgstation/tgstation/commit/67a5373b4649937dd63dd94153e05e8506f40a5d and modified.", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/ and modified by FoxxoTrystan.", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-0.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-0.png index 3af17740393..81f7b75d7bb 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-0.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-0.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-1.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-1.png index 57f9a29657b..69acb771155 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-1.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-1.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-2.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-2.png index 122fb413982..63c1502b8a7 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-2.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-2.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-3.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-3.png index 2e7be27dd05..ad5094443b9 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-3.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-3.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-4.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-4.png index 48a07386adb..50b465c63be 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-4.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-4.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-5.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-5.png index 0969ca3ecd7..c6d8dacab13 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-5.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-5.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over0.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over0.png index 89314482b3a..ce5adc65b5d 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over0.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over0.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over1.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over1.png index 79fb38bd6ac..dd8b232de26 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over1.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over1.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over2.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over2.png index 89314482b3a..ce5adc65b5d 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over2.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over2.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over3.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over3.png index 79fb38bd6ac..dd8b232de26 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over3.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over3.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over4.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over4.png index 3fd3d1f3a26..e6c25bf9542 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over4.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over4.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over5.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over5.png index a9d7e717378..d0384e6f2b4 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over5.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over5.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over6.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over6.png index 3fd3d1f3a26..e6c25bf9542 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over6.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over6.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over7.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over7.png index 970ef1f1f5d..45a43655f63 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over7.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over7.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/rgeneric.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/rgeneric.png index 02a1c5c63bb..81f7b75d7bb 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/rgeneric.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/rgeneric.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid0.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid0.png index b6720ad5a32..a82cf053371 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid0.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid0.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid1.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid1.png index 9d1da43e6f0..88c852b3963 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid1.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid1.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid2.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid2.png index b6720ad5a32..a82cf053371 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid2.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid2.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid3.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid3.png index 9d1da43e6f0..88c852b3963 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid3.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid3.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid4.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid4.png index f31f3a6bc98..ba6ac0281f9 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid4.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid4.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid5.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid5.png index 7c18f9c11a7..d0384e6f2b4 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid5.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid5.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid6.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid6.png index 8737894cbf0..ba6ac0281f9 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid6.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid6.png differ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid7.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid7.png index 15f74bcaeed..45a43655f63 100644 Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid7.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid7.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 00000000000..024678fc209 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 00000000000..0d11fb19d36 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 00000000000..4751d95b9b5 --- /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/Tiles/arcadeblue2.png b/Resources/Textures/Tiles/arcadeblue2.png index 013af9f36f7..3def0f19c7e 100644 Binary files a/Resources/Textures/Tiles/arcadeblue2.png and b/Resources/Textures/Tiles/arcadeblue2.png differ diff --git a/Resources/Textures/Tiles/attributions.yml b/Resources/Textures/Tiles/attributions.yml index 7cfe5535a0a..124113a9032 100644 --- a/Resources/Textures/Tiles/attributions.yml +++ b/Resources/Textures/Tiles/attributions.yml @@ -6,27 +6,22 @@ copyright: "CEV-Eris commit 28e589f0ff72a009adf17db767e90be39054f0f2" source: "https://github.com/discordia-space/CEV-Eris/" -- files: ["plating.png"] - license: "CC-BY-SA-3.0" - copyright: "Taken from CEV-Eris commit 8e74e4370f4d5885f15c3f834973b1223ddb8b1b, modified by github user @Flareguy" - source: "https://github.com/discordia-space/CEV-Eris/" - -- files: ["plating_damaged.png", "plating_burnt.png"] - license: "CC-BY-SA-3.0" - copyright: "Modified by github user @Flareguy from plating.png, using damaged plating sprites from /tg/station at commit https://github.com/tgstation/tgstation/blob/6665eec76c98a4f3f89bebcd10b34b47dcc0b8ae/icons/turf/floors.dmi" - source: "https://github.com/space-wizards/space-station-14/pull/21711" - -- files: [ "asteroid_red.png", "asteroid_tile.png", "elevator_shaft.png", "freezer.png", "green_circuit.png", "lino.png", "mono.png", "rock_vault.png", "showroom.png"] +- files: [ "asteroid_red.png", "asteroid_tile.png", "elevator_shaft.png", "freezer.png", "lino.png", "mono.png", "rock_vault.png", "showroom.png"] license: "CC-BY-SA-3.0" copyright: "vgstation13 at roughly commit e4d3ea7f69d21c3667be12b114fa935c4640cb05, asteroid_red and asteroid_tile taken from commit /vg/station at commit 02b9f6894af4419c9f7e699a22c402b086d8067e." source: "https://github.com/vgstation-coders/vgstation13" - + - files: [ "asteroid.png", "asteroid_dug.png", "asteroid0.png"] license: "CC-BY-SA-3.0" copyright: "Taken from /tg/station at commit 6665eec76c98a4f3f89bebcd10b34b47dcc0b8ae." source: "https://github.com/tgstation/tgstation/" -- files: ["blue_circuit.png", "cropped_parallax.png", "eighties.png", "gold.png", "grass.png", "ironsand1.png", "ironsand2.png", "ironsand3.png", "ironsand4.png", "junglegrass.png", "lattice.png", "reinforced.png", "silver.png", "snow.png", "wood.png"] +- files: ["steel.png", "dark.png", "hydro.png", "plating.png", "reinforced.png", "steel_dirty.png", "white.png", "bar.png", "laundry.png", "mime.png", "clown.png", "kitchen.png"] + license: "CC-BY-SA-3.0" + copyright: "TauCetiStation commit 4cd533cf0a4243050364023af9a4fcaca209dce7" + source: "https://github.com/TauCetiStation/TauCetiClassic/" + +- files: ["cropped_parallax.png", "eighties.png", "gold.png", "grass.png", "ironsand1.png", "ironsand2.png", "ironsand3.png", "ironsand4.png", "junglegrass.png", "lattice.png", "plating.png", "reinforced.png", "silver.png", "snow.png", "wood.png"] license: "CC-BY-SA-3.0" copyright: "tgstation commit 8abb19545828230d92ba18827feeb42a67a55d49, cropped_parallax modified from parallax." source: "https://github.com/tgstation/tgstation/" @@ -40,7 +35,7 @@ license: "CC-BY-SA-3.0" copyright: "Modified from plating.png by github user @Flareguy" source: "https://github.com/space-wizards/space-station-14/" - + - files: ["rglass.png"] license: "CC-BY-SA-3.0" copyright: "tgstation commit 8abb19545828230d92ba18827feeb42a67a55d49, rglass modified by github user @notquitehadouken." @@ -51,6 +46,16 @@ copyright: "Created by github user @notquitehadouken." source: "https://github.com/space-wizards/space-station-14/pull/17948" +- files: [ "steel_diagonal.png", "steel_mini.png", "steel_offset.png", "steel_pavement.png", "white_diagonal.png", "white_mini.png", "white_offset.png", "white_pavement.png", "white_plastic.png", "dark_diagonal.png", "dark_mini.png", "dark_offset.png", "dark_pavement.png", "dark_plastic.png" ] + license: "CC0-1.0" + copyright: "Created by github user @morb0" + source: "https://github.com/space-syndicate/space-station-14/pull/489" + +- files: [ "cafeteria.png", "checker_dark.png" ] + license: "CC-BY-SA-3.0" + copyright: "Created by github user @Flareguy, original, unedited base tiles modified from /tg/station at commit 6665eec76c98a4f3f89bebcd10b34b47dcc0b8ae and github user @moonheart08" + source: "https://github.com/space-wizards/space-station-14/" + - files: [ "bar.png", "lime.png", "blue.png", "kitchen.png", "laundry.png", "mime.png", "steel.png", "steel_dirty.png", "steel_diagonal.png", "steel_mini.png", "steel_offset.png", "steel_pavement.png", "white.png", "white_diagonal.png", "white_mini.png", "white_offset.png", "white_pavement.png", "dark.png", "dark_diagonal.png", "dark_mini.png", "dark_offset.png", "dark_pavement.png", "hydro.png", "plastic.png", "dark_plastic.png", "white_plastic.png", "cafeteria.png", "checker_dark.png", "clown.png" ] license: "CC-BY-SA-3.0" copyright: "Created by github user @Flareguy, original, unedited base tiles modified from /tg/station at commit 6665eec76c98a4f3f89bebcd10b34b47dcc0b8ae and github user @moonheart08" @@ -61,14 +66,14 @@ copyright: "arcadered renamed from eightiesred, arcadeblue by Peptide90 modified from arcadered.png, tgstation commit 8abb19545828230d92ba18827feeb42a67a55d49" source: "https://github.com/tgstation/tgstation/" -- files: ["hull", "hull_reinforced.png", "steel_damaged.png", "steel_burnt.png"] +- files: ["hull", "hull_reinforced.png"] license: "CC-BY-SA-3.0" copyright: "Taken from /tg/station at commit 6665eec76c98a4f3f89bebcd10b34b47dcc0b8ae" - source: "https://github.com/tgstation/tgstation/" + source: "https://github.com/space-wizards/space-station-14/pull/18676" -- files: ["shuttleblue.png", "shuttleorange.png", "shuttlepurple.png", "shuttlered.png", "shuttlewhite.png", "shuttlegrey.png", "shuttleblack.png"] +- files: ["shuttleblue.png", "shuttleorange.png", "shuttlepurple.png", "shuttlered.png", "shuttlewhite.png", "shuttlegrey.png", "shuttleblack.png", "green_circuit.png", "blue_circuit.png", "red_circuit.png"] license: "CC-BY-SA-3.0" - copyright: "Modified by Flareguy for Space Station 14. Unmodified sprite from paradisestation commit 69c831afcd9aef25a2889b507e4f36a3a5fc6def, originally from /VG/ eris" + copyright: "Taken from Paradise Station at https://github.com/ParadiseSS13/Paradise/blob/master/icons/turf/floors.dmi" source: "https://github.com/ParadiseSS13/Paradise" - files: ["deprecated.png"] @@ -90,7 +95,7 @@ license: "CC-BY-SA-3.0" copyright: "Fortuna commit 2a9408a47e2f83d945335e4feeeeafb552173e6f, grasslight and dirt by Peptide based on grassdark.png and dirt." source: "https://github.com/FortunaSS13/Fortuna" - + - files: ["steel_maint.png", "grating_maint.png", "wood_tile.png"] license: "CC-BY-SA-3.0" copyright: "by brainfood for space-station-14, ." @@ -105,7 +110,7 @@ license: "CC-BY-SA-3.0" copyright: "taken at https://github.com/ParadiseSS13/Paradise/blob/8b7f4c8b69c74c6de5a755272eb8d3520f3d87c7/icons/turf/floors.dmi" source: "https://github.com/ParadiseSS13/Paradise" - + - files: ["chromite.png"] license: "CC-BY-NC-SA-3.0" copyright: "taken at commit 0587dd16e28108bdf0b0a28e2caae4319845e861, and recolored by TheShuEd" diff --git a/Resources/Textures/Tiles/bar.png b/Resources/Textures/Tiles/bar.png index c7dded0c6b9..d786d3ed763 100644 Binary files a/Resources/Textures/Tiles/bar.png and b/Resources/Textures/Tiles/bar.png differ diff --git a/Resources/Textures/Tiles/blue_circuit.png b/Resources/Textures/Tiles/blue_circuit.png index 021c5363d6e..529654b467b 100644 Binary files a/Resources/Textures/Tiles/blue_circuit.png and b/Resources/Textures/Tiles/blue_circuit.png differ diff --git a/Resources/Textures/Tiles/cafeteria.png b/Resources/Textures/Tiles/cafeteria.png index 69e8dc47f05..451b0825f55 100644 Binary files a/Resources/Textures/Tiles/cafeteria.png and b/Resources/Textures/Tiles/cafeteria.png differ diff --git a/Resources/Textures/Tiles/checker_dark.png b/Resources/Textures/Tiles/checker_dark.png index 01a91209588..3eefdfa34da 100644 Binary files a/Resources/Textures/Tiles/checker_dark.png and b/Resources/Textures/Tiles/checker_dark.png differ diff --git a/Resources/Textures/Tiles/clown.png b/Resources/Textures/Tiles/clown.png index 74e59719235..d81a759b12c 100644 Binary files a/Resources/Textures/Tiles/clown.png and b/Resources/Textures/Tiles/clown.png differ diff --git a/Resources/Textures/Tiles/dark.png b/Resources/Textures/Tiles/dark.png index 70d0a801fdc..5574f32a19d 100644 Binary files a/Resources/Textures/Tiles/dark.png and b/Resources/Textures/Tiles/dark.png differ diff --git a/Resources/Textures/Tiles/dark_diagonal.png b/Resources/Textures/Tiles/dark_diagonal.png index d9cacd31e13..22b474995a4 100644 Binary files a/Resources/Textures/Tiles/dark_diagonal.png and b/Resources/Textures/Tiles/dark_diagonal.png differ diff --git a/Resources/Textures/Tiles/dark_diagonal_mini.png b/Resources/Textures/Tiles/dark_diagonal_mini.png index c60af49c6d7..12a1e64b421 100644 Binary files a/Resources/Textures/Tiles/dark_diagonal_mini.png and b/Resources/Textures/Tiles/dark_diagonal_mini.png differ diff --git a/Resources/Textures/Tiles/dark_herringbone.png b/Resources/Textures/Tiles/dark_herringbone.png index 01e0c4ef60e..88b13a43b3f 100644 Binary files a/Resources/Textures/Tiles/dark_herringbone.png and b/Resources/Textures/Tiles/dark_herringbone.png differ diff --git a/Resources/Textures/Tiles/dark_mini.png b/Resources/Textures/Tiles/dark_mini.png index 02c75c56c4f..aeb982b732b 100644 Binary files a/Resources/Textures/Tiles/dark_mini.png and b/Resources/Textures/Tiles/dark_mini.png differ diff --git a/Resources/Textures/Tiles/dark_mono.png b/Resources/Textures/Tiles/dark_mono.png index 9e156c6e023..279a72f4097 100644 Binary files a/Resources/Textures/Tiles/dark_mono.png and b/Resources/Textures/Tiles/dark_mono.png differ diff --git a/Resources/Textures/Tiles/dark_offset.png b/Resources/Textures/Tiles/dark_offset.png index ca8a5b64aaa..422811bd8f9 100644 Binary files a/Resources/Textures/Tiles/dark_offset.png and b/Resources/Textures/Tiles/dark_offset.png differ diff --git a/Resources/Textures/Tiles/dark_pavement.png b/Resources/Textures/Tiles/dark_pavement.png index 1585211593b..6ad0bc4209b 100644 Binary files a/Resources/Textures/Tiles/dark_pavement.png and b/Resources/Textures/Tiles/dark_pavement.png differ diff --git a/Resources/Textures/Tiles/dark_pavement_vertical.png b/Resources/Textures/Tiles/dark_pavement_vertical.png index 776aaf605ec..02f7735dcd5 100644 Binary files a/Resources/Textures/Tiles/dark_pavement_vertical.png and b/Resources/Textures/Tiles/dark_pavement_vertical.png differ diff --git a/Resources/Textures/Tiles/dark_plastic.png b/Resources/Textures/Tiles/dark_plastic.png index 34c3e57ce68..79e0ff407e6 100644 Binary files a/Resources/Textures/Tiles/dark_plastic.png and b/Resources/Textures/Tiles/dark_plastic.png differ diff --git a/Resources/Textures/Tiles/glass.png b/Resources/Textures/Tiles/glass.png index 37adc67679e..bc782a9c6c3 100644 Binary files a/Resources/Textures/Tiles/glass.png and b/Resources/Textures/Tiles/glass.png differ diff --git a/Resources/Textures/Tiles/green_circuit.png b/Resources/Textures/Tiles/green_circuit.png index 1628c20ae77..c215175c499 100644 Binary files a/Resources/Textures/Tiles/green_circuit.png and b/Resources/Textures/Tiles/green_circuit.png differ diff --git a/Resources/Textures/Tiles/hydro.png b/Resources/Textures/Tiles/hydro.png index 5878bce5b70..0d1c6fef23f 100644 Binary files a/Resources/Textures/Tiles/hydro.png and b/Resources/Textures/Tiles/hydro.png differ diff --git a/Resources/Textures/Tiles/kitchen.png b/Resources/Textures/Tiles/kitchen.png index 83f371e63b8..38d4181bb08 100644 Binary files a/Resources/Textures/Tiles/kitchen.png and b/Resources/Textures/Tiles/kitchen.png differ diff --git a/Resources/Textures/Tiles/laundry.png b/Resources/Textures/Tiles/laundry.png index 60f079498ab..e89ae3d14cb 100644 Binary files a/Resources/Textures/Tiles/laundry.png and b/Resources/Textures/Tiles/laundry.png differ diff --git a/Resources/Textures/Tiles/lime.png b/Resources/Textures/Tiles/lime.png index bf528d278bd..3d421f3f7f6 100644 Binary files a/Resources/Textures/Tiles/lime.png and b/Resources/Textures/Tiles/lime.png differ diff --git a/Resources/Textures/Tiles/mime.png b/Resources/Textures/Tiles/mime.png index fee58f73708..bd85fa6111e 100644 Binary files a/Resources/Textures/Tiles/mime.png and b/Resources/Textures/Tiles/mime.png differ diff --git a/Resources/Textures/Tiles/plastic.png b/Resources/Textures/Tiles/plastic.png index 8fd68090319..8b004d5164b 100644 Binary files a/Resources/Textures/Tiles/plastic.png and b/Resources/Textures/Tiles/plastic.png differ diff --git a/Resources/Textures/Tiles/plating.png b/Resources/Textures/Tiles/plating.png index fef6a3554d5..5bdbadaa6ae 100644 Binary files a/Resources/Textures/Tiles/plating.png and b/Resources/Textures/Tiles/plating.png differ diff --git a/Resources/Textures/Tiles/plating_burnt.png b/Resources/Textures/Tiles/plating_burnt.png index 7c89de081eb..899e6c91880 100644 Binary files a/Resources/Textures/Tiles/plating_burnt.png and b/Resources/Textures/Tiles/plating_burnt.png differ diff --git a/Resources/Textures/Tiles/red_circuit.png b/Resources/Textures/Tiles/red_circuit.png new file mode 100644 index 00000000000..d7cee0fb61f Binary files /dev/null and b/Resources/Textures/Tiles/red_circuit.png differ diff --git a/Resources/Textures/Tiles/rglass.png b/Resources/Textures/Tiles/rglass.png index bae2908132b..6dd3bb59172 100644 Binary files a/Resources/Textures/Tiles/rglass.png and b/Resources/Textures/Tiles/rglass.png differ diff --git a/Resources/Textures/Tiles/shuttleblack.png b/Resources/Textures/Tiles/shuttleblack.png index e5dc3ff666f..8f3981a39f4 100644 Binary files a/Resources/Textures/Tiles/shuttleblack.png and b/Resources/Textures/Tiles/shuttleblack.png differ diff --git a/Resources/Textures/Tiles/shuttleblue.png b/Resources/Textures/Tiles/shuttleblue.png index 8a57cf8b0a1..98d7ea81d80 100644 Binary files a/Resources/Textures/Tiles/shuttleblue.png and b/Resources/Textures/Tiles/shuttleblue.png differ diff --git a/Resources/Textures/Tiles/shuttlegrey.png b/Resources/Textures/Tiles/shuttlegrey.png index 337fef7d30d..8ffd372ab06 100644 Binary files a/Resources/Textures/Tiles/shuttlegrey.png and b/Resources/Textures/Tiles/shuttlegrey.png differ diff --git a/Resources/Textures/Tiles/shuttleorange.png b/Resources/Textures/Tiles/shuttleorange.png index 0e42ad3467d..904d236f864 100644 Binary files a/Resources/Textures/Tiles/shuttleorange.png and b/Resources/Textures/Tiles/shuttleorange.png differ diff --git a/Resources/Textures/Tiles/shuttlepurple.png b/Resources/Textures/Tiles/shuttlepurple.png index 2236948d382..05601b839f6 100644 Binary files a/Resources/Textures/Tiles/shuttlepurple.png and b/Resources/Textures/Tiles/shuttlepurple.png differ diff --git a/Resources/Textures/Tiles/shuttlered.png b/Resources/Textures/Tiles/shuttlered.png index 732cf385d64..8757c81aadc 100644 Binary files a/Resources/Textures/Tiles/shuttlered.png and b/Resources/Textures/Tiles/shuttlered.png differ diff --git a/Resources/Textures/Tiles/shuttlewhite.png b/Resources/Textures/Tiles/shuttlewhite.png index 1308a78d9e4..db7513c5acb 100644 Binary files a/Resources/Textures/Tiles/shuttlewhite.png and b/Resources/Textures/Tiles/shuttlewhite.png differ diff --git a/Resources/Textures/Tiles/steel.png b/Resources/Textures/Tiles/steel.png index b7792ef138e..e5a1ed2879a 100644 Binary files a/Resources/Textures/Tiles/steel.png and b/Resources/Textures/Tiles/steel.png differ diff --git a/Resources/Textures/Tiles/steel_diagonal.png b/Resources/Textures/Tiles/steel_diagonal.png index 0f540532955..b0c1f6927d0 100644 Binary files a/Resources/Textures/Tiles/steel_diagonal.png and b/Resources/Textures/Tiles/steel_diagonal.png differ diff --git a/Resources/Textures/Tiles/steel_diagonal_mini.png b/Resources/Textures/Tiles/steel_diagonal_mini.png index 0b56a7794d2..51cbdf8b040 100644 Binary files a/Resources/Textures/Tiles/steel_diagonal_mini.png and b/Resources/Textures/Tiles/steel_diagonal_mini.png differ diff --git a/Resources/Textures/Tiles/steel_dirty.png b/Resources/Textures/Tiles/steel_dirty.png index 660fdf88685..fda6fabe1fc 100644 Binary files a/Resources/Textures/Tiles/steel_dirty.png and b/Resources/Textures/Tiles/steel_dirty.png differ diff --git a/Resources/Textures/Tiles/steel_herringbone.png b/Resources/Textures/Tiles/steel_herringbone.png index 2f676827d7a..19ae3bb8717 100644 Binary files a/Resources/Textures/Tiles/steel_herringbone.png and b/Resources/Textures/Tiles/steel_herringbone.png differ diff --git a/Resources/Textures/Tiles/steel_mini.png b/Resources/Textures/Tiles/steel_mini.png index 40a8706441a..8fa958f3fe5 100644 Binary files a/Resources/Textures/Tiles/steel_mini.png and b/Resources/Textures/Tiles/steel_mini.png differ diff --git a/Resources/Textures/Tiles/steel_mono.png b/Resources/Textures/Tiles/steel_mono.png index 94121926a3d..a2a72581e08 100644 Binary files a/Resources/Textures/Tiles/steel_mono.png and b/Resources/Textures/Tiles/steel_mono.png differ diff --git a/Resources/Textures/Tiles/steel_offset.png b/Resources/Textures/Tiles/steel_offset.png index 850daeffd5c..796fbcd5955 100644 Binary files a/Resources/Textures/Tiles/steel_offset.png and b/Resources/Textures/Tiles/steel_offset.png differ diff --git a/Resources/Textures/Tiles/steel_pavement.png b/Resources/Textures/Tiles/steel_pavement.png index 5b561e9ae65..200471ea995 100644 Binary files a/Resources/Textures/Tiles/steel_pavement.png and b/Resources/Textures/Tiles/steel_pavement.png differ diff --git a/Resources/Textures/Tiles/steel_pavement_vertical.png b/Resources/Textures/Tiles/steel_pavement_vertical.png index 1c38de21e7a..950a2c0e5f1 100644 Binary files a/Resources/Textures/Tiles/steel_pavement_vertical.png and b/Resources/Textures/Tiles/steel_pavement_vertical.png differ diff --git a/Resources/Textures/Tiles/white.png b/Resources/Textures/Tiles/white.png index 0ec2c911915..048c1fe179c 100644 Binary files a/Resources/Textures/Tiles/white.png and b/Resources/Textures/Tiles/white.png differ diff --git a/Resources/Textures/Tiles/white_diagonal.png b/Resources/Textures/Tiles/white_diagonal.png index e25e448a710..e9d52ab7d98 100644 Binary files a/Resources/Textures/Tiles/white_diagonal.png and b/Resources/Textures/Tiles/white_diagonal.png differ diff --git a/Resources/Textures/Tiles/white_diagonal_mini.png b/Resources/Textures/Tiles/white_diagonal_mini.png index 736733753a6..e4e32c65cd9 100644 Binary files a/Resources/Textures/Tiles/white_diagonal_mini.png and b/Resources/Textures/Tiles/white_diagonal_mini.png differ diff --git a/Resources/Textures/Tiles/white_herringbone.png b/Resources/Textures/Tiles/white_herringbone.png index fef9466a174..80d006810bf 100644 Binary files a/Resources/Textures/Tiles/white_herringbone.png and b/Resources/Textures/Tiles/white_herringbone.png differ diff --git a/Resources/Textures/Tiles/white_mini.png b/Resources/Textures/Tiles/white_mini.png index b0fc32c2c83..717ec462c44 100644 Binary files a/Resources/Textures/Tiles/white_mini.png and b/Resources/Textures/Tiles/white_mini.png differ diff --git a/Resources/Textures/Tiles/white_mono.png b/Resources/Textures/Tiles/white_mono.png index 66eedee0f69..763f08b9d20 100644 Binary files a/Resources/Textures/Tiles/white_mono.png and b/Resources/Textures/Tiles/white_mono.png differ diff --git a/Resources/Textures/Tiles/white_offset.png b/Resources/Textures/Tiles/white_offset.png index 19537e3896b..0b6239a3249 100644 Binary files a/Resources/Textures/Tiles/white_offset.png and b/Resources/Textures/Tiles/white_offset.png differ diff --git a/Resources/Textures/Tiles/white_pavement.png b/Resources/Textures/Tiles/white_pavement.png index 78fcf0195d2..69da122ba61 100644 Binary files a/Resources/Textures/Tiles/white_pavement.png and b/Resources/Textures/Tiles/white_pavement.png differ diff --git a/Resources/Textures/Tiles/white_pavement_vertical.png b/Resources/Textures/Tiles/white_pavement_vertical.png index 5126f699db5..20d887903c5 100644 Binary files a/Resources/Textures/Tiles/white_pavement_vertical.png and b/Resources/Textures/Tiles/white_pavement_vertical.png differ diff --git a/Resources/Textures/Tiles/white_plastic.png b/Resources/Textures/Tiles/white_plastic.png index 99d6c60e881..b31ea0e8553 100644 Binary files a/Resources/Textures/Tiles/white_plastic.png and b/Resources/Textures/Tiles/white_plastic.png differ diff --git a/Resources/keybinds.yml b/Resources/keybinds.yml index 346156159a7..8fa26542caa 100644 --- a/Resources/keybinds.yml +++ b/Resources/keybinds.yml @@ -184,6 +184,9 @@ binds: - function: OpenCharacterMenu type: State key: C +- function: OpenLanguageMenu + type: State + key: L - function: TextCursorSelect # TextCursorSelect HAS to be above ExamineEntity # So that LineEdit receives it correctly. @@ -252,6 +255,12 @@ binds: type: State key: V mod1: Shift +- function: OfferItem + type: State + key: F +- function: ToggleStanding + type: State + key: R - function: ShowDebugConsole type: State key: Tilde diff --git a/RobustToolbox b/RobustToolbox index 25bbb21dc86..eb638099999 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 25bbb21dc868b4e0b43b6d28e899710891b35868 +Subproject commit eb638099999dce3a43d90772ca976ae010d649c0 diff --git a/Scripts/bat/buildAllDebug.bat b/Scripts/bat/buildAllDebug.bat index 5cf49521753..1e3cc5442e3 100755 --- a/Scripts/bat/buildAllDebug.bat +++ b/Scripts/bat/buildAllDebug.bat @@ -1,7 +1,6 @@ @echo off cd ../../ -call python RUN_THIS.py call git submodule update --init --recursive call dotnet build -c Debug diff --git a/Scripts/bat/buildAllRelease.bat b/Scripts/bat/buildAllRelease.bat index 6a8cbac6648..730b39d26e3 100755 --- a/Scripts/bat/buildAllRelease.bat +++ b/Scripts/bat/buildAllRelease.bat @@ -1,7 +1,6 @@ @echo off cd ../../ -call python RUN_THIS.py call git submodule update --init --recursive call dotnet build -c Release diff --git a/Scripts/bat/buildAllTools.bat b/Scripts/bat/buildAllTools.bat index 7c878cbabb5..37db01f459d 100755 --- a/Scripts/bat/buildAllTools.bat +++ b/Scripts/bat/buildAllTools.bat @@ -1,7 +1,6 @@ @echo off cd ../../ -call python RUN_THIS.py call git submodule update --init --recursive call dotnet build -c Tools diff --git a/Scripts/sh/buildAllDebug.sh b/Scripts/sh/buildAllDebug.sh index 1ee457ff2ae..1e62ef7742c 100755 --- a/Scripts/sh/buildAllDebug.sh +++ b/Scripts/sh/buildAllDebug.sh @@ -7,6 +7,5 @@ fi cd ../../ -python RUN_THIS.py git submodule update --init --recursive dotnet build -c Debug diff --git a/Scripts/sh/buildAllRelease.sh b/Scripts/sh/buildAllRelease.sh index b3749ac28d8..3cfb84b76c0 100755 --- a/Scripts/sh/buildAllRelease.sh +++ b/Scripts/sh/buildAllRelease.sh @@ -7,6 +7,5 @@ fi cd ../../ -python RUN_THIS.py git submodule update --init --recursive dotnet build -c Release diff --git a/Scripts/sh/buildAllTools.sh b/Scripts/sh/buildAllTools.sh index 14a68487afe..551db74fcb5 100755 --- a/Scripts/sh/buildAllTools.sh +++ b/Scripts/sh/buildAllTools.sh @@ -7,6 +7,5 @@ fi cd ../../ -python RUN_THIS.py git submodule update --init --recursive dotnet build -c Tools diff --git a/Tools/changelog/package.json b/Tools/changelog/package.json deleted file mode 100644 index 512a3624c87..00000000000 --- a/Tools/changelog/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "changelogs", - "dependencies": { - "axios": "^1.3.4", - "js-yaml": "^4.1.0" - } -} diff --git a/Tools/changelog/changelog.js b/Tools/changelogs/changelog.js similarity index 100% rename from Tools/changelog/changelog.js rename to Tools/changelogs/changelog.js diff --git a/Tools/changelogs/package.json b/Tools/changelogs/package.json new file mode 100644 index 00000000000..1f0899df96c --- /dev/null +++ b/Tools/changelogs/package.json @@ -0,0 +1,9 @@ +{ + "name": "changelogs", + "author": "DEATHB4DEFEAT", + "license": "MIT", + "dependencies": { + "axios": "^1.3.4", + "js-yaml": "^4.1.0" + } +} diff --git a/Tools/prtitlecase/index.js b/Tools/prtitlecase/index.js new file mode 100644 index 00000000000..0d72b711312 --- /dev/null +++ b/Tools/prtitlecase/index.js @@ -0,0 +1,19 @@ +import axios from 'axios'; +import { titleCase } from 'title-case'; + +if (process.env.GITHUB_TOKEN) axios.defaults.headers.common['Authorization'] = `token ${process.env.GITHUB_TOKEN}`; +else throw new Error('BOT_TOKEN was not provided in repository secrets or GITHUB_TOKEN was not set correctly.'); + + +// Get PR title +let prTitle = await axios.get(`https://api.github.com/repos/${process.env.GITHUB_REPOSITORY}/pulls/${process.env.PR_NUMBER}`) + .then(res => res.data.title); + +// Title case PR title +console.log(`Old PR title: ${prTitle}`); +prTitle = titleCase(prTitle); +console.log(`New PR title: ${prTitle}`); + +// Update PR title +await axios.patch(`https://api.github.com/repos/${process.env.GITHUB_REPOSITORY}/pulls/${process.env.PR_NUMBER}`, + { title: prTitle }); diff --git a/Tools/prtitlecase/package.json b/Tools/prtitlecase/package.json new file mode 100644 index 00000000000..ecba01099fe --- /dev/null +++ b/Tools/prtitlecase/package.json @@ -0,0 +1,12 @@ +{ + "name": "prtitlecase", + "description": "Converts PR titles to Title Case using title-case package", + "type": "module", + "exports": "./index.js", + "author": "DEATHB4DEFEAT", + "license": "MIT", + "dependencies": { + "axios": "^1.7.2", + "title-case": "^4.3.1" + } +} diff --git a/flake.lock b/flake.lock index 6ab38fa41bd..7baaa468ea5 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1705309234, - "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", "type": "github" }, "original": { @@ -20,16 +20,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1708210246, - "narHash": "sha256-Q8L9XwrBK53fbuuIFMbjKvoV7ixfLFKLw4yV+SD28Y8=", + "lastModified": 1717352157, + "narHash": "sha256-hbBzucWOhwxt3QzeAyUojtD6/aHH81JssDfhFfmqOy0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "69405156cffbdf2be50153f13cbdf9a0bea38e49", + "rev": "44f538ab12e2726af450877a5529f4fd88ddb0fb", "type": "github" }, "original": { "owner": "NixOS", - "ref": "release-23.11", + "ref": "release-24.05", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index e2e119eb997..095e6b017c7 100644 --- a/flake.nix +++ b/flake.nix @@ -1,7 +1,7 @@ { description = "Development environment for Space Station 14"; - inputs.nixpkgs.url = "github:NixOS/nixpkgs/release-23.11"; + inputs.nixpkgs.url = "github:NixOS/nixpkgs/release-24.05"; inputs.flake-utils.url = "github:numtide/flake-utils"; outputs = { self, nixpkgs, flake-utils }: diff --git a/global.json b/global.json index 2244195a209..c8526b0a8ba 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { "version": "8.0.100", - "rollForward": "disable" + "rollForward": "patch" } } diff --git a/shell.nix b/shell.nix index 9a1b0ca4290..57d64e00718 100644 --- a/shell.nix +++ b/shell.nix @@ -7,7 +7,7 @@ in import (builtins.fetchTarball { let dependencies = with pkgs; [ - dotnetCorePackages.sdk_8_0 + dotnetCorePackages.sdk_8_0_1xx glfw SDL2 libGL @@ -41,7 +41,6 @@ let dbus at-spi2-core cups - python3 ]; in pkgs.mkShell { name = "space-station-14-devshell";