diff --git a/.github/workflows/labeler-review.yml b/.github/workflows/labeler-review.yml index e224e7de090..cc9ded41087 100644 --- a/.github/workflows/labeler-review.yml +++ b/.github/workflows/labeler-review.yml @@ -5,86 +5,28 @@ # # SPDX-License-Identifier: AGPL-3.0-or-later -name: "Labels: Approved" - -on: - pull_request_review: - types: [submitted] - -jobs: - label-on-approval: - permissions: - contents: read - issues: write - pull-requests: write - runs-on: ubuntu-latest - steps: - - name: Create JSON File - id: curling-reviews - run: | - PR_NUMBER=${{ github.event.pull_request.number }} - OWNER=${{ github.repository_owner }} - REPO=${{ github.event.repository.name }} - TOKEN=${{ secrets.GITHUB_TOKEN }} - - # Fetch the reviews and place them into a json file. - curl -o reviews.json -L \ - -H "Accept: application/vnd.github+json" \ - -H "Authorization: Bearer $TOKEN" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - https://api.github.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER/reviews - - - name: Check for Approvals - id: check-approvals - run: | - # Count the number of approvals - APPROVALS=$(jq '[.[] | select(.state=="APPROVED")] | length' reviews.json) - - echo "Number of approvals: $APPROVALS" - echo "::set-output name=approvals::$APPROVALS" - - - name: Add Approved Label if Enough Approvals - if: steps.check-approvals.outputs.approvals >= 2 # Change the threshold here - uses: actions-ecosystem/action-add-labels@v1 - env: - github_token: ${{ secrets.GITHUB_TOKEN }} - with: - labels: "S: Approved" - - - name: Remove Other Labels on Approved - if: steps.check-approvals.outputs.approval >= 2 - uses: actions-ecosystem/action-remove-labels@v1 - env: - github_token: ${{ secrets.GITHUB_TOKEN }} - with: - labels: | - "S: Needs Review" - "S: Needs Second Approval" - - - name: Add Second Approval Requirement on Approval - if: steps.check-approvals.outputs.approvals == 1 - uses: actions-ecosystem/action-add-labels@v1 - env: - github_token: ${{ secrets.GITHUB_TOKEN }} - with: - labels: | - "S: Needs Second Approval" - "S: Needs Review" - - - name: Remove Other Labels on Second Approval Requirement - if: steps.check-approvals.outputs.approvals == 1 - uses: actions-ecosystem/action-remove-labels@v1 - env: - github_token: ${{ secrets.GITHUB_TOKEN }} - with: - labels: "S: Approved" - - - name: Remove All Other Labels if No Approval - if: steps.check-approvals.outputs.approvals < 1 - uses: actions-ecosystem/action-remove-labels@v1 - env: - github_token: ${{ secrets.GITHUB_TOKEN }} - with: - labels: | - "S: Approved" - "S: Needs Second Approval" +#name: "Labels: Approved" +# +#on: +# pull_request_review: +# types: [submitted] +# +#jobs: +# add_label: +# # Change the repository name after you've made sure the team name is correct for your fork! +# if: ${{ (github.repository == 'Goob-Station/Goob-Station') && (github.event.review.state == 'APPROVED') }} +# permissions: +# contents: read +# pull-requests: write +# runs-on: ubuntu-latest +# steps: +# - uses: tspascoal/get-user-teams-membership@v3 +# id: checkUserMember +# with: +# username: ${{ github.actor }} +# team: "maintainers" +# GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }} +# - if: ${{ steps.checkUserMember.outputs.isTeamMember == 'true' }} +# uses: actions-ecosystem/action-add-labels@v1 +# with: +# labels: "S: Approved" diff --git a/Content.Benchmarks/MapLoadBenchmark.cs b/Content.Benchmarks/MapLoadBenchmark.cs index 6c932719465..546cf9e3ac1 100644 --- a/Content.Benchmarks/MapLoadBenchmark.cs +++ b/Content.Benchmarks/MapLoadBenchmark.cs @@ -77,7 +77,7 @@ public async Task Cleanup() PoolManager.Shutdown(); } - public static readonly string[] MapsSource = { "Empty", "Satlern", "Box", "Bagel", "Dev", "CentComm", "Atlas", "Core", "TestTeg", "Packed", "Origin", "Omega", "Cluster", "Reach", "Meta", "Marathon", "Europa", "MeteorArena", "Fland", "Oasis", "FlandHighPop", "OasisHighPop", "OriginHighPop", "Barratry", "Kettle", "Submarine", "Lambda", "Leonid", "Delta", "Amber", "Chloris", "Cog", "Glacier", "Serpentcrest"}; //Goobstation, readds maps + public static readonly string[] MapsSource = { "Empty", "Satlern", "Box", "Bagel", "Dev", "CentComm", "Atlas", "Core", "TestTeg", "Packed", "Origin", "Omega", "Cluster", "Reach", "Meta", "Marathon", "Europa", "MeteorArena", "Fland", "Oasis", "FlandHighPop", "OasisHighPop", "OriginHighPop", "Barratry", "Kettle", "Submarine", "Lambda", "Leonid", "Delta", "Amber", "Chloris", "Cog", "Serpentcrest"}; //Goobstation, readds maps [ParamsSource(nameof(MapsSource))] public string Map; diff --git a/Content.Client/Inventory/StrippableBoundUserInterface.cs b/Content.Client/Inventory/StrippableBoundUserInterface.cs index db74c6233bf..0d382bf2f7d 100644 --- a/Content.Client/Inventory/StrippableBoundUserInterface.cs +++ b/Content.Client/Inventory/StrippableBoundUserInterface.cs @@ -66,7 +66,6 @@ using Robust.Shared.Map; using static Content.Client.Inventory.ClientInventorySystem; using static Robust.Client.UserInterface.Control; -using Content.Shared._Omu.Components; // Omu namespace Content.Client.Inventory { @@ -239,7 +238,7 @@ private void AddHandButton(Entity ent, string handId, Hand hand) var isCard = EntMan.HasComponent(heldEntity) || EntMan.HasComponent(heldEntity); UpdateEntityIcon(button, isCard ? _virtualHiddenEntity : heldEntity); - + _strippingMenu!.HandsContainer.AddChild(button); LayoutContainer.SetPosition(button, new Vector2i(_handCount, 0) * (SlotControl.DefaultButtonSize + ButtonSeparation)); _handCount++; @@ -280,8 +279,7 @@ private void AddInventoryButton(EntityUid invUid, string slotId, InventoryCompon // If this is a full pocket, obscure the real entity // this does not work for modified clients because they are still sent the real entity - if (entity != null && _strippable.IsStripHidden(slotDef, _player.LocalEntity) - && !EntMan.HasComponent(PlayerManager.LocalEntity)) // Omu edit - recreating EE thieving + if (entity != null && _strippable.IsStripHidden(slotDef, _player.LocalEntity)) entity = _virtualHiddenEntity; // Goobstation: Playing Cards are always obscured in strip menu. @@ -333,4 +331,4 @@ private void UpdateEntityIcon(SlotControl button, EntityUid? entity) button.SetEntity(viewEnt); } } -} +} \ No newline at end of file diff --git a/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs index 09b124e334d..629711cf981 100644 --- a/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs @@ -156,7 +156,6 @@ using System.IO; using System.Linq; using System.Numerics; -using Content.Client._Omu.Lobby.Ui.Roles; // Omustation - Remake EE Traits System - change TraitPreferenceSelector for TraitRequirementsSelector using Content.Client.Humanoid; using Content.Client.Lobby.UI.Loadouts; using Content.Client.Lobby.UI.Roles; @@ -214,9 +213,6 @@ public sealed partial class HumanoidProfileEditor : BoxContainer // CCvar. private int _maxNameLength; private bool _allowFlavorText; - private readonly int _maxTraits; // Omustation - Remake EE Traits System - Maximum allowed traits functionality - private readonly int _traitStartingPoints; // Omustation - Remake EE Traits System - global trait points functionality - private FlavorText.FlavorText? _flavorText; private TextEdit? _flavorTextEdit; @@ -252,11 +248,6 @@ public sealed partial class HumanoidProfileEditor : BoxContainer /// public HumanoidCharacterProfile? Profile; - private int _selectedTraitCount; // Omustation - Remake EE Traits System - Maximum allowed traits functionality - private int _selectedTraitPointCount; // Omustation - Remake EE Traits System - Maximum allowed traits functionality - - private Dictionary _traitCategoryContainers = new(); // Omustation - Remake EE Traits System - Redesign traits tab - private List _species = new(); private List<(string, RequirementsSelector)> _jobPriorities = new(); @@ -303,8 +294,6 @@ public HumanoidProfileEditor( _maxNameLength = _cfgManager.GetCVar(CCVars.MaxNameLength); _allowFlavorText = _cfgManager.GetCVar(CCVars.FlavorText); - _maxTraits = _cfgManager.GetCVar(CCVars.TraitsMaxTraits); // Omustation - Remake EE Traits System - _traitStartingPoints = _cfgManager.GetCVar(CCVars.TraitsDefaultPoints); // Omustation - Remake EE Traits System ImportButton.OnPressed += args => { @@ -401,7 +390,7 @@ public HumanoidProfileEditor( }; // begin Goobstation: port EE height/width sliders - #region Height and Width + #region Height and Width UpdateHeightWidthSliders(); UpdateDimensions(SliderUpdate.Both); @@ -607,27 +596,6 @@ public HumanoidProfileEditor( TabContainer.SetTabTitle(2, Loc.GetString("humanoid-profile-editor-antags-tab")); - #region Omu Traits - - // Omustation - this was previously in RefreshTraits(), but if I'm fully embracing that that method will be wholly incompatible with upstream merges. - // Like, there's no reason for the tab title to be set every single time the tab is refreshed. Why was it done that way when the rest of the tabs are done properly?? - TabContainer.SetTabTitle(3, Loc.GetString("humanoid-profile-editor-traits-tab")); - - // Get all trait categories, sorted A-Z. - var categories = _prototypeManager.EnumeratePrototypes().OrderBy(t => Loc.GetString(t.Name)).ToList(); - - foreach (var category in categories) - { - // each category should have a container, which that category's trait selectors can be loaded into. - var container = new BoxContainer() { Orientation = LayoutOrientation.Vertical }; - _traitCategoryContainers.Add(category.Name, container); - - // The index here is meaningful: category 0 in _traitCategoryContainers will correspond to tab 0 here. - TraitTabs.AddTab(container, Loc.GetString(category.Name)); - } - - #endregion Omu Traits - RefreshTraits(); #region Markings @@ -702,149 +670,126 @@ public void RefreshFlavorText() } } - // begin Omustation - dear god this method is so far removed from what it was upstream. WELP. I just hope the comments are useful. /// /// Refreshes traits selector /// public void RefreshTraits() { - // Hide the trait points bar if global trait points are disabled. - TraitPointsBar.Visible = _cfgManager.GetCVar(CCVars.TraitsGlobalPointsEnabled); + TraitsList.DisposeAllChildren(); + + var traits = _prototypeManager.EnumeratePrototypes().OrderBy(t => Loc.GetString(t.Name)).ToList(); + TabContainer.SetTabTitle(3, Loc.GetString("humanoid-profile-editor-traits-tab")); - // Empty out each of the trait tabs, so that they can be refreshed. - foreach (var (_, control) in _traitCategoryContainers) + if (traits.Count < 1) { - control.DisposeAllChildren(); + TraitsList.AddChild(new Label + { + Text = Loc.GetString("humanoid-profile-editor-no-traits"), + FontColorOverride = Color.Gray, + }); + return; } - // get all traits, ordered first alphabetically, and then by global points cost. - var traits = _prototypeManager.EnumeratePrototypes().OrderBy(t => Loc.GetString(t.Name)).ToList().OrderByDescending(t => t.GlobalCost); - - // setup the maxtraits and global trait points counters. These values will go up as selectors are (re)added to the UI. - _selectedTraitCount = 0; - _selectedTraitPointCount = _traitStartingPoints; - - // keep track of which categories have category-specific points, and the points which those categories have. - Dictionary categoriesWithPoints = new(); + // Setup model + Dictionary> traitGroups = new(); + List defaultTraits = new(); + traitGroups.Add(TraitCategoryPrototype.Default, defaultTraits); foreach (var trait in traits) { - // Get this trait's category, and skip this trait if it doesn't have one. - if (!_prototypeManager.TryIndex(trait.Category, out var category)) - continue; - - // Ensure that the trait category has an associated container to put selectors into. - if (!_traitCategoryContainers.TryGetValue(category.Name, out var categoryContainer)) + // Begin Goobstation: ported from DeltaV - Species trait exclusion + if (Profile?.Species is { } selectedSpecies && (trait.ExcludedSpecies.Contains(selectedSpecies) || + trait.IncludedSpecies.Count > 0 && !trait.IncludedSpecies.Contains(selectedSpecies))) + { + Profile = Profile?.WithoutTraitPreference(trait.ID, _prototypeManager); continue; + } + // End Goobstation: ported from DeltaV - Species trait exclusion - // Take note of categories with their own points count, so we can add category-points text later. - if (category.MaxTraitPoints > 0 && !categoriesWithPoints.ContainsKey(category)) + if (trait.Category == null) { - categoriesWithPoints.Add(category, 0); + defaultTraits.Add(trait.ID); + continue; } - // Create a selector for this trait, but don't display it just yet. - var selector = new TraitRequirementsSelector(_cfgManager); - var selectorName = trait.Cost != 0 ? Loc.GetString(trait.Name) + " [" + trait.Cost + "]" : Loc.GetString(trait.Name); - var selectorDescription = Loc.GetString(trait.Description != null ? trait.Description : ""); + if (!_prototypeManager.HasIndex(trait.Category)) + continue; - // put the selector into the trait category container. - categoryContainer.AddChild(selector); + var group = traitGroups.GetOrNew(trait.Category); + group.Add(trait.ID); + } - // Apply the player's trait preference to this trait's selector. - selector.Preference = Profile?.TraitPreferences.Contains(trait.ID) ?? false; + // Create UI view from model + foreach (var (categoryId, categoryTraits) in traitGroups) + { + TraitCategoryPrototype? category = null; - // increment the trait count and points, if the user has the trait selected. - if (selector.Preference) + if (categoryId != TraitCategoryPrototype.Default) { - _selectedTraitPointCount -= trait.GlobalCost; - - if (categoriesWithPoints.ContainsKey(category)) + category = _prototypeManager.Index(categoryId); + // Label + TraitsList.AddChild(new Label { - categoriesWithPoints[category] += trait.Cost; - } - - if (trait.CountsTowardsMaxTraits) - _selectedTraitCount++; + Text = Loc.GetString(category.Name), + Margin = new Thickness(0, 10, 0, 0), + StyleClasses = { StyleBase.StyleClassLabelHeading }, + }); } - // Make sure that the player meets the requirements to select this trait. If they don't the trait is locked. - // Since the player's preference has already been applied, it's up to other systems (such as spawning, handled by the server) - // to ensure the player can't spawn when they don't meet the requirements. - // If we apply the player's preference after locking the selector, the player might not be able to deselect the trait. - if (!_requirements.CheckTraitRequirements(trait, (HumanoidCharacterProfile?) _preferencesManager.Preferences?.SelectedCharacter, out var reason)) + List selectors = new(); + var selectionCount = 0; + + foreach (var traitProto in categoryTraits) { - selector.LockRequirements(); + var trait = _prototypeManager.Index(traitProto); + var selector = new TraitPreferenceSelector(trait); + + selector.Preference = Profile?.TraitPreferences.Contains(trait.ID) == true; + if (selector.Preference) + selectionCount += trait.Cost; + + selector.PreferenceChanged += preference => + { + if (preference) + { + Profile = Profile?.WithTraitPreference(trait.ID, _prototypeManager); + } + else + { + Profile = Profile?.WithoutTraitPreference(trait.ID, _prototypeManager); + } + + SetDirty(); + RefreshTraits(); // If too many traits are selected, they will be reset to the real value. + }; + selectors.Add(selector); } - else + + // Selection counter + if (category is { MaxTraitPoints: >= 0 }) { - selector.UnlockRequirements(); + TraitsList.AddChild(new Label + { + Text = Loc.GetString("humanoid-profile-editor-trait-count-hint", ("current", selectionCount), ("max", category.MaxTraitPoints)), + FontColorOverride = Color.Gray + }); } - // Define what should happen when the trait selector is pressed by the player. - selector.PreferenceChanged += preference => + foreach (var selector in selectors) { - if (preference && - (_selectedTraitCount < _maxTraits || _maxTraits <= 0)) // make sure the player isn't selecting more traits than they're allowed - { - Profile = Profile?.WithTraitPreference(trait.ID, _prototypeManager); - _selectedTraitPointCount -= trait.GlobalCost; + if (selector == null) + continue; - if (trait.CountsTowardsMaxTraits) - _selectedTraitCount++; - } - else + if (category is { MaxTraitPoints: >= 0 } && + selector.Cost + selectionCount > category.MaxTraitPoints) { - Profile = Profile?.WithoutTraitPreference(trait.ID, _prototypeManager); - _selectedTraitPointCount += trait.GlobalCost; - - if (trait.CountsTowardsMaxTraits) - _selectedTraitCount--; + selector.Checkbox.Label.FontColorOverride = Color.Red; } - SetDirty(); - RefreshTraits(); - }; - - // NOW show the trait selector. - selector.Setup(trait, reason); - } - - // each category with category-specific points recieves a label here. - foreach (var (categoryWithPoints, categoryPoints) in categoriesWithPoints) - { - // create the label - var categoryPointsText = new Label - { - Text = Loc.GetString("humanoid-profile-editor-trait-count-hint", ("current", categoryPoints), ("max", categoryWithPoints.MaxTraitPoints!)), // we know MaxTraitPoints isn't null here because it needs to have value in order to add this category to categoriesWithPoints - FontColorOverride = Color.LightGray - }; - - // add the label to the category - if (_traitCategoryContainers.TryGetValue(categoryWithPoints.Name, out var categoryContainer)) - { - categoryContainer.AddChild(categoryPointsText); - categoryPointsText.SetPositionFirst(); // show the points text at the top of the category. + TraitsList.AddChild(selector); } } - - // show points remaining only if the global points system is enabled - if (_cfgManager.GetCVar(CCVars.TraitsGlobalPointsEnabled) && _maxTraits > 0) - TraitPointsLabel.Text = Loc.GetString("humanoid-profile-editor-traits-header", ("pointsRemaining", _selectedTraitPointCount), ("traits", _selectedTraitCount), ("maxTraits", _maxTraits)); - else - { - if (_maxTraits > 0) - TraitPointsLabel.Text = Loc.GetString("humanoid-profile-editor-traits-header-no-points", ("traits", _selectedTraitCount), ("maxTraits", _maxTraits)); // Omustation - Remake EE Traits System - else if (_cfgManager.GetCVar(CCVars.TraitsGlobalPointsEnabled)) - TraitPointsLabel.Text = Loc.GetString("humanoid-profile-editor-traits-header-no-maxtraits", ("pointsRemaining", _selectedTraitPointCount)); - else - TraitPointsLabel.Text = ""; - } - - TraitPointsBar.Value = _selectedTraitPointCount; - TraitPointsBar.MaxValue = _traitStartingPoints; } - // end Omustation /// /// Refreshes the species selector. @@ -1498,7 +1443,6 @@ private void SetSpecies(string newSpecies) RefreshJobs(); // In case there's species restrictions for loadouts RefreshLoadouts(); - RefreshTraits();// Omustation - Remake EE Traits - In case there's species restrictions for traits UpdateSexControls(); // update sex for new species UpdateSpeciesGuidebookIcon(); ReloadPreview(); @@ -1507,6 +1451,7 @@ private void SetSpecies(string newSpecies) UpdateHeightWidthSliders(); UpdateWeight(); // end Goobstation: port EE height/width sliders + RefreshTraits(); // Goobstation: ported from DeltaV - Species trait exclusion } private void SetName(string newName) diff --git a/Content.Goobstation.Server/Administration/Systems/GoobAdminVerbSystem.Smites.cs b/Content.Goobstation.Server/Administration/Systems/GoobAdminVerbSystem.Smites.cs index a8b639be72f..fa9cc925bea 100644 --- a/Content.Goobstation.Server/Administration/Systems/GoobAdminVerbSystem.Smites.cs +++ b/Content.Goobstation.Server/Administration/Systems/GoobAdminVerbSystem.Smites.cs @@ -4,21 +4,14 @@ // SPDX-License-Identifier: AGPL-3.0-or-later using System.Threading; -using Content.Goobstation.Shared.Maps; using Content.Goobstation.Shared.MisandryBox.Smites; -using Content.Goobstation.Shared.HellGoose.Components; using Content.Server.Explosion.EntitySystems; using Content.Shared.Administration; using Content.Shared.Database; using Content.Shared.Verbs; -using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Player; using Robust.Shared.Utility; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; -using Robust.Shared.Maths; -using Robust.Shared.Log; namespace Content.Goobstation.Server.Administration.Systems; @@ -34,7 +27,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = thunderstrike, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/smite.svg.192dpi.png")), + Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/smite.svg.192dpi.png")), Act = () => { var ogun = EntityManager.System(); @@ -44,35 +37,6 @@ private void AddSmiteVerbs(GetVerbsEvent args) Message = Loc.GetString("admin-smite-thunderstrike-desc"), }; args.Verbs.Add(thunder); - var hellName = Loc.GetString("admin-smite-hell-teleport-name").ToLowerInvariant(); // teleports to hell - Verb hellTeleport = new() - { - Text = hellName, - Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/_Goobstation/Effects/portal.rsi"), "portal-hell"), - Act = () => - { - TransformComponent? portalXform = null; - - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var exitComp, out var xform)) - { - portalXform = xform; - break; - } - - if (portalXform == null) - { - return; - } - - // Teleport target - EntityManager.System().SetCoordinates(args.Target, portalXform.Coordinates); - }, - Impact = LogImpact.Extreme, - Message = string.Join(": ", hellName, Loc.GetString("admin-smite-hell-teleport-description")) - }; - args.Verbs.Add(hellTeleport); } private bool SmitesAllowed(GetVerbsEvent args) diff --git a/Content.Goobstation.Server/Chemistry/ChangeTileReaction.cs b/Content.Goobstation.Server/Chemistry/ChangeTileReaction.cs index 95b3cc47083..03fe3fe3b48 100644 --- a/Content.Goobstation.Server/Chemistry/ChangeTileReaction.cs +++ b/Content.Goobstation.Server/Chemistry/ChangeTileReaction.cs @@ -47,7 +47,7 @@ public FixedPoint2 TileReact(TileRef tile, return FixedPoint2.Zero; var tileDefManager = IoCManager.Resolve(); - var turfSystem = entityManager.System(); + var turfSystem = IoCManager.Resolve().GetEntitySystem(); var tileDef = turfSystem.GetContentTileDefinition(tile); if (tileDef.ID == NewTileId) @@ -57,7 +57,7 @@ public FixedPoint2 TileReact(TileRef tile, return FixedPoint2.Zero; var newTileDef = tileDefManager[NewTileId]; - entityManager.System().SetTile(gridUid, mapGrid, gridIndices, new Tile(newTileDef.TileId)); + entityManager.System().SetTile(gridUid, mapGrid, tile.GridIndices, new Tile(newTileDef.TileId)); if (Effect != null) entityManager.SpawnEntity(Effect.Value, new EntityCoordinates(gridUid, gridIndices)); diff --git a/Content.Goobstation.Server/Clothing/MadnessMaskSystem.cs b/Content.Goobstation.Server/Clothing/MadnessMaskSystem.cs index 698522b02b2..9e7cc69c6ef 100644 --- a/Content.Goobstation.Server/Clothing/MadnessMaskSystem.cs +++ b/Content.Goobstation.Server/Clothing/MadnessMaskSystem.cs @@ -7,22 +7,16 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -using Content.Goobstation.Shared.Clothing.Components; -using Content.Shared.Atmos; -using Content.Shared.Clothing.Components; using Content.Shared.Damage.Components; using Content.Shared.Damage.Systems; using Content.Shared.Heretic; -using Content.Shared.Inventory; -using Content.Shared.Inventory.Events; using Content.Shared.Jittering; using Content.Shared.StatusEffectNew; -using Content.Shared.Temperature; using Robust.Shared.Random; namespace Content.Goobstation.Server.Clothing; -public sealed class MadnessMaskSystem : EntitySystem +public sealed partial class MadnessMaskSystem : EntitySystem { [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly SharedStaminaSystem _stamina = default!; @@ -30,89 +24,35 @@ public sealed class MadnessMaskSystem : EntitySystem [Dependency] private readonly StatusEffectsSystem _statusEffect = default!; [Dependency] private readonly IRobustRandom _random = default!; - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnUnequip); - SubscribeLocalEvent>(OnGetProtection); - SubscribeLocalEvent>( - OnTemperatureChangeAttempt); - } - - private void OnUnequip(Entity ent, ref BeingUnequippedAttemptEvent args) - { - if (IsHereticOrGhoul(args.Unequipee)) - return; - - if (TryComp(ent, out var clothing) && (clothing.Slots & args.SlotFlags) == SlotFlags.NONE) - return; - - args.Cancel(); - } - - private void OnTemperatureChangeAttempt(Entity ent, - ref InventoryRelayedEvent args) - { - if (!IsHereticOrGhoul(args.Args.Target)) - return; - - if (args.Args.TemperatureDelta > 0) - args.Args.TemperatureDelta = 0; - } - - private void OnGetProtection(Entity ent, - ref InventoryRelayedEvent args) - { - if (!IsHereticOrGhoul(args.Args.Target)) - return; - - args.Args.Reduce(1f); - } - public override void Update(float frameTime) { base.Update(frameTime); - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var mask, out var clothing)) + foreach (var mask in EntityQuery()) { - if (clothing.InSlot == null) - continue; - mask.UpdateAccumulator += frameTime; - if (mask.UpdateAccumulator < mask.UpdateTimer) continue; mask.UpdateAccumulator = 0; - var lookup = _lookup.GetEntitiesInRange(uid, 5f); + var lookup = _lookup.GetEntitiesInRange(mask.Owner, 5f); foreach (var look in lookup) { // heathens exclusive - if (IsHereticOrGhoul(look)) + if (HasComp(look) + || HasComp(look)) continue; if (HasComp(look) && _random.Prob(.4f)) - _stamina.TakeOvertimeStaminaDamage(look, 10f); + _stamina.TakeStaminaDamage(look, 10f, visual: false, immediate: false); if (_random.Prob(.4f)) _jitter.DoJitter(look, TimeSpan.FromSeconds(.5f), true, amplitude: 5, frequency: 10); if (_random.Prob(.25f)) - { - _statusEffect.TryAddStatusEffectDuration(look, - "StatusEffectSeeingRainbow", - out _, - TimeSpan.FromSeconds(10f)); - } + _statusEffect.TryAddStatusEffectDuration(look, "StatusEffectSeeingRainbow", out _, TimeSpan.FromSeconds(10f)); } } } - - private bool IsHereticOrGhoul(EntityUid uid) - { - return HasComp(uid) || HasComp(uid); - } } diff --git a/Content.Goobstation.Server/Devil/Condemned/CondemnedSystem.cs b/Content.Goobstation.Server/Devil/Condemned/CondemnedSystem.cs index ab86660194d..3daa1ed8376 100644 --- a/Content.Goobstation.Server/Devil/Condemned/CondemnedSystem.cs +++ b/Content.Goobstation.Server/Devil/Condemned/CondemnedSystem.cs @@ -7,8 +7,6 @@ using Content.Goobstation.Shared.Devil; using Content.Goobstation.Shared.Devil.Condemned; using Content.Goobstation.Shared.Religion; -using Content.Goobstation.Shared.HellGoose.Components; -using Content.Goobstation.Shared.Maps; using Content.Server._Shitmed.StatusEffects; using Content.Server.IdentityManagement; using Content.Server.Polymorph.Systems; @@ -18,15 +16,10 @@ using Content.Shared.Movement.Events; using Content.Shared.Polymorph; using Content.Shared.Popups; -using Content.Shared.Teleportation.Components; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Prototypes; using Robust.Shared.Spawners; -using Robust.Shared.Map; -using Robust.Shared.Map.Components; -using Robust.Shared.EntitySerialization.Systems; -using Robust.Shared.EntitySerialization; namespace Content.Goobstation.Server.Devil.Condemned; @@ -36,8 +29,6 @@ public sealed partial class CondemnedSystem : EntitySystem [Dependency] private readonly PolymorphSystem _poly = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly ScrambleDnaEffectSystem _scramble = default!; - [Dependency] private readonly SharedTransformSystem _sharedTransformSystem = default!; - [Dependency] private readonly MapLoaderSystem _mapLoader = default!; public override void Initialize() { base.Initialize(); @@ -156,63 +147,15 @@ private void UpdateHandPhase(EntityUid uid, float frameTime, CondemnedComponent? comp.CurrentPhase = CondemnedPhase.Complete; } - private void DoCondemnedBehavior(EntityUid uid, bool scramble = true, CondemnedComponent? comp = null, bool retry = false) + private void DoCondemnedBehavior(EntityUid uid, bool scramble = true, CondemnedComponent? comp = null) { - TransformComponent? portalXform = null; - HellPortalExitComponent? targetportal = null; if (!Resolve(uid, ref comp)) return; switch (comp) { case { CondemnedBehavior: CondemnedBehavior.Delete }: - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var hellexitportalcomp, out var xform)) - { - targetportal = hellexitportalcomp; - portalXform = xform; - break; - } - - if (targetportal == null || portalXform == null) - { - if (!_mapLoader.TryLoadMap(comp.HellMapPath, - out var map, out var roots, - options: new DeserializationOptions { InitializeMaps = true })) - { - Log.Error($"Failed to load hell map at {comp.HellMapPath}"); - QueueDel(map); - return; - } - - foreach (var root in roots) - { - if (!HasComp(root)) - continue; - - var pos = new EntityCoordinates(root, 0, 0); - - var exitPortal = Spawn(comp.ExitPortalPrototype, pos); - - EnsureComp(exitPortal, out var hellPortalComp); - - var newHellMapComp = EnsureComp(root); - newHellMapComp.ExitPortal = exitPortal; - - break; - } - if (!retry) - { - DoCondemnedBehavior(uid, scramble, comp, true); - return; - } - } - if (portalXform == null) - { - return; - } - // Teleport - _sharedTransformSystem.SetCoordinates(uid, portalXform.Coordinates); + QueueDel(uid); break; case { CondemnedBehavior: CondemnedBehavior.Banish }: if (scramble) diff --git a/Content.Goobstation.Server/Nightmare/LightEaterSystem.cs b/Content.Goobstation.Server/Nightmare/LightEaterSystem.cs index d49adea7fab..ef12b67c8ac 100644 --- a/Content.Goobstation.Server/Nightmare/LightEaterSystem.cs +++ b/Content.Goobstation.Server/Nightmare/LightEaterSystem.cs @@ -34,14 +34,14 @@ public override void Initialize() SubscribeLocalEvent(OnToggleLightEater); SubscribeLocalEvent(OnMeleeHit); - SubscribeLocalEvent(OnStartup); - SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnShutdown); } - private void OnStartup(Entity ent, ref MapInitEvent args) + private void OnStartup(Entity ent, ref MapInitEvent args) => _actions.AddAction(ent.Owner, ref ent.Comp.ActionEnt, ent.Comp.ActionId); - private void OnShutdown(Entity ent, ref ComponentShutdown args) + private void OnShutdown(Entity ent, ref ComponentShutdown args) => _actions.RemoveAction(ent.Owner, ent.Comp.ActionEnt); private void OnToggleLightEater(EntityUid uid, LightEaterUserComponent component, ToggleLightEaterEvent args) diff --git a/Content.Goobstation.Server/Shadowling/Systems/Abilities/PreAscension/ShadowlingVeilSystem.cs b/Content.Goobstation.Server/Shadowling/Systems/Abilities/PreAscension/ShadowlingVeilSystem.cs index d1c2d85e1c0..a16aa9a59c4 100644 --- a/Content.Goobstation.Server/Shadowling/Systems/Abilities/PreAscension/ShadowlingVeilSystem.cs +++ b/Content.Goobstation.Server/Shadowling/Systems/Abilities/PreAscension/ShadowlingVeilSystem.cs @@ -6,9 +6,7 @@ using Content.Shared.Light; using Content.Shared.Light.Components; using Content.Shared.Light.EntitySystems; -using Content.Shared.Tag; using Robust.Server.GameObjects; -using Robust.Shared.Spawners; namespace Content.Goobstation.Server.Shadowling.Systems.Abilities.PreAscension; @@ -23,26 +21,10 @@ public sealed class ShadowlingVeilSystem : EntitySystem [Dependency] private readonly SharedHandheldLightSystem _handheld = default!; [Dependency] private readonly UnpoweredFlashlightSystem _unpowered = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; - [Dependency] private readonly TagSystem _tag = default!; - - private EntityQuery _pointLightQuery; - private EntityQuery _poweredLightQuery; - private EntityQuery _handheldLightQuery; - private EntityQuery _unpoweredFlashlightQuery; - private EntityQuery _expendableLightQuery; - private EntityQuery _timedDespawnQuery; - public override void Initialize() { base.Initialize(); - _pointLightQuery = GetEntityQuery(); - _poweredLightQuery = GetEntityQuery(); - _handheldLightQuery = GetEntityQuery(); - _unpoweredFlashlightQuery = GetEntityQuery(); - _expendableLightQuery = GetEntityQuery(); - _timedDespawnQuery = GetEntityQuery(); - SubscribeLocalEvent(OnVeilActivate); SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnShutdown); @@ -59,45 +41,37 @@ private void OnVeilActivate(EntityUid uid, ShadowlingVeilComponent component, Ve if (args.Handled) return; + // todo: handle visuals here + // its just emp but better foreach (var light in _lookup.GetEntitiesInRange(_transform.GetMapCoordinates(args.Performer), component.Range)) { - TryDisableLights(light, component); + TryDisableLights(light); } args.Handled = true; } - private void TryDisableLights(EntityUid uid, ShadowlingVeilComponent component) + private void TryDisableLights(EntityUid uid) { - if (!_pointLightQuery.HasComp(uid)) + if (!HasComp(uid)) return; - if (_poweredLightQuery.TryComp(uid, out var light)) + if (TryComp(uid, out var light)) _light.TryDestroyBulb(uid, light); // listen, this will make janitor a good role during slings - if (_handheldLightQuery.TryComp(uid, out var handheldLight)) + if (TryComp(uid, out var handheldLight)) + { _handheld.SetActivated(uid, false, handheldLight); + } // mostly for pdas - if (_unpoweredFlashlightQuery.TryComp(uid, out var unpoweredFlashlight)) + if (TryComp(uid, out var unpoweredFlashlight)) { if (!unpoweredFlashlight.LightOn) return; _unpowered.TryToggleLight(uid, unpoweredFlashlight.ToggleActionEntity); } - - if (_expendableLightQuery.TryComp(uid, out var expendableLight) - && !_tag.HasTag(uid, component.TorchTag)) - { - expendableLight.CurrentState = ExpendableLightState.Fading; - expendableLight.StateExpiryTime = 0; - return; - } - - // flare guns - if (_timedDespawnQuery.TryComp(uid, out var timedDespawn)) - timedDespawn.Lifetime = 0; } } diff --git a/Content.Goobstation.Server/Shadowling/Systems/ShadowlingAscensionEggSystem.cs b/Content.Goobstation.Server/Shadowling/Systems/ShadowlingAscensionEggSystem.cs index d83b39c7073..b8a571e7f39 100644 --- a/Content.Goobstation.Server/Shadowling/Systems/ShadowlingAscensionEggSystem.cs +++ b/Content.Goobstation.Server/Shadowling/Systems/ShadowlingAscensionEggSystem.cs @@ -11,7 +11,6 @@ using Content.Server.Station.Systems; using Content.Server.Storage.EntitySystems; using Content.Shared.Actions; -using Content.Shared.Damage; using Content.Shared.Destructible; using Content.Shared.Examine; using Content.Shared.Popups; @@ -43,7 +42,6 @@ public sealed class ShadowlingAscensionEggSystem : EntitySystem [Dependency] private readonly StationSystem _station = default!; [Dependency] private readonly AlertLevelSystem _alertLevel = default!; [Dependency] private readonly ChatSystem _chatSystem = default!; - [Dependency] private readonly DamageableSystem _damageable = default!; /// public override void Initialize() @@ -156,8 +154,6 @@ private void TryAscend(EntityUid uid, EntityUid eggUid, ShadowlingAscensionEggCo // Dont take damage during hatching //EnsureComp(uid); // NO. PLEASE NO. DON'T DO IT PLEASE I BEG YOU. PLEEEEASEEEEE AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - Rouden - // eat my mango - _damageable.SetDamageModifierSetId(uid, "ShadowlingAscending"); shadowling.IsAscending = true; component.StartTimer = true; diff --git a/Content.Goobstation.Server/Shadowling/Systems/ShadowlingThrallSystem.cs b/Content.Goobstation.Server/Shadowling/Systems/ShadowlingThrallSystem.cs index ee4acf744b2..0cc63e1429f 100644 --- a/Content.Goobstation.Server/Shadowling/Systems/ShadowlingThrallSystem.cs +++ b/Content.Goobstation.Server/Shadowling/Systems/ShadowlingThrallSystem.cs @@ -1,4 +1,3 @@ -using Content.Goobstation.Shared.Devil; using Content.Goobstation.Shared.Overlays; using Content.Goobstation.Shared.Shadowling.Components; using Content.Goobstation.Shared.Shadowling.Components.Abilities.Thrall; @@ -6,7 +5,6 @@ using Content.Server.Mind; using Content.Server.Roles; using Content.Shared.Examine; -using Content.Shared.IdentityManagement; namespace Content.Goobstation.Server.Shadowling.Systems; @@ -19,6 +17,7 @@ public sealed class ShadowlingThrallSystem : EntitySystem [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly RoleSystem _roles = default!; [Dependency] private readonly ShadowlingSystem _shadowling = default!; + public override void Initialize() { base.Initialize(); @@ -60,16 +59,10 @@ private void OnRemove(EntityUid uid, ThrallComponent component, ComponentShutdow private void OnExamined(EntityUid uid, ThrallComponent component, ExaminedEvent args) { - if (HasComp(args.Examiner) - && component.Converter == args.Examiner) - args.PushMarkup($"[color=red]{Loc.GetString("shadowling-thrall-examined")}[/color]"); // Indicates that it is your Thrall - - var ev = new IsEyesCoveredCheckEvent(); - RaiseLocalEvent(uid, ev); - - if (ev.IsEyesProtected) + if (!HasComp(args.Examiner) + || component.Converter != args.Examiner) return; - args.PushMarkup($"[color=pink]{Loc.GetString("shadowling-thrall-other-examined", ("target", Identity.Entity(uid, EntityManager)))}[/color]"); + args.PushMarkup($"[color=red]{Loc.GetString("shadowling-thrall-examined")}[/color]"); // Indicates that it is your Thrall } } diff --git a/Content.Goobstation.Server/SlaughterDemon/SlaughterDemonSystem.cs b/Content.Goobstation.Server/SlaughterDemon/SlaughterDemonSystem.cs index e47164ddcaf..9c14680ae1b 100644 --- a/Content.Goobstation.Server/SlaughterDemon/SlaughterDemonSystem.cs +++ b/Content.Goobstation.Server/SlaughterDemon/SlaughterDemonSystem.cs @@ -3,7 +3,6 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -using Content.Goobstation.Common.Devour; using Content.Goobstation.Shared.SlaughterDemon; using Content.Goobstation.Shared.SlaughterDemon.Systems; using Content.Server.Administration.Systems; @@ -41,10 +40,6 @@ private void OnGib(Entity ent, ref BeingGibbedEvent arg _container.EmptyContainer(devour.Container); - // Allow everyone to self revive again (if they have the ability to) - foreach (var entity in ent.Comp.ConsumedMobs) - RemComp(entity); - // heal them if they were in the laughter demon if (!ent.Comp.IsLaughter) return; diff --git a/Content.Goobstation.Server/StationReport/StationReportDiscordIntergration.cs b/Content.Goobstation.Server/StationReport/StationReportDiscordIntergration.cs new file mode 100644 index 00000000000..dcf99801d10 --- /dev/null +++ b/Content.Goobstation.Server/StationReport/StationReportDiscordIntergration.cs @@ -0,0 +1,97 @@ +using System; +using System.Text.RegularExpressions; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using Content.Goobstation.Common.CCVar; +using Content.Goobstation.Common.StationReport; +using Robust.Shared.GameObjects; +using Robust.Shared.Configuration; +using Robust.Shared.IoC; + +namespace Content.Goobstation.Server.StationReportDiscordIntergrationSystem; + +public sealed class StationReportDiscordIntergration : EntitySystem +{ + //thank you Timfa for writing this code + private static readonly HttpClient client = new(); + [Dependency] private readonly IConfigurationManager _cfg = default!; + + private string? _webhookUrl; + + public override void Initialize() + { + base.Initialize(); + + //subscribes to the endroundevent and Stationreportevent + SubscribeLocalEvent(OnStationReportReceived); + + // Keep track of CCVar value, update if changed + _cfg.OnValueChanged(GoobCVars.StationReportDiscordWebHook, url => _webhookUrl = url, true); + } + + public static string? report; + + private static readonly TagReplacement[] _replacements = + { + new(@"\[/?bold\]", @"**"), + new(@"\[/?italic\]", @"_"), + new(@"\[/?mono\]", @"__"), + new(@">", @""), + new(@"\[h1\]", @"# "), + new(@"\[h2\]", @"## "), + new(@"\[h3\]", @"### "), + new(@"\[h4\]", @"-# "), + new(@"\[/h[0-9]\]", @""), + new(@"\[head=1\]", @"# "), + new(@"\[head=2\]", @"## "), + new(@"\[head=3\]", @"### "), + new(@"\[head=4\]", @"-# "), + new(@"\[/head\]", @""), + new(@"\[/?color(=[#0-9a-zA-Z]+)?\]", @"") + }; + + private void OnStationReportReceived(StationReportEvent ev) + { + report = ev.StationReportText; + + if (string.IsNullOrWhiteSpace(report)) + return; + + foreach (var replacement in _replacements) + report = Regex.Replace(report, replacement.Tag, replacement.Replacement); + + // Run async without blocking + _ = SendMessageAsync(report); + } + + private async Task SendMessageAsync(string message) + { + if (string.IsNullOrWhiteSpace(message) || string.IsNullOrWhiteSpace(_webhookUrl)) + return; + + var payload = new { content = message }; + var json = System.Text.Json.JsonSerializer.Serialize(payload); + var content = new StringContent(json, Encoding.UTF8, "application/json"); + + try + { + var response = await client.PostAsync(_webhookUrl, content); + response.EnsureSuccessStatusCode(); + } + catch (Exception ex) + { + Logger.Error($"Error sending station report to discord: {ex}"); + } + } + + public struct TagReplacement + { + public string Tag, Replacement; + public TagReplacement(string tag, string replacement) + { + Tag = tag; + Replacement = replacement; + } + } +} diff --git a/Content.Goobstation.Server/StationReport/StationReportDiscordIntergrationSystem.cs b/Content.Goobstation.Server/StationReport/StationReportDiscordIntergrationSystem.cs index 992c99c6881..cc12dceb0fb 100644 --- a/Content.Goobstation.Server/StationReport/StationReportDiscordIntergrationSystem.cs +++ b/Content.Goobstation.Server/StationReport/StationReportDiscordIntergrationSystem.cs @@ -1,6 +1,5 @@ using System; using System.Text.RegularExpressions; -using System.Collections.Generic; using System.Net.Http; using System.Text; using System.Threading.Tasks; @@ -17,7 +16,6 @@ public sealed class StationReportDiscordIntergrationSystem : EntitySystem //thank you Timfa for writing this code private static readonly HttpClient client = new(); [Dependency] private readonly IConfigurationManager _cfg = default!; - private const int DiscordSoftLimit = 1800; // Omu - keep headroom under 2000 private string? _webhookUrl; @@ -36,34 +34,21 @@ public override void Initialize() private static readonly TagReplacement[] _replacements = { - // Discord markdown replacements, these must happen BEFORE anything else! - new(@"\*", @"\*"), // Omu, escape * so it doesn't unintentionally bold stuff in Discord (this is intentionally double-escaped in the literal string for regex replacements) - new(@"_", @"\_"), // Omu, escape _ so it doesn't unintentionally italics stuff in Discord - new(@"~", @"\~"), // Omu, escape ~ so it doesn't unintentionally strikethrough stuff in Discord - new(@"`", @"\`"), // Omu, escape ` so it doesn't unintentionally codeblock stuff in Discord - new(@"#", @"\#"), // Omu, escape # so it doesn't unintentionally header stuff in Discord - new(@">", @"\>"), // Omu, escape > so it doesn't unintentionally quoteblock stuff in Discord - // End of Discord markdown replacements, other stuff can come AFTER this. - // Omu: filter out empty tags - new(@"\[bold\] *\[/bold\]", @""), - new(@"\[italics\] *\[/italics\]", @""), - new(@"\[mono\] *\[/mono\]", @""), - //Omu: end empty tags new(@"\[/?bold\]", @"**"), - new(@"\[/?italics\]", @"_"), // Omu, fix the 's' that was forgotten in 'italicS' + new(@"\[/?italic\]", @"_"), new(@"\[/?mono\]", @"__"), - // new(@">", @""), // Omu, was causing issues with > escaping in the Discord markdown block - new(@"\[h1\]", @""), // Omu, make head be replaced with empty, was # - new(@"\[h2\]", @""), // Omu, make head be replaced with empty, was ## - new(@"\[h3\]", @""), // Omu, make head be replaced with empty, was ### - new(@"\[h4\]", @""), // Omu, make head be replaced with empty, was -# + new(@">", @""), + new(@"\[h1\]", @"# "), + new(@"\[h2\]", @"## "), + new(@"\[h3\]", @"### "), + new(@"\[h4\]", @"-# "), new(@"\[/h[0-9]\]", @""), - new(@"\[head=1\]", @""), // Omu, make head be replaced with empty, was # - new(@"\[head=2\]", @""), // Omu, make head be replaced with empty, was ## - new(@"\[head=3\]", @""), // Omu, make head be replaced with empty, was ### - new(@"\[head=4\]", @""), // Omu, make head be replaced with empty, was -# + new(@"\[head=1\]", @"# "), + new(@"\[head=2\]", @"## "), + new(@"\[head=3\]", @"### "), + new(@"\[head=4\]", @"-# "), new(@"\[/head\]", @""), - new(@"\[/?color=?([#0-9a-zA-Z]+)?\]", @"") // Omu, fix colour tag regex + new(@"\[/?color(=[#0-9a-zA-Z]+)?\]", @"") }; private void OnStationReportReceived(StationReportEvent ev) @@ -80,88 +65,23 @@ private void OnStationReportReceived(StationReportEvent ev) _ = SendMessageAsync(report); } - // Omu - Split Discord messages to avoid hitting the character limit - private static IEnumerable SplitDiscordMessage(string text, int chunkSize) - { - if (string.IsNullOrEmpty(text)) - yield break; - - var start = 0; - while (start < text.Length) - { - var remaining = text.Length - start; - var take = Math.Min(chunkSize, remaining); - var end = start + take; - - if (end < text.Length) - { - // 1) Prefer a newline - var splitAt = text.LastIndexOf('\n', end - 1, take); - if (splitAt >= start) - end = splitAt + 1; // include the newline - else - { - // 2) Prefer sentence boundary (". ", "! ", "? ", "… ") - var bestBoundary = -1; - static int LastIndexOfSpan(string s, string token, int endExclusive, int searchLen) - => s.LastIndexOf(token, endExclusive - 1, searchLen, StringComparison.Ordinal); - - var candidates = new[] { ". ", "! ", "? ", "… " }; - foreach (var token in candidates) - { - var idx = LastIndexOfSpan(text, token, end, take); - if (idx >= start) - bestBoundary = Math.Max(bestBoundary, idx + token.Length); - } - - if (bestBoundary >= start) - end = bestBoundary; - else - { - // 3) Fall back to last whitespace - var lastSpace = text.LastIndexOf(' ', end - 1, take); - if (lastSpace >= start) - end = lastSpace + 1; - // 4) Otherwise, hard cut at end (avoid infinite loop) - } - } - } - - var chunk = text.Substring(start, end - start); - yield return chunk; - start = end; - } - } - private async Task SendMessageAsync(string message) { if (string.IsNullOrWhiteSpace(message) || string.IsNullOrWhiteSpace(_webhookUrl)) return; - //var payload = new { content = message }; - //var json = System.Text.Json.JsonSerializer.Serialize(payload); - //var content = new StringContent(json, Encoding.UTF8, "application/json"); - - //try - //{ - // var response = await client.PostAsync(_webhookUrl, content); - // response.EnsureSuccessStatusCode(); - //} - //catch (Exception) - foreach (var chunk in SplitDiscordMessage(message, DiscordSoftLimit)) // Omu - avoid hitting the Discord character limit of 200 by splitting up the payload + + var payload = new { content = message }; + var json = System.Text.Json.JsonSerializer.Serialize(payload); + var content = new StringContent(json, Encoding.UTF8, "application/json"); + + try + { + var response = await client.PostAsync(_webhookUrl, content); + response.EnsureSuccessStatusCode(); + } + catch (Exception) { - var payload = new { content = chunk }; - var json = System.Text.Json.JsonSerializer.Serialize(payload); - var content = new StringContent(json, Encoding.UTF8, "application/json"); - - try - { - var response = client.PostAsync(_webhookUrl, content).GetAwaiter().GetResult(); // await doesn't seem to work properly inside a foreach - response.EnsureSuccessStatusCode(); - } - catch (Exception) - { - // Optionally log - } + } } diff --git a/Content.Goobstation.Server/StationReport/StationReportSystem.cs b/Content.Goobstation.Server/StationReport/StationReportSystem.cs index 5b6465d44be..057a37a783e 100644 --- a/Content.Goobstation.Server/StationReport/StationReportSystem.cs +++ b/Content.Goobstation.Server/StationReport/StationReportSystem.cs @@ -1,63 +1,41 @@ -using Content.Goobstation.Common.StationReport; using Content.Server.GameTicking; -using Content.Server.GameTicking.Events; +using Content.Goobstation.Common.StationReport; using Content.Shared.Paper; -using Robust.Shared.Prototypes; +using Robust.Shared.GameObjects; namespace Content.Goobstation.Server.StationReportSystem; public sealed class StationReportSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; // Omu - private int _roundId; // Omu: round number in Discord reports + + //this is shitcode? public override void Initialize() { //subscribes to the endroundevent - SubscribeLocalEvent(OnRoundStarted); SubscribeLocalEvent(OnRoundEndTextAppend); } - private void OnRoundStarted(RoundStartingEvent ev) // Omu: Store round number for later - { - _roundId = ev.Id; - } - private void OnRoundEndTextAppend(RoundEndTextAppendEvent args) { - var reportDefaultFormLoc = ((PaperComponent) _prototypeManager.Index("NanoRepStationReport").Components["Paper"].Component).Content; // Omu: Don't send a report that hasn't been filled in - //locates the first entity with StationReportComponent then stops string? stationReportText = null; var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var tablet))//finds the first entity with stationreport { if (!TryComp(uid, out var paper)) - return; - + return; + stationReportText = paper.Content; - - // Omu: Add stamps - if (paper.StampedBy.Count > 0) - { - stationReportText += $"{Environment.NewLine}{Environment.NewLine}Stamps:{Environment.NewLine}"; - foreach (var stamp in paper.StampedBy) - { - if (Loc.TryGetString(stamp.StampedName, out var name)) - stationReportText += $"[color={stamp.StampedColor.ToHexNoAlpha()}]⟦{name}⟧[/color] "; - } - } break; } - - if(stationReportText != Loc.GetString(reportDefaultFormLoc)) // Omu: Don't send a report that hasn't been filled in - BroadcastStationReport(stationReportText); + BroadcastStationReport(stationReportText); } //sends a networkevent to tell the client to update the stationreporttext when recived public void BroadcastStationReport(string? stationReportText) { RaiseNetworkEvent(new StationReportEvent(stationReportText));//to send to client - RaiseLocalEvent(new StationReportEvent($"{stationReportText}{Environment.NewLine}-# Round {_roundId}"));//to send to discord intergration // Omu: Add round number + RaiseLocalEvent(new StationReportEvent(stationReportText));//to send to discord intergration } } diff --git a/Content.Goobstation.Shared/FloorGoblin/SharedCrawlUnderFloorSystem.cs b/Content.Goobstation.Shared/FloorGoblin/SharedCrawlUnderFloorSystem.cs index cea79dc856a..6ffccbace33 100644 --- a/Content.Goobstation.Shared/FloorGoblin/SharedCrawlUnderFloorSystem.cs +++ b/Content.Goobstation.Shared/FloorGoblin/SharedCrawlUnderFloorSystem.cs @@ -1,9 +1,10 @@ // SPDX-FileCopyrightText: 2025 Evaisa -// SPDX-FileCopyrightText: 2025 RichardBlonski <48651647+RichardBlonski@users.noreply.github.com> +// // SPDX-License-Identifier: AGPL-3.0-or-later using Content.Shared._DV.Abilities; using Content.Shared._Starlight.VentCrawling; +using Content.Shared.Actions; using Content.Shared.Climbing.Components; using Content.Shared.Climbing.Events; using Content.Shared.Interaction.Events; @@ -21,14 +22,6 @@ using Robust.Shared.Physics.Systems; using Robust.Shared.Player; using Robust.Shared.Random; -using Content.Shared.Actions; -using Content.Shared.Mobs.Components; -using Content.Shared.Doors.Components; -using Content.Shared.Conveyor; -using Robust.Shared.Physics.Events; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Systems; namespace Content.Goobstation.Shared.FloorGoblin; @@ -47,6 +40,9 @@ public abstract class SharedCrawlUnderFloorSystem : EntitySystem [Dependency] private readonly TileSystem _tile = default!; [Dependency] private readonly SharedStealthSystem _stealth = default!; + private const int HiddenMask = (int) (CollisionGroup.HighImpassable | CollisionGroup.MidImpassable | CollisionGroup.LowImpassable | CollisionGroup.InteractImpassable); + private const int HiddenLayer = (int) (CollisionGroup.HighImpassable | CollisionGroup.MidImpassable | CollisionGroup.LowImpassable | CollisionGroup.MobLayer); + public override void Initialize() { base.Initialize(); @@ -55,7 +51,6 @@ public override void Initialize() SubscribeLocalEvent(OnAttemptClimb); SubscribeLocalEvent(OnTileChanged); SubscribeLocalEvent(OnMove); - SubscribeLocalEvent(OnPreventCollision); SubscribeLocalEvent(OnAttemptAttack); SubscribeLocalEvent(OnAnyAttackAttempt); } @@ -135,47 +130,21 @@ private void OnTileChanged(EntityUid gridUid, MapGridComponent grid, ref TileCha private void OnMove(EntityUid uid, CrawlUnderFloorComponent comp, ref MoveEvent args) { - // Just update the crawl state based on whether we're enabled - ProcessCrawlStateChange(uid, comp, comp.Enabled); + ProcessCrawlStateChange(uid, comp, false); } - private void OnAttemptAttack(EntityUid uid, CrawlUnderFloorComponent comp, AttackAttemptEvent args) { if (IsHidden(uid, comp)) args.Cancel(); } - private void OnAnyAttackAttempt(AttackAttemptEvent ev) + private void OnAnyAttackAttempt(AttackAttemptEvent args) { - if (HasComp(ev.Target)) - ev.Cancel(); - } - - private void OnPreventCollision(EntityUid uid, CrawlUnderFloorComponent component, ref PreventCollideEvent args) - { - var otherUid = args.OtherEntity; - - // Always prevent collision with mobs - if (HasComp(otherUid)) - { - args.Cancelled = true; + if (args.Target is not { } target) return; - } - - // Handle airlocks - allow phasing in stealth mode - if (HasComp(otherUid) && component.Enabled) - { - args.Cancelled = true; - return; - } - - // Handle conveyor belts - allow phasing in stealth mode - if (HasComp(otherUid) && component.Enabled) - { - args.Cancelled = true; - return; - } + if (TryComp(target, out CrawlUnderFloorComponent? goblinComp) && IsHidden(target, goblinComp)) + args.Cancel(); } protected void PlayDuendeSound(EntityUid uid, float probability = 0.3f) @@ -194,6 +163,7 @@ protected bool EnableSneakMode(EntityUid uid, CrawlUnderFloorComponent component return false; component.Enabled = true; Dirty(uid, component); + UpdateSneakCollision(uid, component); return true; } @@ -219,21 +189,33 @@ protected bool DisableSneakMode(EntityUid uid, CrawlUnderFloorComponent componen return true; } - - public bool IsOnCollidingTile(EntityUid uid) + protected void UpdateSneakCollision(EntityUid uid, CrawlUnderFloorComponent comp) { - // If we're under the floor, don't consider any tiles as colliding - if (TryComp(uid, out var crawlComp) && - crawlComp.Enabled && - !IsOnSubfloor(uid)) + if (!TryComp(uid, out FixturesComponent? fixtures)) + return; + + var hidden = IsHidden(uid, comp); + + foreach (var (key, fixture) in fixtures.Fixtures) { - return false; + var baseMask = GetOrCacheBase(comp.ChangedFixtures, key, fixture.CollisionMask); + var desiredMask = hidden ? GetHiddenMask(baseMask) : baseMask; + if (fixture.CollisionMask != desiredMask) + _physics.SetCollisionMask(uid, key, fixture, desiredMask, manager: fixtures); + + var baseLayer = GetOrCacheBase(comp.ChangedFixtureLayers, key, fixture.CollisionLayer); + var desiredLayer = hidden ? GetHiddenLayer(baseLayer) : baseLayer; + if (fixture.CollisionLayer != desiredLayer) + _physics.SetCollisionLayer(uid, key, fixture, desiredLayer, manager: fixtures); } + } - // Standard collision check for tiles - if (!TryGetCurrentTile(uid, out var tileRef, out _) || tileRef.Tile.IsEmpty) + public bool IsOnCollidingTile(EntityUid uid) + { + if (!TryGetCurrentTile(uid, out var tileRef, out _)) + return false; + if (tileRef.Tile.IsEmpty) return false; - return _turf.IsTileBlocked(tileRef, CollisionGroup.MobMask); } @@ -255,7 +237,7 @@ private bool IsInSpace(EntityUid uid) } public bool IsHidden(EntityUid uid, CrawlUnderFloorComponent comp) - => comp.Enabled; // No longer check for subfloor, just check if crawling is enabled + => comp.Enabled && !IsOnSubfloor(uid); private void HandleCrawlTransition(EntityUid uid, bool wasOnSubfloor, bool isOnSubfloor, CrawlUnderFloorComponent comp, bool causedByTileChange) { @@ -278,6 +260,15 @@ private void HandleCrawlTransition(EntityUid uid, bool wasOnSubfloor, bool isOnS PlayDuendeSound(uid, causedByTileChange ? 1f : 0.3f); } + + private static int GetHiddenMask(int baseMask) + => baseMask + & ~HiddenMask; + + private static int GetHiddenLayer(int baseLayer) + => baseLayer + & ~HiddenLayer; + private static int GetOrCacheBase(List<(TKey, int)> list, TKey key, int current) { var idx = list.FindIndex(t => EqualityComparer.Default.Equals(t.Item1, key)); @@ -303,39 +294,8 @@ private void PryTileIfUnder(EntityUid uid, CrawlUnderFloorComponent comp) _tile.PryTile(snapPos, gridUid); } - private void UpdateCollisionMask(EntityUid uid, bool stealthMode) - { - if (!TryComp(uid, out var fixtures)) - return; - - if (stealthMode) - { - // In stealth mode, set to SmallMob collision to maintain some physics - // while still allowing phasing through most objects - foreach (var (id, fixture) in fixtures.Fixtures) - { - _physics.SetCollisionMask(uid, id, fixture, (int)CollisionGroup.SmallMobMask, fixtures); - _physics.SetCollisionLayer(uid, id, fixture, (int)CollisionGroup.SmallMobLayer, fixtures); - } - } - else - { - // In normal mode, use standard mob collision - foreach (var (id, fixture) in fixtures.Fixtures) - { - _physics.SetCollisionMask(uid, id, fixture, (int)CollisionGroup.MobMask, fixtures); - _physics.SetCollisionLayer(uid, id, fixture, (int)CollisionGroup.MobLayer, fixtures); - } - } - - Dirty(uid, fixtures); - } - private void SetStealth(EntityUid uid, bool enabled) { - // Update collision mask based on stealth state - UpdateCollisionMask(uid, enabled); - // Evil hud overlay hiding shitcode that hijacks StealthComponent if (enabled) { @@ -364,6 +324,9 @@ private void RefreshCrawlSubfloorState(EntityUid uid, CrawlUnderFloorComponent c var old = comp.WasOnSubfloor; comp.WasOnSubfloor = now; + if (comp.Enabled && now != old) + UpdateSneakCollision(uid, comp); + HandleCrawlTransition(uid, old, now, comp, causedByTileChange); } diff --git a/Content.Goobstation.Shared/FloorGoblin/StealShoesSystem.cs b/Content.Goobstation.Shared/FloorGoblin/StealShoesSystem.cs index 1a45174df66..8da45e72b76 100644 --- a/Content.Goobstation.Shared/FloorGoblin/StealShoesSystem.cs +++ b/Content.Goobstation.Shared/FloorGoblin/StealShoesSystem.cs @@ -1,17 +1,15 @@ // SPDX-FileCopyrightText: 2025 Evaisa -// SPDX-FileCopyrightText: 2025 RichardBlonski <48651647+RichardBlonski@users.noreply.github.com> +// // SPDX-License-Identifier: AGPL-3.0-or-later using Content.Shared._Starlight.VentCrawling; using Content.Shared.Actions; using Content.Shared.Body.Systems; -using Content.Shared.Clothing.Components; using Content.Shared.DoAfter; using Content.Shared.IdentityManagement; using Content.Shared.Interaction; using Content.Shared.Inventory; using Content.Shared.Mobs; -using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; using Content.Shared.Popups; using Content.Shared.VentCrawler.Tube.Components; @@ -24,9 +22,6 @@ using Robust.Shared.Random; using System.Numerics; -// This system allows floor goblins to steal shoes from other entities. -// It handles the entire process from checking valid targets to transferring the shoes to the goblin's inventory. - namespace Content.Goobstation.Shared.FloorGoblin; public sealed partial class StealShoesSystem : EntitySystem @@ -41,6 +36,8 @@ public sealed partial class StealShoesSystem : EntitySystem [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly SharedMapSystem _map = default!; + [Dependency] private readonly ITileDefinitionManager _tileManager = default!; [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly SharedBodySystem _body = default!; [Dependency] private readonly SharedCrawlUnderFloorSystem _crawlUnderFloorSystem = default!; @@ -64,8 +61,6 @@ private void OnMapInit(EntityUid uid, StealShoesComponent component, MapInitEven _containers.EnsureContainer(uid, component.ContainerId); } - // Handles the shoe stealing interaction - // Checks range, line of sight, and then attempts to find and take footwear private void OnStealShoes(EntityUid uid, StealShoesComponent component, StealShoesEvent args) { if (args.Handled) @@ -90,10 +85,7 @@ private void OnStealShoes(EntityUid uid, StealShoesComponent component, StealSho return; } - // Only check the shoes slot - if (!_inventory.TryGetSlotEntity(target, "shoes", out var shoesUid) - || shoesUid == null - || !HasComp(shoesUid)) + if (!_inventory.TryGetSlotEntity(target, "shoes", out var shoesUid) || shoesUid == null) { _popup.PopupPredicted(Loc.GetString("steal-shoes-no-shoes"), uid, uid); args.Handled = true; @@ -140,10 +132,6 @@ shoesUid is not { } shoes || ev.Handled = true; } - /// - /// Attempts to remove shoes from the target's equipment or containers. - /// Returns true if successful, false otherwise. - /// private void OnStealShoesAttempt(EntityUid uid, StealShoesComponent component, ref DoAfterAttemptEvent ev) { if (ev.Cancelled) @@ -153,26 +141,16 @@ private void OnStealShoesAttempt(EntityUid uid, StealShoesComponent component, r ev.Cancel(); } + private bool TryRemoveShoes(EntityUid target, EntityUid shoes) { - // For dead or critical targets, we need to remove the item directly - if (_mobstate.IsDead(target) || - (TryComp(target, out var mobState) && mobState.CurrentState == MobState.Critical)) - { - if (!_inventory.TryGetContainingSlot((shoes, null, null), out var slot) || - !_inventory.TryGetSlotContainer(target, slot.Name, out var container, out _)) - { - return false; - } + const string slotId = "shoes"; - return _containers.Remove(shoes, container, force: true, reparent: false); - } - - // For living targets, try to unequip normally - if (!_inventory.TryGetContainingSlot((shoes, null, null), out var slotDef)) - return false; + if (!_mobstate.IsDead(target)) + return _inventory.TryUnequip(target, slotId, silent: true, predicted: true, reparent: false); - return _inventory.TryUnequip(target, slotDef.Name, silent: true, predicted: true, reparent: false); + return _inventory.TryGetSlotContainer(target, slotId, out var slot, out SlotDefinition? _) + && _containers.Remove(shoes, slot, force: true, reparent: false); } diff --git a/Content.Goobstation.Shared/GameTicking/AddGameRuleOnUseComponent.cs b/Content.Goobstation.Shared/GameTicking/AddGameRuleOnUseComponent.cs index 289a6e8dc03..2281b93cc12 100644 --- a/Content.Goobstation.Shared/GameTicking/AddGameRuleOnUseComponent.cs +++ b/Content.Goobstation.Shared/GameTicking/AddGameRuleOnUseComponent.cs @@ -33,4 +33,4 @@ public sealed partial class AddGameRuleOnUseComponent : Component /// Raised when a gamerule gets added from the item /// [ByRefEvent] -public record struct AddGameRuleItemEvent(EntityUid? Initiator); +public record struct AddGameRuleItemEvent(EntityUid Initiator); diff --git a/Content.Goobstation.Shared/Nightmare/Components/LightEaterComponent.cs b/Content.Goobstation.Shared/Nightmare/Components/LightEaterComponent.cs index 72e54828dee..a825d9261c2 100644 --- a/Content.Goobstation.Shared/Nightmare/Components/LightEaterComponent.cs +++ b/Content.Goobstation.Shared/Nightmare/Components/LightEaterComponent.cs @@ -7,4 +7,11 @@ namespace Content.Goobstation.Shared.Nightmare.Components; /// This is used for the nightmare armblade /// [RegisterComponent, NetworkedComponent] -public sealed partial class LightEaterComponent : Component; +public sealed partial class LightEaterComponent : Component +{ + [DataField] + public EntProtoId ActionId = "ActionLightEater"; + + [DataField] + public EntityUid? ActionEnt; +} diff --git a/Content.Goobstation.Shared/Nightmare/Components/LightEaterUserComponent.cs b/Content.Goobstation.Shared/Nightmare/Components/LightEaterUserComponent.cs index aa9814b106a..36c49fb6755 100644 --- a/Content.Goobstation.Shared/Nightmare/Components/LightEaterUserComponent.cs +++ b/Content.Goobstation.Shared/Nightmare/Components/LightEaterUserComponent.cs @@ -9,12 +9,6 @@ namespace Content.Goobstation.Shared.Nightmare.Components; [RegisterComponent, NetworkedComponent] public sealed partial class LightEaterUserComponent : Component { - [DataField] - public EntProtoId ActionId = "ActionLightEater"; - - [DataField] - public EntityUid? ActionEnt; - [DataField] public EntProtoId LightEaterProto = "LightEaterArmBlade"; diff --git a/Content.Goobstation.Shared/Shadowling/Components/Abilities/PreAscension/ShadowlingEnthrallComponent.cs b/Content.Goobstation.Shared/Shadowling/Components/Abilities/PreAscension/ShadowlingEnthrallComponent.cs index 1af6d5794a6..972ffb903c2 100644 --- a/Content.Goobstation.Shared/Shadowling/Components/Abilities/PreAscension/ShadowlingEnthrallComponent.cs +++ b/Content.Goobstation.Shared/Shadowling/Components/Abilities/PreAscension/ShadowlingEnthrallComponent.cs @@ -13,7 +13,7 @@ public sealed partial class ShadowlingEnthrallComponent : Component /// Indicates how long the enthrallment process takes. /// [DataField] - public TimeSpan EnthrallTime = TimeSpan.FromSeconds(4); + public TimeSpan EnthrallTime = TimeSpan.FromSeconds(5); [DataField] public EntProtoId EnthrallComponents = "ThrallAbilities"; diff --git a/Content.Goobstation.Shared/Shadowling/Components/Abilities/PreAscension/ShadowlingGlareComponent.cs b/Content.Goobstation.Shared/Shadowling/Components/Abilities/PreAscension/ShadowlingGlareComponent.cs index 511e3533560..de3c5b324ca 100644 --- a/Content.Goobstation.Shared/Shadowling/Components/Abilities/PreAscension/ShadowlingGlareComponent.cs +++ b/Content.Goobstation.Shared/Shadowling/Components/Abilities/PreAscension/ShadowlingGlareComponent.cs @@ -38,13 +38,7 @@ public sealed partial class ShadowlingGlareComponent : Component public float MinGlareDistance = 1f; [DataField] - public float MaxGlareStunTime = 6f; - - [DataField] - public float SlowTime = 7f; - - [DataField] - public float MuteTime = 6f; + public float MaxGlareStunTime = 7f; // // Regarding time delay before activation @@ -58,6 +52,12 @@ public sealed partial class ShadowlingGlareComponent : Component [DataField] public float MinGlareDelay = 0.1f; + [DataField] + public float MuteTime = 2f; + + [DataField] + public float SlowTime = 2f; + [DataField] public EntityUid GlareTarget; diff --git a/Content.Goobstation.Shared/Shadowling/Components/Abilities/PreAscension/ShadowlingVeilComponent.cs b/Content.Goobstation.Shared/Shadowling/Components/Abilities/PreAscension/ShadowlingVeilComponent.cs index 171f65e79c0..963273fc607 100644 --- a/Content.Goobstation.Shared/Shadowling/Components/Abilities/PreAscension/ShadowlingVeilComponent.cs +++ b/Content.Goobstation.Shared/Shadowling/Components/Abilities/PreAscension/ShadowlingVeilComponent.cs @@ -1,4 +1,3 @@ -using Content.Shared.Tag; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; @@ -20,8 +19,5 @@ public sealed partial class ShadowlingVeilComponent : Component /// Indicates the range radius which the ability will search for, once used. /// [DataField] - public float Range = 9f; - - [DataField] - public ProtoId TorchTag = "Torch"; + public float Range = 6f; } diff --git a/Content.Goobstation.Shared/Shadowling/Systems/Abilities/CollectiveMind/ShadowlingNoxImperiiSystem.cs b/Content.Goobstation.Shared/Shadowling/Systems/Abilities/CollectiveMind/ShadowlingNoxImperiiSystem.cs index a260b64be45..ef3c44fed35 100644 --- a/Content.Goobstation.Shared/Shadowling/Systems/Abilities/CollectiveMind/ShadowlingNoxImperiiSystem.cs +++ b/Content.Goobstation.Shared/Shadowling/Systems/Abilities/CollectiveMind/ShadowlingNoxImperiiSystem.cs @@ -12,7 +12,6 @@ using Content.Shared.Popups; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; -using Robust.Shared.Network; using Robust.Shared.Player; namespace Content.Goobstation.Shared.Shadowling.Systems.Abilities.CollectiveMind; @@ -27,7 +26,6 @@ public sealed class ShadowlingNoxImperiiSystem : EntitySystem [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly SharedPopupSystem _popups = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly INetManager _net = default!; public override void Initialize() { @@ -82,9 +80,7 @@ private void OnNoxImperiiDoAfter(EntityUid uid, ShadowlingNoxImperiiComponent co sling.HeatDamageProjectileModifier.DamageDict["Heat"] = 4; // Indicates that the crew should start caring more since the Shadowling is close to ascension - if (_net.IsServer) - _audio.PlayGlobal(new SoundPathSpecifier("/Audio/_EinsteinEngines/Effects/ghost.ogg"), Filter.Broadcast(), false, AudioParams.Default.WithVolume(-4f)); - + _audio.PlayGlobal(new SoundPathSpecifier("/Audio/_EinsteinEngines/Effects/ghost.ogg"), Filter.Broadcast(), false, AudioParams.Default.WithVolume(-4f)); _popups.PopupPredicted(Loc.GetString("shadowling-nox-imperii-done"), uid, uid, PopupType.Medium); args.Handled = true; diff --git a/Content.Goobstation.Shared/Shadowling/Systems/Abilities/PreAscension/ShadowlingGlareSystem.cs b/Content.Goobstation.Shared/Shadowling/Systems/Abilities/PreAscension/ShadowlingGlareSystem.cs index b3d34f9c1cb..8c49797f68c 100644 --- a/Content.Goobstation.Shared/Shadowling/Systems/Abilities/PreAscension/ShadowlingGlareSystem.cs +++ b/Content.Goobstation.Shared/Shadowling/Systems/Abilities/PreAscension/ShadowlingGlareSystem.cs @@ -9,7 +9,6 @@ using Content.Shared.Popups; using Content.Shared.StatusEffect; using Content.Shared.Stunnable; -using Content.Shared.Speech.Muting; using Robust.Shared.Timing; namespace Content.Goobstation.Shared.Shadowling.Systems.Abilities.PreAscension; @@ -84,6 +83,13 @@ private void OnGlare(EntityUid uid, ShadowlingGlareComponent comp, GlareEvent ar var distance = (_transform.GetWorldPosition(user) - targetCoords).Length(); comp.GlareTarget = target; + // Glare mutes and slows down the target no matter what. + if (TryComp(target, out var statComp)) + { + _effects.TryAddStatusEffect(target, "Muted", TimeSpan.FromSeconds(comp.MuteTime), false, statComp); + _stun.TrySlowdown(target, TimeSpan.FromSeconds(comp.SlowTime), false, 0.5f, 0.5f, statComp); + } + if (distance <= comp.MinGlareDistance) { comp.GlareStunTime = comp.MaxGlareStunTime; @@ -98,13 +104,6 @@ private void OnGlare(EntityUid uid, ShadowlingGlareComponent comp, GlareEvent ar comp.ActivateGlareTimer = true; } - // Glare mutes and slows down the target no matter what. - if (TryComp(target, out var statComp)) - { - _effects.TryAddStatusEffect(target, "Muted", TimeSpan.FromSeconds(comp.MuteTime), true); - _stun.TrySlowdown(target, TimeSpan.FromSeconds(comp.SlowTime), true, 0.5f, 0.5f, statComp); - } - var effectEnt = PredictedSpawnAtPosition(comp.EffectGlare, Transform(uid).Coordinates); _transform.SetParent(effectEnt, uid); diff --git a/Content.Goobstation.Shared/Shadowling/Systems/Abilities/PreAscension/ShadowlingShadowWalkSystem.cs b/Content.Goobstation.Shared/Shadowling/Systems/Abilities/PreAscension/ShadowlingShadowWalkSystem.cs index 025f7efd092..d6d7cdf84cb 100644 --- a/Content.Goobstation.Shared/Shadowling/Systems/Abilities/PreAscension/ShadowlingShadowWalkSystem.cs +++ b/Content.Goobstation.Shared/Shadowling/Systems/Abilities/PreAscension/ShadowlingShadowWalkSystem.cs @@ -95,7 +95,7 @@ private void OnShadowWalk(EntityUid uid, ShadowlingShadowWalkComponent comp, Sha _transform.SetParent(effectEnt, uid); var stealth = EnsureComp(uid); - _stealth.SetVisibility(uid, -1.5f, stealth); + _stealth.SetVisibility(uid, 0f, stealth); args.Handled = true; } diff --git a/Content.Goobstation.Shared/Shadowling/Systems/SharedShadowlingSystem.cs b/Content.Goobstation.Shared/Shadowling/Systems/SharedShadowlingSystem.cs index 4e7618a37a7..abae43d4d95 100644 --- a/Content.Goobstation.Shared/Shadowling/Systems/SharedShadowlingSystem.cs +++ b/Content.Goobstation.Shared/Shadowling/Systems/SharedShadowlingSystem.cs @@ -12,7 +12,6 @@ using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; using Content.Shared.Popups; -using Content.Shared.Projectiles; using Content.Shared.Stunnable; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; @@ -29,7 +28,6 @@ public abstract class SharedShadowlingSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly IPrototypeManager _protoMan = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; - [Dependency] private readonly DamageableSystem _damageable = default!; public override void Initialize() { @@ -64,10 +62,6 @@ private void OnMobStateChanged(EntityUid uid, ShadowlingComponent component, Mob private void OnDamageModify(EntityUid uid, ShadowlingComponent component, DamageModifyEvent args) { - if (args.Origin is not {} origin - || !HasComp(origin)) - return; - foreach (var (key,_) in args.Damage.DamageDict) { if (key == "Heat") @@ -141,9 +135,6 @@ public void OnPhaseChanged(EntityUid uid, ShadowlingComponent component, Shadowl EnsureComp(uid); _appearance.AddMarking(uid, "AbominationTorso"); _appearance.AddMarking(uid, "AbominationHorns"); - - // take another hardcoded variable - _damageable.SetDamageModifierSetId(uid, "ShadowlingAbomination"); break; } } @@ -223,8 +214,13 @@ public void DoEnthrall(EntityUid uid, EntProtoId components, SimpleDoAfterEvent EntityManager.AddComponents(target, comps); if (TryComp(uid, out var sling)) + { sling.Thralls.Add(target); + if (TryComp(uid, out var lightDet)) + _lightDamage.AddResistance((uid, lightDet), sling.LightResistanceModifier); + } + _audio.PlayPredicted( new SoundPathSpecifier("/Audio/Items/Defib/defib_zap.ogg"), target, diff --git a/Content.Goobstation.Shared/SlaughterDemon/Systems/SharedSlaughterDemonSystem.cs b/Content.Goobstation.Shared/SlaughterDemon/Systems/SharedSlaughterDemonSystem.cs index 8962e4dc3da..43b9bcdc5ac 100644 --- a/Content.Goobstation.Shared/SlaughterDemon/Systems/SharedSlaughterDemonSystem.cs +++ b/Content.Goobstation.Shared/SlaughterDemon/Systems/SharedSlaughterDemonSystem.cs @@ -1,4 +1,3 @@ -using Content.Goobstation.Common.Devour; using Content.Shared.Actions; using Content.Shared.Item; using Content.Shared.Mobs; @@ -123,9 +122,6 @@ private void OnSlaughterDevour(Entity ent, ref Slaughte _container.Insert(pullingEnt, slaughterDevour.Container); - // Stop them from being able to self-revive - EnsureComp(pullingEnt); - // Kill them for sure, just in case if (_mobStateQuery.TryComp(pullingEnt, out var mobState)) _mobState.ChangeMobState(pullingEnt, MobState.Dead, mobState); diff --git a/Content.IntegrationTests/Tests/PostMapInitTest.cs b/Content.IntegrationTests/Tests/PostMapInitTest.cs index 965413ee9bd..5e2e41d1872 100644 --- a/Content.IntegrationTests/Tests/PostMapInitTest.cs +++ b/Content.IntegrationTests/Tests/PostMapInitTest.cs @@ -194,7 +194,6 @@ public sealed class PostMapInitTest "/Maps/_Goobstation/Shuttles/retort_engineering.yml", "/Maps/_Goobstation/Shuttles/retort_janitorial.yml", "/Maps/_Goobstation/Shuttles/retort_cburn.yml", - "/Maps/_Omu/glacier.yml", }; private static readonly string[] GameMaps = @@ -235,7 +234,6 @@ public sealed class PostMapInitTest "Delta", // Goobstation - add Delta "dm01-entryway", "Chloris", // Goobstation - "Glacier", // Omu "Serpentcrest", // Goobstation }; diff --git a/Content.IntegrationTests/Tests/_Shitmed/Body/BodySetupTest.cs b/Content.IntegrationTests/Tests/_Shitmed/Body/BodySetupTest.cs index fd355b97b97..338f93bbe41 100644 --- a/Content.IntegrationTests/Tests/_Shitmed/Body/BodySetupTest.cs +++ b/Content.IntegrationTests/Tests/_Shitmed/Body/BodySetupTest.cs @@ -352,7 +352,7 @@ await server.WaitAssertion(() => // Find all non-abstract entities with MobStateComponent var entityPrototypes = protoMan.EnumeratePrototypes() .Where(p => !p.Abstract -// && p.ID != "MobGoidaBot" // pure GOIDA // Omu, disable 'GoidaBot' + && p.ID != "MobGoidaBot" // pure GOIDA && p.Components.ContainsKey("MobState") && !p.Components.ContainsKey("Godmode") && !p.Components.ContainsKey("HierophantBoss")) // Hiero is immune to attacks without an origin. diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs index 4aed40412f5..6acd2e757d9 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs @@ -233,7 +233,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = chessName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Fun/Tabletop/chessboard.rsi"), "chessboard"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Fun/Tabletop/chessboard.rsi"), "chessboard"), Act = () => { _sharedGodmodeSystem.EnableGodmode(args.Target); // So they don't suffocate. @@ -285,7 +285,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = monkeyName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Mobs/Animals/monkey.rsi"), "monkey"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Mobs/Animals/monkey.rsi"), "monkey"), Act = () => { _polymorphSystem.PolymorphEntity(args.Target, "AdminMonkeySmite"); @@ -300,7 +300,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = disposalBinName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Structures/Piping/disposal.rsi"), "disposal"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Structures/Piping/disposal.rsi"), "disposal"), Act = () => { _polymorphSystem.PolymorphEntity(args.Target, "AdminDisposalsSmite"); @@ -318,12 +318,11 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = hardElectrocuteName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Clothing/Hands/Gloves/Color/yellow.rsi"), "icon"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Clothing/Hands/Gloves/Color/yellow.rsi"), "icon"), Act = () => { int damageToDeal; - if (!_mobThresholdSystem.TryGetThresholdForState(args.Target, MobState.Critical, out var criticalThreshold)) - { + if (!_mobThresholdSystem.TryGetThresholdForState(args.Target, MobState.Critical, out var criticalThreshold)) { // We can't crit them so try killing them. if (!_mobThresholdSystem.TryGetThresholdForState(args.Target, MobState.Dead, out var deadThreshold)) @@ -365,7 +364,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = creamPieName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Consumable/Food/Baked/pie.rsi"), "plain-slice"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Consumable/Food/Baked/pie.rsi"), "plain-slice"), Act = () => { _creamPieSystem.SetCreamPied(args.Target, creamPied, true); @@ -383,7 +382,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = bloodRemovalName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Fluids/tomato_splat.rsi"), "puddle-1"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Fluids/tomato_splat.rsi"), "puddle-1"), Act = () => { _bloodstreamSystem.SpillAllSolutions((args.Target, bloodstream)); @@ -483,7 +482,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = stomachRemovalName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Mobs/Species/Human/organs.rsi"), "stomach"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Mobs/Species/Human/organs.rsi"), "stomach"), Act = () => { foreach (var entity in _bodySystem.GetBodyOrganEntityComps((args.Target, body))) @@ -504,7 +503,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = lungRemovalName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Mobs/Species/Human/organs.rsi"), "lung-r"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Mobs/Species/Human/organs.rsi"), "lung-r"), Act = () => { foreach (var entity in _bodySystem.GetBodyOrganEntityComps((args.Target, body))) @@ -528,7 +527,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = pinballName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Fun/Balls/basketball.rsi"), "icon"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Fun/Balls/basketball.rsi"), "icon"), Act = () => { var xform = Transform(args.Target); @@ -595,7 +594,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = breadName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Consumable/Food/Baked/bread.rsi"), "plain"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Consumable/Food/Baked/bread.rsi"), "plain"), Act = () => { _polymorphSystem.PolymorphEntity(args.Target, "AdminBreadSmite"); @@ -610,7 +609,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = mouseName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Mobs/Animals/mouse.rsi"), "icon-0"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Mobs/Animals/mouse.rsi"), "icon-0"), Act = () => { _polymorphSystem.PolymorphEntity(args.Target, "AdminMouseSmite"); @@ -665,7 +664,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = nyanifyName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Clothing/Head/Hats/catears.rsi"), "icon"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Clothing/Head/Hats/catears.rsi"), "icon"), Act = () => { var ears = Spawn("ClothingHeadHatCatEars", Transform(args.Target).Coordinates); @@ -683,7 +682,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = killSignName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Misc/killsign.rsi"), "icon"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Misc/killsign.rsi"), "icon"), Act = () => { EnsureComp(args.Target); @@ -699,7 +698,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) Text = cluwneName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Clothing/Mask/cluwne.rsi"), "icon"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Clothing/Mask/cluwne.rsi"), "icon"), Act = () => { @@ -715,7 +714,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = maidenName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Clothing/Uniforms/Jumpskirt/janimaid.rsi"), "icon"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Clothing/Uniforms/Jumpskirt/janimaid.rsi"), "icon"), Act = () => { _outfit.SetOutfit(args.Target, "JanitorMaidGear", (_, clothing) => @@ -736,7 +735,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = angerPointingArrowsName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Interface/Misc/pointing.rsi"), "pointing"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Interface/Misc/pointing.rsi"), "pointing"), Act = () => { EnsureComp(args.Target); @@ -751,7 +750,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = dustName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Materials/materials.rsi"), "ash"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Materials/materials.rsi"), "ash"), Act = () => { QueueDel(args.Target); @@ -783,7 +782,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = instrumentationName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Fun/Instruments/h_synthesizer.rsi"), "supersynth"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Fun/Instruments/h_synthesizer.rsi"), "supersynth"), Act = () => { _polymorphSystem.PolymorphEntity(args.Target, "AdminInstrumentSmite"); @@ -816,7 +815,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = reptilianName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Fun/Plushies/lizard.rsi"), "icon"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Fun/Plushies/lizard.rsi"), "icon"), Act = () => { _polymorphSystem.PolymorphEntity(args.Target, "AdminLizardSmite"); @@ -831,7 +830,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) { Text = lockerName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Structures/Storage/closet.rsi"), "generic"), + Icon = new SpriteSpecifier.Rsi(new ("/Textures/Structures/Storage/closet.rsi"), "generic"), Act = () => { var xform = Transform(args.Target); diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index 514805dbc03..d1319a0bf8f 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -1424,4 +1424,4 @@ public EntitySpokeEvent(EntityUid source, string message, RadioChannelPrototype? } } -// The three chat type enums (InGameICChatType, InGameOOCChatType, and ChatTransmitRange) have been moved to Shared. +// The three chat type enums (InGameICChatType, InGameOOCChatType, and ChatTransmitRange) have been moved to Shared. \ No newline at end of file diff --git a/Content.Server/Flash/FlashSystem.cs b/Content.Server/Flash/FlashSystem.cs index 85e842239c6..33988dde62b 100644 --- a/Content.Server/Flash/FlashSystem.cs +++ b/Content.Server/Flash/FlashSystem.cs @@ -64,4 +64,4 @@ namespace Content.Server.Flash; -public sealed class FlashSystem : SharedFlashSystem; \ No newline at end of file +public sealed class FlashSystem : SharedFlashSystem; diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs index 4829da2cca0..5ac1693c568 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs @@ -161,25 +161,6 @@ public sealed partial class PuddleSystem : SharedPuddleSystem [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly TurfSystem _turf = default!; - - [ValidatePrototypeId] - private const string Blood = "Blood"; - - [ValidatePrototypeId] - private const string Slime = "Slime"; - - [ValidatePrototypeId] - private const string CopperBlood = "CopperBlood"; - - [ValidatePrototypeId] // goobstation - private const string BloodChangeling = "BloodChangeling"; // goobstation - - [ValidatePrototypeId] // goobstation - private const string BlackBlood = "BlackBlood"; // goobstation - - private static string[] _standoutReagents = [Blood, Slime, CopperBlood, BloodChangeling, BlackBlood]; // goobstation - added BloodChangeling, BlackBlood - - // Using local deletion queue instead of the standard queue so that we can easily "undelete" if a puddle // loses & then gains reagents in a single tick. private HashSet _deletionQueue = []; diff --git a/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs b/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs index e56db3c637b..04f2e45b0c6 100644 --- a/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs @@ -23,13 +23,22 @@ // SPDX-FileCopyrightText: 2024 username <113782077+whateverusername0@users.noreply.github.com> // SPDX-FileCopyrightText: 2024 whateverusername0 // SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> +// SPDX-FileCopyrightText: 2025 CerberusWolfie // SPDX-FileCopyrightText: 2025 Errant <35878406+Errant-4@users.noreply.github.com> // SPDX-FileCopyrightText: 2025 GMWQ - +// SPDX-FileCopyrightText: 2025 Gareth Quaile // SPDX-FileCopyrightText: 2025 GoobBot +// SPDX-FileCopyrightText: 2025 IrisTheAmped +// SPDX-FileCopyrightText: 2025 John Willis <143434770+CerberusWolfie@users.noreply.github.com> +// SPDX-FileCopyrightText: 2025 Milon // SPDX-FileCopyrightText: 2025 Misandry +// SPDX-FileCopyrightText: 2025 SX-7 <92227810+SX-7@users.noreply.github.com> // SPDX-FileCopyrightText: 2025 ScarKy0 <106310278+ScarKy0@users.noreply.github.com> - +// SPDX-FileCopyrightText: 2025 Solstice +// SPDX-FileCopyrightText: 2025 SolsticeOfTheWinter +// SPDX-FileCopyrightText: 2025 Tim +// SPDX-FileCopyrightText: 2025 Timfa +// SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com> // SPDX-FileCopyrightText: 2025 gus // // SPDX-License-Identifier: AGPL-3.0-or-later @@ -37,7 +46,6 @@ using Content.Server.Administration.Logs; using Content.Server.Antag; using Content.Server.EUI; -using Content.Server.Flash; using Content.Server.GameTicking.Rules.Components; using Content.Server.Mind; using Content.Server.Popups; @@ -47,6 +55,8 @@ using Content.Server.RoundEnd; using Content.Server.Shuttles.Systems; using Content.Server.Station.Systems; +using Content.Server.Speech.EntitySystems; +using Content.Server.Speech.Components; using Content.Shared.Database; using Content.Shared.Flash; using Content.Shared.GameTicking.Components; @@ -59,9 +69,9 @@ using Content.Shared.Mobs.Systems; using Content.Shared.NPC.Prototypes; using Content.Shared.NPC.Systems; -using Content.Shared.Popups; using Content.Shared.Revolutionary.Components; using Content.Shared.Stunnable; +using Content.Shared.Speech.Muting; using Content.Shared.Zombies; using Content.Shared.Heretic; using Content.Goobstation.Common.Changeling; @@ -71,15 +81,11 @@ using Content.Shared.Revolutionary; using Content.Server.Communications; using System.Linq; -using System.Threading; using Content.Goobstation.Shared.Revolutionary; +using Content.Server.Antag.Components; using Content.Server.Chat.Systems; -using Content.Server.PDA.Ringer; -using Content.Shared.PDA.Ringer; -using Content.Shared.PDA; -using Content.Server.Traitor.Uplink; +using Content.Shared._EinsteinEngines.Revolutionary; using Robust.Shared.Player; -using Content.Server.Antag.Components; namespace Content.Server.GameTicking.Rules; @@ -90,24 +96,22 @@ namespace Content.Server.GameTicking.Rules; // Heavily edited by goobstation. If you want to upstream something think twice public sealed class RevolutionaryRuleSystem : GameRuleSystem { - [Dependency] private readonly IAdminLogManager _adminLogManager = default!; [Dependency] private readonly AntagSelectionSystem _antag = default!; [Dependency] private readonly EmergencyShuttleSystem _emergencyShuttle = default!; [Dependency] private readonly EuiManager _euiMan = default!; + [Dependency] private readonly IAdminLogManager _adminLogManager = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly ISharedPlayerManager _player = default!; [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly NpcFactionSystem _npcFaction = default!; [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly RoleSystem _role = default!; - [Dependency] private readonly SharedStunSystem _stun = default!; [Dependency] private readonly RoundEndSystem _roundEnd = default!; + [Dependency] private readonly SharedStunSystem _stun = default!; [Dependency] private readonly StationSystem _stationSystem = default!; [Dependency] private readonly SharedRevolutionarySystem _revolutionarySystem = default!; [Dependency] private readonly ChatSystem _chatSystem = default!; - [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly ISharedPlayerManager _player = default!; - [Dependency] private readonly UplinkSystem _uplink = default!; - //Used in OnPostFlash, no reference to the rule component is available public readonly ProtoId RevolutionaryNpcFaction = "Revolutionary"; @@ -117,13 +121,13 @@ public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnCommandMobStateChanged); + + SubscribeLocalEvent(OnPostConvert); // Einstein Engines - Revolutionary Manifesto + SubscribeLocalEvent(OnTryCallEvac); // goob edit SubscribeLocalEvent(OnHeadRevMobStateChanged); - SubscribeLocalEvent(OnHeadRevDeclareOpenRevolt); //Funky Station - SubscribeLocalEvent(AfterEntitySelected); // Funky Station SubscribeLocalEvent(OnGetBriefing); - SubscribeLocalEvent(OnPostFlash); - SubscribeLocalEvent(OnTryShuttleDock); // Funky Station - HE- HE- HELL NAW + } protected override void Started(EntityUid uid, RevolutionaryRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) @@ -132,81 +136,10 @@ protected override void Started(EntityUid uid, RevolutionaryRuleComponent compon component.CommandCheck = _timing.CurTime + component.TimerWait; } - private void AfterEntitySelected(Entity ent, ref AfterAntagEntitySelectedEvent args) - { - MakeHeadRevolutionary(args.EntityUid, ent); - } - - /// - /// (Funky Station) Adds a revolutionary uplink to HRevs. Makes midround HRevs less awkward, - /// now that they aren't dropping their fucking kit in the middle of security. - /// - /// true if uplink was successfully added. - private bool MakeHeadRevolutionary(EntityUid traitor, RevolutionaryRuleComponent component) - { - //Note[]? code = null; - //Sync Open Revolt state effects to new Head Rev - if (component.OpenRevoltDeclared && TryComp(traitor, out var headRevComp)) - _revolutionarySystem.ToggleConvertGivesVision((traitor, headRevComp), true); - - //Add Rev Uplink - if (!_mind.TryGetMind(traitor, out var mindId, out var mind)) - return false; - - //var pda = _uplink.FindUplinkTarget(traitor); - //if (pda == null || !_uplink.AddUplink(traitor, component.StartingBalance, component.UplinkCurrencyId, component.UplinkStoreId)) - // return false; - - //EnsureComp(pda.Value); - //var ev = new GenerateUplinkCodeEvent(); - //RaiseLocalEvent(pda.Value, ref ev); - //code = Comp(pda.Value).Code; - - _antag.SendBriefing(traitor, Loc.GetString("head-rev-role-greeting"), Color.Red, null); - - if (_role.MindHasRole(mindId, out var revRoleComp)) - //if (code != null) // Omu, if this is null something has gone wrong. - AddComp(revRoleComp.Value, new RoleBriefingComponent { Briefing = Loc.GetString("head-rev-briefing") }, overwrite: true); - //else - // return false; // Omu, if this happens something has gone wrong. - return true; - } - protected override void ActiveTick(EntityUid uid, RevolutionaryRuleComponent component, GameRuleComponent gameRule, float frameTime) { base.ActiveTick(uid, component, gameRule, frameTime); - if (component.RevLossTimerActive && !component.RevForceLose) - { - var headRevList = GetHeadRevs(); - - if (!IsGroupDetainedOrDead(headRevList, true, false, false)) - { - component.RevLossTimerActive = false; - - for (int i = 0; i < headRevList.Count; i++) - { - _popup.PopupEntity(Loc.GetString("rev-headrev-returned"), headRevList[i], headRevList[i]); - } - } - else if (component.RevLoseTime <= _timing.CurTime) - { - component.RevForceLose = true; - for (int i = 0; i < headRevList.Count; i++) - { - _popup.PopupEntity(Loc.GetString("rev-headrev-abandoned"), headRevList[i], headRevList[i]); - } - } - } - - // funkystation - if (component.RevVictoryEndTime != null && _timing.CurTime >= component.RevVictoryEndTime) - { - EndRound(); - - return; - } - if (component.CommandCheck <= _timing.CurTime) { component.CommandCheck = _timing.CurTime + component.TimerWait; @@ -222,54 +155,32 @@ protected override void ActiveTick(EntityUid uid, RevolutionaryRuleComponent com colorOverride: Color.Gold); component.HasRevAnnouncementPlayed = true; + } - component.RevVictoryEndTime = _timing.CurTime + component.RevVictoryEndDelay; + foreach (var ms in EntityQuery()) + { + var entity = ms.Item1.Owner; + + // assign eotrs + if (HasComp(entity)) + continue; + var revenemy = EnsureComp(entity); + _antag.SendBriefing(entity, Loc.GetString("rev-eotr-gain"), Color.Red, revenemy.RevStartSound); } } if (CheckRevsLose() && !component.HasAnnouncementPlayed) { - DeconvertAllRevs(); - - _roundEnd.DoRoundEndBehavior(RoundEndBehavior.ShuttleCall, - component.ShuttleCallTime, - textCall: "revolutionaries-lose-announcement-shuttle-call", - textAnnounce: "revolutionaries-lose-announcement"); + _chatSystem.DispatchGlobalAnnouncement( + Loc.GetString("revolutionaries-lose-announcement"), + Loc.GetString("revolutionaries-sender-cc"), + colorOverride: Color.Gold); component.HasAnnouncementPlayed = true; } - - if (component.OpenRevoltAnnouncementPending) - { - //Build string for announcement - string headRevNameList = ""; - - var headRevs = AllEntityQuery(); - while (headRevs.MoveNext(out var headRev, out var headRevComp, out _)) - { - if (!TryComp(headRev, out var headRevData)) - continue; - if (headRevNameList.Length > 0) - headRevNameList += ", "; - headRevNameList += headRevData.EntityName; - } - - _chatSystem.DispatchGlobalAnnouncement( - Loc.GetString("revolutionaries-open-revolt-announcement", ("nameList", headRevNameList)), - Loc.GetString("revolutionaries-sender-cc"), - colorOverride: Color.Red); - - component.OpenRevoltAnnouncementPending = false; - } } } - // funky station - private void EndRound() - { - _roundEnd.EndRound(); - } - protected override void AppendRoundEndText(EntityUid uid, RevolutionaryRuleComponent component, GameRuleComponent gameRule, @@ -277,29 +188,11 @@ protected override void AppendRoundEndText(EntityUid uid, { base.AppendRoundEndText(uid, component, gameRule, ref args); - var heads = AllEntityQuery(); - var convertedCommand = 0; - var totalHeadsOfStaff = 0; - - while (heads.MoveNext(out var headUid, out var commandStaffComponent)) - { - totalHeadsOfStaff += 1; - - if (!commandStaffComponent.Enabled && _mobState.IsAlive(headUid)) - convertedCommand += 1; - } - var revsLost = CheckRevsLose(); var commandLost = CheckCommandLose(); // This is (revsLost, commandsLost) concatted together // (moony wrote this comment idk what it means) var index = (commandLost ? 1 : 0) | (revsLost ? 2 : 0); - - // sets index to 4, "rev-total-victory" - // who needs elegance - if (convertedCommand.Equals(totalHeadsOfStaff) && !revsLost) - index = 4; - args.AddLine(Loc.GetString(Outcomes[index])); var sessionData = _antag.GetAntagIdentifiers(uid); @@ -322,23 +215,28 @@ private void OnGetBriefing(EntityUid uid, RevolutionaryRoleComponent comp, ref G { var ent = args.Mind.Comp.OwnedEntity; var head = HasComp(ent); - - if (!head) - { - args.Append(Loc.GetString("rev-briefing")); - } + args.Append(Loc.GetString(head ? "head-rev-briefing" : "rev-briefing")); } /// - /// Called when a Head Rev uses a flash in melee to convert somebody else. + /// Called when a Head Rev uses a Revolutionary Manifesto to convert somebody else. /// - private void OnPostFlash(EntityUid uid, HeadRevolutionaryComponent comp, ref AfterFlashedEvent ev) + private void OnPostConvert(EntityUid uid, HeadRevolutionaryComponent comp, ref AfterRevolutionaryConvertedEvent ev) { - + // Einstein Engines - Revolutionary Manifesto - Use RevolutionaryConverterSystem instead of hardcoding flashes // GoobStation - check if headRev's ability enabled if (!comp.ConvertAbilityEnabled) return; + // Goobstation - Something something check for 30 conditions of mute or otherwise speech impeding shit that makes book pointless + if (HasComp(uid) // Muzzles to bypass speech is bad + || HasComp(uid)) // No speech = No convert + return; + // Goob edit end (for now) + + if (uid != ev.User) + return; + var alwaysConvertible = HasComp(ev.Target); if (!_mind.TryGetMind(ev.Target, out var mindId, out var mind)) @@ -354,6 +252,9 @@ private void OnPostFlash(EntityUid uid, HeadRevolutionaryComponent comp, ref Aft HasComp(ev.Target) || // goob edit - no more ling or heretic revs HasComp(ev.Target)) // Antag immune MEANS antag immune. { + if (ev.User != null) + _popup.PopupEntity("The conversion failed!", ev.User.Value, ev.User.Value); + return; } @@ -363,12 +264,6 @@ private void OnPostFlash(EntityUid uid, HeadRevolutionaryComponent comp, ref Aft _npcFaction.AddFaction(ev.Target, RevolutionaryNpcFaction); var revComp = EnsureComp(ev.Target); - if (comp.ConvertGivesRevVision) - EnsureComp(ev.Target); - - _popup.PopupEntity(Loc.GetString("flash-component-user-head-rev", - ("victim", Identity.Entity(ev.Target, EntityManager))), ev.Target); - if (ev.User != null) { _adminLogManager.Add(LogType.Mind, @@ -389,7 +284,7 @@ private void OnPostFlash(EntityUid uid, HeadRevolutionaryComponent comp, ref Aft if (mind is { UserId: not null } && _player.TryGetSessionById(mind.UserId, out var session)) _antag.SendBriefing(session, Loc.GetString("rev-role-greeting"), Color.Red, revComp.RevStartSound); - + // Goobstation - Check lose if command was converted if (!TryComp(ev.Target, out var commandComp)) return; @@ -427,14 +322,13 @@ private bool CheckCommandLose() private void OnHeadRevMobStateChanged(EntityUid uid, HeadRevolutionaryComponent comp, MobStateChangedEvent ev) { if (ev.NewMobState == MobState.Dead || ev.NewMobState == MobState.Invalid) - if (CheckRevsLose()) - DeconvertAllRevs(); + CheckRevsLose(); } /// - /// Funky Station - yeah + /// Checks if all the Head Revs are dead and if so will deconvert all regular revs. /// - private void DeconvertAllRevs() + private bool CheckRevsLose() { var stunTime = TimeSpan.FromSeconds(4); var headRevList = new List(); @@ -452,24 +346,16 @@ private void DeconvertAllRevs() if (IsGroupDetainedOrDead(headRevList, false, false, false)) { var rev = AllEntityQuery(); - - // ts so nasty 💔 -// if (!deconvertRevs) // Omu, don't know what this is meant to do, but its broken. -// { -// return true; -// } - while (rev.MoveNext(out var uid, out _, out var mc)) { if (HasComp(uid)) continue; - _npcFaction.RemoveFaction(uid, RevolutionaryNpcFaction); - _stun.TryParalyze(uid, stunTime, true); // todo: use gamerule - RemCompDeferred(uid); - RemCompDeferred(uid); - _popup.PopupEntity(Loc.GetString("rev-break-control", ("name", Identity.Entity(uid, EntityManager))), uid); - _adminLogManager.Add(LogType.Mind, LogImpact.Medium, $"{ToPrettyString(uid)} was deconverted due to all Head Revolutionaries dying."); + _npcFaction.RemoveFaction(uid, RevolutionaryNpcFaction); + _stun.TryParalyze(uid, stunTime, true); + RemCompDeferred(uid); + _popup.PopupEntity(Loc.GetString("rev-break-control", ("name", Identity.Entity(uid, EntityManager))), uid); + _adminLogManager.Add(LogType.Mind, LogImpact.Medium, $"{ToPrettyString(uid)} was deconverted due to all Head Revolutionaries dying."); // Goobstation - check if command staff was deconverted if (TryComp(uid, out var commandComp)) @@ -486,75 +372,13 @@ private void DeconvertAllRevs() if (_player.TryGetSessionById(mind.UserId, out var session)) _euiMan.OpenEui(new DeconvertedEui(), session); } - } - } - /// - /// Checks if all the Head Revs are dead and if so will deconvert all regular revs. - /// - private bool CheckRevsLose() // this should have been just a simple check w no logic - { - var query = QueryActiveRules(); - while (query.MoveNext(out var uid, out _, out var revolutionary, out _)) - { - if (revolutionary.RevForceLose) - return true; - } - - var headRevList = GetHeadRevs(); - - // If no Head Revs are alive all normal Revs will lose their Rev status and rejoin Nanotrasen - // Cuffing Head Revs is not enough - they must be killed. - if (IsGroupDetainedOrDead(headRevList, false, false, false)) - { return true; } - // If Head Revs are all dead OR off station, start the timer - if (IsGroupDetainedOrDead(headRevList, true, false, false)) - { - query = QueryActiveRules(); - while (query.MoveNext(out var uid, out _, out var revolutionary, out _)) - { - //Do not set this timer again if the last one is still running. - if (revolutionary.RevLossTimerActive) - return false; - - //Start the loss timer, can be reset in ActiveTick if a Head Rev returns to station alive. - revolutionary.RevLossTimerActive = true; - revolutionary.RevLoseTime = _timing.CurTime + revolutionary.OffStationTimer; - } - - for (int i = 0; i < headRevList.Count; i++) - { - if (_stationSystem.GetOwningStation(headRevList[i]) == null) - { - _popup.PopupEntity(Loc.GetString("rev-headrev-must-return"), headRevList[i], headRevList[i]); //Popup that the Head Rev must return to the station - } - } - - return false; - } - return false; } - private List GetHeadRevs() - { - var headRevList = new List(); - - var headRevs = AllEntityQuery(); - while (headRevs.MoveNext(out var uid, out var headRevComp, out _)) // GoobStation - headRevComp - { - // GoobStation - Checking if headrev ability is enabled to count them - if (headRevComp.ConvertAbilityEnabled) - headRevList.Add(uid); - } - - return headRevList; - } - // goob edit - no shuttle call until internal affairs are figured out - // funkystation - disabled because this is garbo private void OnTryCallEvac(ref CommunicationConsoleCallShuttleAttemptEvent ev) { var revs = EntityQuery(); @@ -578,17 +402,6 @@ private void OnTryCallEvac(ref CommunicationConsoleCallShuttleAttemptEvent ev) } } - // funky station - public void OnTryShuttleDock(ref ShuttleDockAttemptEvent ev) - { - if (!CheckRevsLose()) - { - ev.Cancelled = true; - ev.CancelMessage = Loc.GetString("shuttle-dock-fail-revs"); - DeclareOpenRevolt(); - } - } - /// /// Will take a group of entities and check if these entities are alive, dead or cuffed. /// @@ -640,43 +453,6 @@ private bool IsGroupDetainedOrDead(List list, bool checkOffStation, b return gone == list.Count || list.Count == 0; } - /// - /// Declares a state of Open Revolt. This allows all Revolutionaries to see each other, at the cost of announcing openly the names of the Head Revolutionaries - /// - private void DeclareOpenRevolt() - { - var query = QueryActiveRules(); - while (query.MoveNext(out var uid, out _, out var revolutionaryRule, out _)) - { - if (revolutionaryRule.OpenRevoltDeclared) - return; - - revolutionaryRule.OpenRevoltDeclared = true; - //Queue announcement - revolutionaryRule.OpenRevoltAnnouncementPending = true; - } - - var headRevs = AllEntityQuery(); - while (headRevs.MoveNext(out var uid, out var headRevComp, out _)) - { - _revolutionarySystem.ToggleConvertGivesVision((uid, headRevComp), true); - } - - //Make All Revs see each other's Rev status - var rev = AllEntityQuery(); - while (rev.MoveNext(out var uid, out _, out var mc)) - { - EnsureComp(uid); - _popup.PopupEntity(Loc.GetString("revolutionaries-open-revolt-rev-popup"), uid, uid, PopupType.LargeCaution); - } - } - - private void OnHeadRevDeclareOpenRevolt(EntityUid uid, HeadRevolutionaryComponent comp, DeclareOpenRevoltEvent args) - { - DeclareOpenRevolt(); - args.Handled = true; - } - private static readonly string[] Outcomes = { // revs survived and heads survived... how @@ -686,8 +462,6 @@ private void OnHeadRevDeclareOpenRevolt(EntityUid uid, HeadRevolutionaryComponen // revs lost and heads survived "rev-lost", // revs lost and heads died - "rev-stalemate", - // revs won and all heads are converted and healthy - "rev-total-victory", + "rev-stalemate" }; -} \ No newline at end of file +} diff --git a/Content.Server/Hands/Systems/HandsSystem.cs b/Content.Server/Hands/Systems/HandsSystem.cs index f5a82476c35..3a72c13fe02 100644 --- a/Content.Server/Hands/Systems/HandsSystem.cs +++ b/Content.Server/Hands/Systems/HandsSystem.cs @@ -138,12 +138,13 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later +using System.Numerics; using Content.Server.Stack; using Content.Server.Stunnable; -using Content.Shared._Shitmed.Body.Events; // Shitmed Change using Content.Shared.ActionBlocker; using Content.Shared.Body.Part; using Content.Shared.Body.Systems; // Shitmed Change +using Content.Shared._Shitmed.Body.Events; // Shitmed Change using Content.Shared.CombatMode; using Content.Shared.Damage.Systems; using Content.Shared.Explosion; @@ -157,7 +158,6 @@ using Content.Shared.Stacks; using Content.Shared.Standing; using Content.Shared.Throwing; -using Robust.Shared.GameObjects; using Robust.Shared.GameStates; using Robust.Shared.Input.Binding; using Robust.Shared.Map; @@ -165,7 +165,6 @@ using Robust.Shared.Player; using Robust.Shared.Random; using Robust.Shared.Timing; -using System.Numerics; namespace Content.Server.Hands.Systems { @@ -334,8 +333,6 @@ private bool HandleThrowItem(ICommonSession? playerSession, EntityCoordinates co /// public bool ThrowHeldItem(EntityUid player, EntityCoordinates coordinates, float minDistance = 0.1f) { - var holderVelocity = _physicsQuery.TryComp(player, out var physics) ? physics.LinearVelocity : Vector2.Zero; // Goobstation - if (ContainerSystem.IsEntityInContainer(player) || !TryComp(player, out HandsComponent? hands) || !TryGetActiveItem((player, hands), out var throwEnt) || @@ -379,7 +376,7 @@ public bool ThrowHeldItem(EntityUid player, EntityCoordinates coordinates, float // Let other systems change the thrown entity (useful for virtual items) // or the throw strength. - var ev = new BeforeThrowEvent(throwEnt.Value, direction + holderVelocity, throwSpeed, player); // Goobstation - added thrower's velocity for inertia + var ev = new BeforeThrowEvent(throwEnt.Value, direction, throwSpeed, player); RaiseLocalEvent(player, ref ev); if (ev.Cancelled) diff --git a/Content.Server/Lathe/LatheSystem.cs b/Content.Server/Lathe/LatheSystem.cs index f7ac048184b..fc400f9d992 100644 --- a/Content.Server/Lathe/LatheSystem.cs +++ b/Content.Server/Lathe/LatheSystem.cs @@ -133,7 +133,6 @@ public sealed class LatheSystem : SharedLatheSystem [Dependency] private readonly StackSystem _stack = default!; [Dependency] private readonly TransformSystem _transform = default!; [Dependency] private readonly ChatSystem _chatSystem = default!; // Goobstation - New recipes message - [Dependency] private readonly IComponentFactory _factory = default!; // Goobstation - Output to material storage /// /// Per-tick cache @@ -307,19 +306,10 @@ public void FinishProducing(EntityUid uid, LatheComponent? comp = null, LathePro var currentRecipe = _proto.Index(comp.CurrentRecipe.Value); if (currentRecipe.Result is { } resultProto) { - // Goobstation, output to material storage instead of spawning - var prototype = _proto.Index(resultProto); - if (comp.OutputToStorage && prototype.TryGetComponent(out var composition, _factory)) - { - _materialStorage.TryChangeMaterialAmount(uid, composition.MaterialComposition); - } - else - { - var result = Spawn(resultProto, Transform(uid).Coordinates); - _stack.TryMergeToContacts(result); - if (TryComp(result, out var scannable)) // Goobstation - scannable.Points = 0; // Goobstation, this thing is to prevent ntr duping points via an emagged lathe - } + var result = Spawn(resultProto, Transform(uid).Coordinates); + _stack.TryMergeToContacts(result); + if (TryComp(result, out var scannable)) // Goobstation + scannable.Points = 0; // Goobstation, this thing is to prevent ntr duping points via an emagged lathe } if (currentRecipe.ResultReagents is { } resultReagents && diff --git a/Content.Server/Revolutionary/RevolutionarySystem.cs b/Content.Server/Revolutionary/RevolutionarySystem.cs index 4465c3611ee..8db5d214347 100644 --- a/Content.Server/Revolutionary/RevolutionarySystem.cs +++ b/Content.Server/Revolutionary/RevolutionarySystem.cs @@ -1,30 +1,51 @@ -using Content.Server.Actions; -using Content.Shared.Revolutionary; -using Content.Shared.Revolutionary.Components; +// SPDX-FileCopyrightText: 2024 AJCM-git <60196617+AJCM-git@users.noreply.github.com> +// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> +// +// SPDX-License-Identifier: AGPL-3.0-or-later +using Content.Server._EinsteinEngines.Language; // Goob Station - Revolutionary Language +using Content.Shared.Revolutionary; +using Content.Shared.Revolutionary.Components; // Goob Station - Revolutionary Language namespace Content.Server.Revolutionary; - // funkystation start -public sealed class RevolutionarySystem : SharedRevolutionarySystem + +public sealed class RevolutionarySystem : SharedRevolutionarySystem // Goob Station - Revolutionary Language (entire class body) { - [Dependency] private readonly ActionsSystem _actions = default!; + [Dependency] private readonly LanguageSystem _languageSystem = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnStartHeadRev); + SubscribeLocalEvent(OnRevolutionaryComponentShutdown); + SubscribeLocalEvent(OnRevolutionaryComponentShutdown); + } + + public override void OnRevolutionaryComponentStartup(EntityUid someUid, T someComp, ComponentStartup ev) + { + base.OnRevolutionaryComponentStartup(someUid, someComp, ev); + + switch (someComp) + { + case HeadRevolutionaryComponent headRevComp: + _languageSystem.AddLanguage(someUid, headRevComp.Language); + break; + case RevolutionaryComponent revComp: + _languageSystem.AddLanguage(someUid, revComp.Language); + break; + } } - /// - /// Add the starting ability(s) to the Head Rev. - /// - private void OnStartHeadRev(Entity uid, ref ComponentInit args) + private void OnRevolutionaryComponentShutdown(EntityUid uid, T component, ComponentShutdown args) { - foreach (var actionId in uid.Comp.BaseHeadRevActions) + switch (component) { - var actionEnt = _actions.AddAction(uid, actionId); + case HeadRevolutionaryComponent headRevComp: + _languageSystem.RemoveLanguage(uid, headRevComp.Language); + break; + case RevolutionaryComponent revComp: + _languageSystem.RemoveLanguage(uid, revComp.Language); + break; } } } - // funkystation end diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs index c79121b067c..63dddd65e98 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs @@ -104,8 +104,6 @@ using Robust.Shared.Random; using Robust.Shared.Timing; using Robust.Shared.Utility; -using Content.Shared.DeviceNetwork.Components; -using Content.Shared._Omu.Shuttles.Components; // Omu, allow CC shuttles to FTL to CC namespace Content.Server.Shuttles.Systems; @@ -496,24 +494,6 @@ private void OnStationStartup(Entity ent, ref /// public void DockEmergencyShuttle() { - // funky station - // fires an event that the emergency shuttle is trying to dock. - var query = AllEntityQuery(); - - var ev = new ShuttleDockAttemptEvent(); - RaiseLocalEvent(ref ev); // 💔 - - if (ev.Cancelled) - { - while (query.MoveNext(out var uid, out _)) - { - _chatSystem.DispatchStationAnnouncement(uid, ev.CancelMessage, Loc.GetString("Station"), false); - } - - _roundEnd.CancelRoundEndCountdown(null, false, false); - return; - } - if (EmergencyShuttleArrived) return; @@ -526,6 +506,8 @@ public void DockEmergencyShuttle() ConsoleAccumulator = _configManager.GetCVar(CCVars.EmergencyShuttleDockTime); EmergencyShuttleArrived = true; + var query = AllEntityQuery(); + var dockResults = new List(); while (query.MoveNext(out var uid, out var comp)) @@ -627,7 +609,7 @@ private void AddCentcomm(EntityUid station, StationCentcommComponent component) QueueDel(grid); return; } - _ = EnsureComp(map); // Omu, add marker component to CC + if (!Exists(grid)) { Log.Error($"Failed to set up centcomm grid!"); @@ -812,11 +794,3 @@ public enum ShuttleDockResultType : byte GoodLuck, } } - -// funky station -[ByRefEvent] -public record struct ShuttleDockAttemptEvent() -{ - public bool Cancelled = false; - public string CancelMessage = string.Empty; -} diff --git a/Content.Server/Traits/TraitSystem.cs b/Content.Server/Traits/TraitSystem.cs index 8336e4a82ac..aae8cd798ed 100644 --- a/Content.Server/Traits/TraitSystem.cs +++ b/Content.Server/Traits/TraitSystem.cs @@ -64,6 +64,12 @@ private void OnPlayerSpawnComplete(PlayerSpawnCompleteEvent args) _whitelistSystem.IsBlacklistPass(traitPrototype.Blacklist, args.Mob)) continue; + // Begin Goobstation: Species trait support + if (traitPrototype.IncludedSpecies.Count > 0 && !traitPrototype.IncludedSpecies.Contains(args.Profile.Species) || + traitPrototype.ExcludedSpecies.Contains(args.Profile.Species)) + continue; + // End Goobstation: Species trait support + // Add all components required by the prototype if (traitPrototype.Components != null) // Omustation - Remake EE Traits System - Port trait functions (make traits that don't directly give you components *possible*) EntityManager.AddComponents(args.Mob, traitPrototype.Components, false); diff --git a/Content.Server/_EinsteinEngines/HeightAdjust/BloodstreamAdjustSystem.cs b/Content.Server/_EinsteinEngines/HeightAdjust/BloodstreamAdjustSystem.cs index 2aaf5c3196a..e884bca6cde 100644 --- a/Content.Server/_EinsteinEngines/HeightAdjust/BloodstreamAdjustSystem.cs +++ b/Content.Server/_EinsteinEngines/HeightAdjust/BloodstreamAdjustSystem.cs @@ -42,16 +42,13 @@ public bool TryAdjustBloodstream(Entity ent) var factor = Math.Pow(_contests.MassContest(ent, bypassClamp: true, rangeFactor: 4f), ent.Comp.Power); factor = Math.Clamp(factor, ent.Comp.Min, ent.Comp.Max); + var newVolume = bloodstream.BloodMaxVolume * factor; var newBloodLevel = bloodSolution.FillFraction * newVolume; bloodSolution.MaxVolume = newVolume; + bloodSolution.SetContents([new ReagentQuantity(bloodstream.BloodReagent, newBloodLevel, null)], false); - // Goobstation start - double blood in medical pda/health analyzer fix - //bloodSolution.SetContents([new ReagentQuantity(bloodstream.BloodReagent, newBloodLevel, getReagent)], false); _bloodstream.SetBloodMaxVolume((ent.Owner, bloodstream), newVolume); - // SetContents would remove DNA data from bloodstream, using a proper method provided by the system - _bloodstream.TryModifyBloodLevel((ent.Owner, bloodstream), newBloodLevel); - // Goobstation end return true; } diff --git a/Content.Server/_EinsteinEngines/Language/LanguageSystem.cs b/Content.Server/_EinsteinEngines/Language/LanguageSystem.cs index 0190db08567..d273f7bcdc7 100644 --- a/Content.Server/_EinsteinEngines/Language/LanguageSystem.cs +++ b/Content.Server/_EinsteinEngines/Language/LanguageSystem.cs @@ -72,21 +72,8 @@ private void OnClientSetLanguage(LanguagesSetMessage message, EntitySessionEvent #region public api - public bool CanUnderstand(Entity ent, ProtoId language) - { - if (language == PsychomanticPrototype || language == UniversalPrototype || TryComp(ent, out var uni) && uni.Enabled) - return true; - - return Resolve(ent, ref ent.Comp, logMissing: false) && ent.Comp.UnderstoodLanguages.Contains(language); - } - - public bool CanSpeak(Entity ent, ProtoId language) - { - if (!Resolve(ent, ref ent.Comp, logMissing: false)) - return false; - - return ent.Comp.SpokenLanguages.Contains(language); - } + //public bool CanUnderstand(Entity ent, ProtoId language) // - Goob : moved to Shared + //public bool CanSpeak(Entity ent, ProtoId language) // - Goob : moved to Shared /// /// Returns the current language of the given entity, assumes Universal if it's not a language speaker. diff --git a/Content.Server/_Shitcode/Heretic/Abilities/HereticAbilitySystem.Ash.cs b/Content.Server/_Shitcode/Heretic/Abilities/HereticAbilitySystem.Ash.cs index 3d30d1db328..56e37f10934 100644 --- a/Content.Server/_Shitcode/Heretic/Abilities/HereticAbilitySystem.Ash.cs +++ b/Content.Server/_Shitcode/Heretic/Abilities/HereticAbilitySystem.Ash.cs @@ -27,8 +27,6 @@ using Content.Goobstation.Shared.Body.Components; using Content.Goobstation.Shared.Temperature.Components; using Content.Goobstation.Shared.Atmos.Components; -using Content.Shared._Shitmed.Damage; -using Content.Shared._Shitmed.Targeting; namespace Content.Server.Heretic.Abilities; @@ -78,35 +76,43 @@ private void OnNWRebirth(Entity ent, ref EventHereticNightwatc if (!TryUseAbility(ent, args)) return; - if (ent.Comp is not { Ascended: true, CurrentPath: "Ash" }) - _flammable.Extinguish(ent); - - var lookup = GetNearbyPeople(ent, args.Range); - var toHeal = 0f; + var power = ent.Comp.CurrentPath == "Ash" ? ent.Comp.PathStage : 4f; + var lookup = Lookup.GetEntitiesInRange(ent, power); + var healAmount = -10f - power; foreach (var look in lookup) { - if (!TryComp(look, out var flam) || !flam.OnFire || - !TryComp(look, out var mobstate) || mobstate.CurrentState == MobState.Dead) + if ((TryComp(look, out var th) && th.CurrentPath == ent.Comp.CurrentPath) + || HasComp(look)) continue; - if (mobstate.CurrentState == MobState.Critical) - _mobstate.ChangeMobState(look, MobState.Dead, mobstate); - - toHeal += args.HealAmount; - - _flammable.AdjustFireStacks(look, args.FireStacks, flam, true); - _dmg.TryChangeDamage(look, args.Damage, true, targetPart: TargetBodyPart.All); + if (TryComp(look, out var flam)) + { + if (flam.OnFire && TryComp(ent, out var dmgc)) + { + // heals everything by base + power for each burning target + _stam.TryTakeStamina(ent, healAmount); + var dmgdict = dmgc.Damage.DamageDict; + DamageSpecifier healSpecifier = new(); + + foreach (var key in dmgdict.Keys) + { + healSpecifier.DamageDict[key] = -dmgdict[key] < healAmount ? healAmount : -dmgdict[key]; + } + + _dmg.TryChangeDamage(ent, healSpecifier, true, false, dmgc); + } + + if (flam.OnFire) + _flammable.AdjustFireStacks(look, power, flam, true); + + if (TryComp(look, out var mobstat)) + if (mobstat.CurrentState == MobState.Critical) + _mobstate.ChangeMobState(look, MobState.Dead, mobstat); + } } args.Handled = true; - - if (toHeal >= 0) - return; - - // heals everything by base + power for each burning target - _stam.TryTakeStamina(ent, toHeal); - IHateWoundMed(ent.Owner, args.ToHeal * toHeal, toHeal, toHeal); } private void OnFlames(Entity ent, ref EventHereticFlames args) diff --git a/Content.Server/_Shitcode/Heretic/Abilities/HereticAbilitySystem.Rust.cs b/Content.Server/_Shitcode/Heretic/Abilities/HereticAbilitySystem.Rust.cs index a1f1e2c31e3..7163c307bef 100644 --- a/Content.Server/_Shitcode/Heretic/Abilities/HereticAbilitySystem.Rust.cs +++ b/Content.Server/_Shitcode/Heretic/Abilities/HereticAbilitySystem.Rust.cs @@ -11,16 +11,29 @@ using System.Linq; using System.Numerics; +using Content.Goobstation.Common.Movement; +using Content.Goobstation.Common.Religion; +using Content.Server.Flash; using Content.Server.Heretic.Components.PathSpecific; +using Content.Server.Shuttles.Components; using Content.Server.Spreader; using Content.Shared._Goobstation.Heretic.Components; using Content.Shared._Goobstation.Wizard; +using Content.Shared._Shitcode.Heretic.Components; using Content.Shared._Shitmed.Targeting; +using Content.Shared.Atmos; +using Content.Shared.Damage.Components; using Content.Shared.Flash; using Content.Shared.Heretic; +using Content.Shared.Inventory; using Content.Shared.Maps; +using Content.Shared.Mech.Components; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; using Content.Shared.Physics; +using Content.Shared.Rejuvenate; using Content.Shared.Tiles; +using Robust.Shared.Collections; using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Physics; @@ -32,6 +45,9 @@ namespace Content.Server.Heretic.Abilities; public sealed partial class HereticAbilitySystem { + + [Dependency] private readonly InventorySystem _inventory = default!; + public static readonly Dictionary Transformations = new() { { "WallSolid", "WallSolidRust" }, @@ -55,6 +71,74 @@ protected override void SubscribeRust() SubscribeLocalEvent(OnRandomOffsetStartup); SubscribeLocalEvent(OnFlashAttempt); + + SubscribeLocalEvent(OnMechCantMove); + SubscribeLocalEvent(OnMechGetTile); + SubscribeLocalEvent(OnCantMove); + SubscribeLocalEvent(OnGetTile); + + SubscribeLocalEvent(OnRejuvenate); + } + + private void OnRejuvenate(Entity ent, ref RejuvenateEvent args) + { + RemCompDeferred(ent.Owner, ent.Comp); + } + + private void OnMechGetTile(Entity ent, ref MoverControllerGetTileEvent args) + { + if (args.Tile is not { ID: RustTile }) + return; + + EnsureComp(ent); + } + + private void OnMechCantMove(Entity ent, ref MoverControllerCantMoveEvent args) + { + if (IsTileRust(Transform(ent).Coordinates, out _)) + EnsureComp(ent); + } + + private void OnGetTile(Entity ent, ref MoverControllerGetTileEvent args) + { + if (ent.Comp.CurrentState == MobState.Dead) + return; + + if (args.Tile is not { ID: RustTile }) + return; + + if (HasComp(ent) + || HasComp(ent) + || HasComp(ent)) + return; + + //Ideally this should use DivineInterventionSystem - + //Until GoobMod Heretic, I don't see it necessary to use event relays to achieve this effect between Core & Goob. + if (_inventory.GetHandOrInventoryEntities(ent.Owner, SlotFlags.WITHOUT_POCKET) + .Any(item => HasComp(item))) + return; + + EnsureComp(ent); + } + + private void OnCantMove(Entity ent, ref MoverControllerCantMoveEvent args) + { + if (ent.Comp.CurrentState == MobState.Dead) + return; + + if (HasComp(ent) + || HasComp(ent) + || HasComp(ent)) + return; + + //Ideally this should use DivineInterventionSystem - + //Until GoobMod Heretic, I don't see it necessary to use event relays to achieve this effect between Core & Goob. + if (_inventory.GetHandOrInventoryEntities(ent.Owner, SlotFlags.WITHOUT_POCKET) + .Any(item => HasComp(item))) + return; + + if (IsTileRust(Transform(ent).Coordinates, out _)) + EnsureComp(ent); } private void OnFlashAttempt(Entity ent, ref FlashAttemptEvent args) @@ -67,9 +151,9 @@ private void OnFlashAttempt(Entity ent, ref FlashAttemptEv private void OnSpread(Entity ent, ref SpreadNeighborsEvent args) { - var (uid, _) = ent; + var (uid, comp) = ent; - if (args.NeighborFreeTiles.Count == 0) + if (args.Neighbors.Count >= 4) { RemCompDeferred(uid); return; @@ -83,11 +167,71 @@ private void OnSpread(Entity ent, ref SpreadNeighborsEven return; } - _random.Shuffle(args.NeighborFreeTiles); + var xformQuery = GetEntityQuery(); - foreach (var (gridComp, tile) in args.NeighborFreeTiles) + var xform = xformQuery.Comp(uid); + + if (!TryComp(xform.GridUid, out var grid)) + return; + + var tile = _map.TileIndicesFor(xform.GridUid.Value, grid, xform.Coordinates); + + var ourEnts = _map.GetAnchoredEntitiesEnumerator(xform.GridUid.Value, grid, tile); + var spreaderQuery = GetEntityQuery(); + var dockQuery = GetEntityQuery(); + + var neighborTiles = new ValueList<(EntityUid entity, MapGridComponent grid, Vector2i Indices)>(); + + while (ourEnts.MoveNext(out var entity)) + { + if (dockQuery.TryGetComponent(entity, out var dock) && + dock.Docked && + xformQuery.TryGetComponent(dock.DockedWith, out var dockedXform) && + TryComp(dockedXform.GridUid, out var dockedGrid)) + { + neighborTiles.Add((dockedXform.GridUid.Value, dockedGrid, + _map.CoordinatesToTile(dockedXform.GridUid.Value, dockedGrid, dockedXform.Coordinates))); + } + } + + for (var i = 0; i < 4; i++) { - Spawn(prototype, _map.GridTileToLocal(tile.GridUid, gridComp, tile.GridIndices)); + var atmosDir = (AtmosDirection) (1 << i); + var neighborPos = tile.Offset(atmosDir); + + if (!_map.TryGetTileRef(xform.GridUid.Value, grid, neighborPos, out var tileRef) || tileRef.Tile.IsEmpty) + continue; + + neighborTiles.Add((xform.GridUid.Value, grid, neighborPos)); + } + + for (var i = neighborTiles.Count - 1; i >= 0; i--) + { + var (gridUid, gridComp, indices) = neighborTiles[i]; + foreach (var entity in _map.GetAnchoredEntities(gridUid, gridComp, indices)) + { + if (!spreaderQuery.TryGetComponent(entity, out var spreader)) + continue; + + if (spreader.Id != comp.SpreaderProto) + continue; + + neighborTiles.RemoveAt(i); + break; + } + } + + if (neighborTiles.Count == 0) + { + RemCompDeferred(uid); + return; + } + + _random.Shuffle(neighborTiles); + + foreach (var (gridUid, gridComp, indices) in neighborTiles) + { + Spawn(prototype, _map.GridTileToLocal(gridUid, gridComp, indices)); args.Updates--; if (args.Updates <= 0) return; @@ -156,17 +300,13 @@ private void OnEntropicPlume(Entity ent, ref EventHereticEntro var plume = Spawn(args.Proto, mapPos); - RustObjectsInRadius(mapPos, args.Radius, args.TileRune, args.LookupRange, args.RustStrength); + RustObjectsInRadius(mapPos, args.Radius, args.TileRune, args.LookupRange); _gun.ShootProjectile(plume, dir, Vector2.Zero, uid, uid, args.Speed); _gun.SetTarget(plume, null, out _); } - private void RustObjectsInRadius(MapCoordinates mapPos, - float radius, - string tileRune, - float lookupRange, - int rustStrength) + private void RustObjectsInRadius(MapCoordinates mapPos, float radius, string tileRune, float lookupRange) { var circle = new Circle(mapPos.Position, radius); var grids = new List>(); @@ -187,7 +327,7 @@ private void RustObjectsInRadius(MapCoordinates mapPos, foreach (var toRust in Lookup.GetEntitiesInRange(coords, lookupRange, LookupFlags.Static)) { - TryMakeRustWall(toRust, null, rustStrength); + TryMakeRustWall(toRust); } } } @@ -237,22 +377,19 @@ private void OnAggressiveSpread(EntityUid ent, ref EventHereticAggressiveSpread foreach (var toRust in Lookup.GetEntitiesInRange(coords, args.LookupRange, LookupFlags.Static)) { - TryMakeRustWall(toRust, null, args.RustStrength); + TryMakeRustWall(toRust); } } } - public bool CanSurfaceBeRusted(EntityUid target, Entity? ent, out int surfaceStrength) + public bool CanSurfaceBeRusted(EntityUid target, Entity? ent) { - surfaceStrength = 0; - if (!TryComp(target, out RustRequiresPathStageComponent? requiresPathStage)) return true; var stage = ent == null ? 10 : ent.Value.Comp.PathStage; - surfaceStrength = requiresPathStage.PathStage; - if (surfaceStrength <= stage) + if (requiresPathStage.PathStage <= stage) return true; if (ent != null) @@ -275,18 +412,10 @@ public void MakeRustTile(EntityUid gridUid, MapGridComponent mapGrid, TileRef ti Spawn(tileRune, new EntityCoordinates(gridUid, tileRef.GridIndices)); } - public bool TryMakeRustWall(EntityUid target, Entity? ent = null, int? rustStrengthOverride = null) + public bool TryMakeRustWall(EntityUid target, Entity? ent = null) { - var canRust = CanSurfaceBeRusted(target, ent, out var surfaceStrength); - if (HasComp(target)) - { - if (surfaceStrength > (rustStrengthOverride ?? ent?.Comp.PathStage ?? -1)) - return false; - - Del(target); - return true; - } + return false; var proto = Prototype(target); @@ -295,7 +424,7 @@ public bool TryMakeRustWall(EntityUid target, Entity? ent = nu // Check transformations (walls into rusted walls) if (proto != null && Transformations.TryGetValue(proto.ID, out var transformation)) { - if (!canRust) + if (!CanSurfaceBeRusted(targetEntity, ent)) return false; var xform = Transform(target); @@ -310,7 +439,7 @@ public bool TryMakeRustWall(EntityUid target, Entity? ent = nu if (TerminatingOrDeleted(targetEntity) || !_tag.HasTag(targetEntity, "Wall")) return false; - if (targetEntity == target && !canRust) + if (targetEntity == target && !CanSurfaceBeRusted(targetEntity, ent)) return false; EnsureComp(targetEntity); diff --git a/Content.Server/_Shitcode/Heretic/Abilities/HereticAbilitySystem.cs b/Content.Server/_Shitcode/Heretic/Abilities/HereticAbilitySystem.cs index 20c087a1e93..3abd627d734 100644 --- a/Content.Server/_Shitcode/Heretic/Abilities/HereticAbilitySystem.cs +++ b/Content.Server/_Shitcode/Heretic/Abilities/HereticAbilitySystem.cs @@ -26,10 +26,13 @@ using Content.Goobstation.Shared.Overlays; using Content.Server.Atmos.EntitySystems; using Content.Server.Chat.Systems; +using Content.Server.DoAfter; using Content.Server.Flash; using Content.Server.Hands.Systems; +using Content.Server.Magic; using Content.Server.Polymorph.Systems; using Content.Server.Store.Systems; +using Content.Shared._Shitmed.Damage; using Content.Shared.Damage; using Content.Shared.Damage.Systems; using Content.Shared.DoAfter; @@ -60,21 +63,32 @@ using Content.Server.Temperature.Systems; using Content.Shared.Chemistry.EntitySystems; using Content.Server.Heretic.Components; +using Content.Server.Jittering; +using Content.Server.Speech.EntitySystems; using Content.Server.Temperature.Components; using Content.Server.Weapons.Ranged.Systems; +using Content.Shared._EinsteinEngines.Silicon.Components; using Content.Shared._Goobstation.Heretic.Components; using Content.Shared._Shitcode.Heretic.Components; using Content.Shared._Shitcode.Heretic.Systems.Abilities; +using Content.Shared._Shitmed.Targeting; using Content.Shared.Chemistry.Components.SolutionManager; using Content.Shared.Damage.Components; +using Content.Shared.Damage.Prototypes; +using Content.Shared.Eye.Blinding.Components; using Content.Goobstation.Maths.FixedPoint; +using Content.Server.Examine; +using Content.Server.Interaction; using Content.Shared.Chat; +using Content.Shared.Hands.Components; using Content.Shared.Heretic.Components; +using Content.Shared.Mech.Components; +using Content.Shared.Mobs; using Content.Shared.Movement.Pulling.Systems; +using Content.Shared.Silicons.Borgs.Components; using Content.Shared.Standing; using Content.Shared._Starlight.CollectiveMind; using Content.Shared.Body.Components; -using Content.Shared.Examine; using Content.Shared.Tag; using Robust.Server.Containers; @@ -103,6 +117,7 @@ public sealed partial class HereticAbilitySystem : SharedHereticAbilitySystem [Dependency] private readonly SharedUserInterfaceSystem _ui = default!; [Dependency] private readonly StationSystem _station = default!; [Dependency] private readonly IMapManager _mapMan = default!; + [Dependency] private readonly IPrototypeManager _prot = default!; [Dependency] private readonly ITileDefinitionManager _tileDefinitionManager = default!; [Dependency] private readonly IComponentFactory _compFactory = default!; [Dependency] private readonly ProtectiveBladeSystem _pblade = default!; @@ -120,7 +135,9 @@ public sealed partial class HereticAbilitySystem : SharedHereticAbilitySystem [Dependency] private readonly PullingSystem _pulling = default!; [Dependency] private readonly MansusGraspSystem _mansusGrasp = default!; [Dependency] private readonly ActionsSystem _actions = default!; - [Dependency] private readonly ExamineSystemShared _examine = default!; + [Dependency] private readonly JitteringSystem _jitter = default!; + [Dependency] private readonly StutteringSystem _stutter = default!; + [Dependency] private readonly ExamineSystem _examine = default!; private const float LeechingWalkUpdateInterval = 1f; private float _accumulator; @@ -133,8 +150,8 @@ private List GetNearbyPeople(Entity ent, float rang foreach (var look in lookup) { // ignore heretics with the same path*, affect everyone else - if (TryComp(look, out var th) && th.CurrentPath == ent.Comp.CurrentPath || - HasComp(look)) + if ((TryComp(look, out var th) && th.CurrentPath == ent.Comp.CurrentPath) + || HasComp(look)) continue; if (!HasComp(look)) @@ -401,24 +418,7 @@ public override void Update(float frameTime) RustObjectsInRadius(_transform.GetMapCoordinates(uid, xform), rust.RustRadius, rust.TileRune, - rust.LookupRange, - rust.RustStrength); - } - - var rustBringerQuery = EntityQueryEnumerator(); - while (rustBringerQuery.MoveNext(out var rustBringer, out var xform)) - { - rustBringer.Accumulator += frameTime; - - if (rustBringer.Accumulator < rustBringer.Delay) - continue; - - rustBringer.Accumulator = 0f; - - if (!IsTileRust(xform.Coordinates, out _)) - continue; - - Spawn(rustBringer.Effect, xform.Coordinates); + rust.LookupRange); } _accumulator += frameTime; @@ -440,6 +440,8 @@ public override void Update(float frameTime) var leechQuery = EntityQueryEnumerator(); while (leechQuery.MoveNext(out var uid, out var leech, out var xform)) { + RemCompDeferred(uid); + if (!IsTileRust(xform.Coordinates, out _)) continue; @@ -447,7 +449,7 @@ public override void Update(float frameTime) if (rustbringerQuery.HasComp(uid)) { - multiplier = leech.AscensionMultiplier; + multiplier = leech.AscensuionMultiplier; if (resiratorQuery.TryComp(uid, out var respirator)) _respirator.UpdateSaturation(uid, respirator.MaxSaturation - respirator.MinSaturation, respirator); @@ -455,13 +457,17 @@ public override void Update(float frameTime) RemCompDeferred(uid); - var toHeal = leech.ToHeal * multiplier; - var boneHeal = leech.BoneHeal * multiplier; - var otherHeal = boneHeal; // Same as boneHeal because I don't give a fuck - if (damageableQuery.TryComp(uid, out var damageable)) { - IHateWoundMed((uid, damageable, null, null), toHeal, boneHeal, otherHeal); + _dmg.TryChangeDamage(uid, + leech.ToHeal * multiplier, + true, + false, + damageable, + null, + false, + targetPart: TargetBodyPart.All, + splitDamage: SplitDamageBehavior.SplitEnsureAll); } if (bloodQuery.TryComp(uid, out var blood)) @@ -504,5 +510,118 @@ public override void Update(float frameTime) _statusEffect.TryRemoveStatusEffect(uid, "SeeingRainbows", status); } } + + var siliconQuery = GetEntityQuery(); + var borgChassisQuery = GetEntityQuery(); + var godmodeQuery = GetEntityQuery(); + var hereticQuery = GetEntityQuery(); + var ghoulQuery = GetEntityQuery(); + var mobQuery = GetEntityQuery(); + var mechQuery = GetEntityQuery(); + + var siliconDamage = new DamageSpecifier(_prot.Index("Brute"), 10); + + var disgustQuery = EntityQueryEnumerator(); + while (disgustQuery.MoveNext(out var uid, out var disgust, out var xform)) + { + if (godmodeQuery.HasComp(uid) || hereticQuery.HasComp(uid) || ghoulQuery.HasComp(uid)) + { + RemCompDeferred(uid, disgust); + continue; + } + + var isNotDead = mobQuery.TryComp(uid, out var mobState) && mobState.CurrentState != MobState.Dead; + var isMech = mechQuery.HasComp(uid); + var isSilicon = siliconQuery.HasComp(uid) || borgChassisQuery.HasComp(uid) || _tag.HasTag(uid, "Bot"); + + // If we are standing on rusted tile while we are a mech or not dead - apply/accumulate rust effects, + // Else we stop damaging the entity if we are silicon or mech or reduce disgust level. + if ((isNotDead || isMech) && IsTileRust(xform.Coordinates, out _)) + { + // Apply rust corruption + if (isSilicon || isMech) + { + _dmg.TryChangeDamage(uid, + siliconDamage, + ignoreResistances: true, + targetPart: TargetBodyPart.Chest); + + // Don't popup to mech + if (isMech) + continue; + + Popup.PopupEntity(Loc.GetString("rust-corruption-silicon-damage"), + uid, + uid, + PopupType.MediumCaution); + + continue; + } + + disgust.CurrentLevel += disgust.ModifierPerUpdate; + } + else + { + if (isSilicon || isMech) + { + RemCompDeferred(uid, disgust); + continue; + } + + disgust.CurrentLevel -= disgust.PassiveReduction; + + if (disgust.CurrentLevel <= 0f) + { + RemCompDeferred(uid, disgust); + continue; + } + } + + if (!statusQuery.TryComp(uid, out var status)) + continue; + + // First level: Visual effects. Jitter stutter and popups. + if (disgust.CurrentLevel >= disgust.NegativeThreshold) + { + if (_random.Prob(disgust.NegativeEffectProb)) + { + _jitter.DoJitter(uid, disgust.NegativeTime, true, 10f, 10f, true, status); + _stutter.DoStutter(uid, disgust.NegativeTime, true, status); + Popup.PopupEntity(Loc.GetString("disgust-effect-warning"), uid, uid, PopupType.SmallCaution); + } + } + + // Second level: Chance to vomit which knocks down for a long time and reduces disgust level + if (disgust.CurrentLevel >= disgust.VomitThreshold) + { + var vomitProb = Math.Clamp(0.025f + 0.00025f * disgust.VomitThreshold, 0f, 1f); + if (_random.Prob(vomitProb)) + { + _vomit.Vomit(uid); + _stun.KnockdownOrStun(uid, disgust.VomitKnockdownTime, true, status); + disgust.CurrentLevel -= disgust.VomitThreshold; + } + } + + // Third level: Harmful negative effects: eyeblur and slowdown. + if (disgust.CurrentLevel >= disgust.BadNegativeThreshold) + { + if (_random.Prob(disgust.BadNegativeEffectProb)) + { + _statusEffect.TryAddStatusEffect(uid, + "BlurryVision", + disgust.BadNegativeTime, + true, + status); + + _stun.TrySlowdown(uid, + disgust.BadNegativeTime, + true, + disgust.SlowdownMultiplier, + disgust.SlowdownMultiplier, + status); + } + } + } } } diff --git a/Content.Server/_Shitcode/Wizard/Systems/SpellsSystem.cs b/Content.Server/_Shitcode/Wizard/Systems/SpellsSystem.cs index 3729219c3ac..da8d5693303 100644 --- a/Content.Server/_Shitcode/Wizard/Systems/SpellsSystem.cs +++ b/Content.Server/_Shitcode/Wizard/Systems/SpellsSystem.cs @@ -16,6 +16,7 @@ using Content.Server._Goobstation.Wizard.Components; using Content.Server.Abilities.Mime; using Content.Server.Antag; +using Content.Server.Body.Components; using Content.Server.Body.Systems; using Content.Server.Chat.Managers; using Content.Server.Chat.Systems; @@ -40,6 +41,7 @@ using Content.Shared._Goobstation.Wizard.SpellCards; using Content.Shared._Shitmed.Targeting; using Content.Shared._Shitmed.Damage; // Shitmed Change +using Content.Shared.Actions; using Content.Shared.Chat; using Content.Shared.Chemistry.Components; using Content.Shared.Coordinates.Helpers; @@ -72,10 +74,6 @@ using Robust.Shared.Utility; using Content.Shared.Actions.Components; using Content.Shared.Body.Components; -using Content.Shared.Construction.Components; -using Content.Shared.Friction; -using Content.Shared.Item; -using Content.Shared.Tag; namespace Content.Server._Goobstation.Wizard.Systems; @@ -99,8 +97,6 @@ public sealed class SpellsSystem : SharedSpellsSystem [Dependency] private readonly NpcFactionSystem _faction = default!; [Dependency] private readonly IPlayerManager _player = default!; [Dependency] private readonly TurfSystem _turf = default!; - [Dependency] private readonly SharedItemSystem _item = default!; - [Dependency] private readonly TileFrictionController _tileFriction = default!; public override void Initialize() { @@ -287,17 +283,16 @@ protected override void BindSoul(BindSoulEvent ev, EntityUid item, EntityUid min { base.BindSoul(ev, item, mind, mindComponent); - var oldEnt = ev.Performer; - var xform = Transform(oldEnt); - var meta = MetaData(oldEnt); + var xform = Transform(ev.Performer); + var meta = MetaData(ev.Performer); var mapId = xform.MapUid; var newEntity = Spawn(ev.Entity, - TransformSystem.GetMapCoordinates(oldEnt, xform), - rotation: TransformSystem.GetWorldRotation(oldEnt)); + TransformSystem.GetMapCoordinates(ev.Performer, xform), + rotation: TransformSystem.GetWorldRotation(ev.Performer)); - if (Container.TryGetContainingContainer((oldEnt, xform, meta), out var cont)) + if (Container.TryGetContainingContainer((ev.Performer, xform, meta), out var cont)) Container.Insert(newEntity, cont); var name = meta.EntityName; @@ -307,7 +302,7 @@ protected override void BindSoul(BindSoulEvent ev, EntityUid item, EntityUid min int? age = null; Gender? gender = null; Sex? sex = null; - if (TryComp(oldEnt, out HumanoidAppearanceComponent? humanoid)) + if (TryComp(ev.Performer, out HumanoidAppearanceComponent? humanoid)) { age = humanoid.Age; gender = humanoid.Gender; @@ -336,12 +331,7 @@ protected override void BindSoul(BindSoulEvent ev, EntityUid item, EntityUid min EnsureComp(newEntity); if (!Role.MindHasRole(mind, out _)) Role.MindAddRole(mind, WizardRuleSystem.Role.Id, mindComponent, true); - EnsureComp(item); - _item.SetSize(item, ev.PhylacterySize); - RemCompDeferred(item); - RemCompDeferred(item); - var soulBound = EntityManager.ComponentFactory.GetComponent(); soulBound.Name = name; soulBound.Item = item; @@ -351,24 +341,16 @@ protected override void BindSoul(BindSoulEvent ev, EntityUid item, EntityUid min soulBound.Sex = sex; AddComp(mind, soulBound, true); - _inventory.TransferEntityInventories(oldEnt, newEntity); - foreach (var hand in Hands.EnumerateHeld(oldEnt)) + _inventory.TransferEntityInventories(ev.Performer, newEntity); + foreach (var hand in Hands.EnumerateHeld(ev.Performer)) { - Hands.TryDrop(oldEnt, hand, checkActionBlocker: false); + Hands.TryDrop(ev.Performer, hand, checkActionBlocker: false); Hands.TryPickupAnyHand(newEntity, hand); } SetGear(newEntity, ev.Gear, false, false); - if (TryComp(ev.Action.Owner, out SpeakOnActionComponent? speak)) - { - DelayedSpeech(speak.Sentence == null ? null : Loc.GetString(speak.Sentence.Value), - newEntity, - oldEnt, - MagicSchool.Necromancy); - } - - Body.GibBody(oldEnt, contents: GibContentsOption.Gib); + Body.GibBody(ev.Performer, contents: GibContentsOption.Gib); if (!_player.TryGetSessionById(mindComponent.UserId, out var session)) return; @@ -403,14 +385,6 @@ protected override bool Polymorph(PolymorphSpellEvent ev) if (ev.LoadActions) RaiseNetworkEvent(new LoadActionsEvent(GetNetEntity(ev.Performer)), newEnt.Value); - if (TryComp(ev.Action.Owner, out SpeakOnActionComponent? speak)) - { - DelayedSpeech(speak.Sentence == null ? null : Loc.GetString(speak.Sentence.Value), - newEnt.Value, - ev.Performer, - school); - } - return true; } private void DelayedSpeech(string? speech, EntityUid speaker, EntityUid caster, MagicSchool school) @@ -418,6 +392,9 @@ private void DelayedSpeech(string? speech, EntityUid speaker, EntityUid caster, Timer.Spawn(200, () => { + if (!Exists(speaker) || !Exists(caster)) + return; + var toSpeak = speech == null ? string.Empty : Loc.GetString(speech); SpeakSpell(speaker, caster, toSpeak, school); }); @@ -427,7 +404,12 @@ protected override void ShootSpellCards(SpellCardsEvent ev, EntProtoId proto) { base.ShootSpellCards(ev, proto); - var targetMap = TransformSystem.ToMapCoordinates(ev.Target); + MapCoordinates targetMap; + + targetMap = TransformSystem.ToMapCoordinates(ev.Target); + + if (TryComp(ev.Entity, out TransformComponent? xform)) + targetMap = TransformSystem.GetMapCoordinates(ev.Entity.Value, xform); var (_, mapCoords, spawnCoords, velocity) = GetProjectileData(ev.Performer); @@ -455,7 +437,6 @@ protected override void ShootSpellCards(SpellCardsEvent ev, EntProtoId proto) false, body: physics); Physics.SetLinearDamping(newUid, physics, linearDamping, false); - _tileFriction.SetModifier(newUid, linearDamping); var spellCard = EnsureComp(newUid); if (!setHoming) @@ -597,51 +578,45 @@ public override void SpeakSpell(EntityUid speakerUid, EntityUid casterUid, strin { base.SpeakSpell(speakerUid, casterUid, speech, school); - if (!Exists(speakerUid)) - return; - - Color? color = null; + var postfix = string.Empty; - if (Exists(casterUid)) + var invocationEv = new GetSpellInvocationEvent(school, casterUid); + RaiseLocalEvent(casterUid, invocationEv); + if (invocationEv.Invocation != null) + speech = Loc.GetString(invocationEv.Invocation); + if (invocationEv.ToHeal.GetTotal() > FixedPoint2.Zero) { - var invocationEv = new GetSpellInvocationEvent(school, casterUid); - RaiseLocalEvent(casterUid, invocationEv); - if (invocationEv.Invocation != null) - speech = Loc.GetString(invocationEv.Invocation); - if (invocationEv.ToHeal.GetTotal() > FixedPoint2.Zero) + // Heal both caster and speaker + Damageable.TryChangeDamage(casterUid, + -invocationEv.ToHeal, + true, + false, + targetPart: TargetBodyPart.All, + splitDamage: SplitDamageBehavior.SplitEnsureAll); + + if (speakerUid != casterUid) { - // Heal both caster and speaker - Damageable.TryChangeDamage(casterUid, + Damageable.TryChangeDamage(speakerUid, -invocationEv.ToHeal, true, false, targetPart: TargetBodyPart.All, splitDamage: SplitDamageBehavior.SplitEnsureAll); - - if (speakerUid != casterUid) - { - Damageable.TryChangeDamage(speakerUid, - -invocationEv.ToHeal, - true, - false, - targetPart: TargetBodyPart.All, - splitDamage: SplitDamageBehavior.SplitEnsureAll); - } } + } - if (speakerUid != casterUid) - { - var colorEv = new GetMessageColorOverrideEvent(); - RaiseLocalEvent(casterUid, colorEv); - color = colorEv.Color; - } + if (speakerUid != casterUid) + { + var postfixEv = new GetMessagePostfixEvent(); + RaiseLocalEvent(casterUid, postfixEv); + postfix = postfixEv.Postfix; } _chat.TrySendInGameICMessage(speakerUid, speech, InGameICChatType.Speak, false, - colorOverride: color); + wrappedMessagePostfix: postfix); } protected override bool ChargeItem(EntityUid uid, ChargeMagicEvent ev) diff --git a/Content.Server/_White/Actions/ActionsSystem.cs b/Content.Server/_White/Actions/ActionsSystem.cs index 0d4ac23a17f..616a12e537a 100644 --- a/Content.Server/_White/Actions/ActionsSystem.cs +++ b/Content.Server/_White/Actions/ActionsSystem.cs @@ -1,10 +1,8 @@ using Content.Server.DoAfter; -using Content.Shared._White.Actions; using Content.Shared._White.Actions.Events; using Content.Shared.Construction.EntitySystems; using Content.Shared.Coordinates; using Content.Shared.DoAfter; -using Content.Goobstation.Maths.FixedPoint; using Robust.Server.Audio; using Robust.Server.Containers; using Robust.Server.GameObjects; @@ -24,7 +22,6 @@ public sealed class ActionsSystem : EntitySystem [Dependency] private readonly ContainerSystem _container = default!; [Dependency] private readonly DoAfterSystem _doAfter = default!; [Dependency] private readonly MapSystem _mapSystem = default!; - [Dependency] private readonly PlasmaCostActionSystem _plasmaCost = default!; // Goobstation= [Dependency] private readonly TransformSystem _transform = default!; public override void Initialize() @@ -46,11 +43,6 @@ private void OnPlaceTileEntityEvent(PlaceTileEntityEvent args) if (args.Handled) return; - // Check if this is a plasma-cost action and get the cost - // Goobstation - TryComp(args.Action, out var plasmaCost); - var plasmaCostValue = plasmaCost?.PlasmaCost ?? FixedPoint2.Zero; - if (args.Length != 0) { if (CheckTileBlocked(args.Target, args.BlockedCollisionLayer, args.BlockedCollisionMask)) @@ -63,18 +55,15 @@ private void OnPlaceTileEntityEvent(PlaceTileEntityEvent args) TileId = args.TileId, Audio = args.Audio, BlockedCollisionLayer = args.BlockedCollisionLayer, - BlockedCollisionMask = args.BlockedCollisionMask, // Goobstation start - PlasmaCost = plasmaCostValue, - Action = GetNetEntity(args.Action) // Goobstation end + BlockedCollisionMask = args.BlockedCollisionMask }; var doAfter = new DoAfterArgs(EntityManager, args.Performer, args.Length, ev, null) { BlockDuplicate = true, BreakOnDamage = true, - BreakOnMove = true, // Goobstation start - NeedHand = false, - CancelDuplicate = true, // Gooobstation end + CancelDuplicate = true, + BreakOnMove = true, Broadcast = true }; @@ -86,24 +75,9 @@ private void OnPlaceTileEntityEvent(PlaceTileEntityEvent args) args.Handled = true; } - /// Goobstation - /// - /// Handles the placement of a tile entity after the placement action is confirmed. - /// Verifies plasma cost and creates the tile if conditions are met. - /// - /// Event data containing placement details and cost private void OnPlaceTileEntityDoAfter(PlaceTileEntityDoAfterEvent args) { - if (args.Cancelled || args.Handled) - return; - - // Check plasma cost only when the action is about to complete - if (!_plasmaCost.HasEnoughPlasma(args.User, args.PlasmaCost)) - return; - - _plasmaCost.DeductPlasma(args.User, args.PlasmaCost); - - if (CreationTileEntity(args.User, GetCoordinates(args.Target), args.TileId, args.Entity, args.Audio, args.BlockedCollisionLayer, args.BlockedCollisionMask)) + if (!args.Handled && CreationTileEntity(args.User, GetCoordinates(args.Target), args.TileId, args.Entity, args.Audio, args.BlockedCollisionLayer, args.BlockedCollisionMask)) args.Handled = true; } diff --git a/Content.Server/_White/GameTicking/Rules/XenomorphsRuleSystem.cs b/Content.Server/_White/GameTicking/Rules/XenomorphsRuleSystem.cs index 31d9d427608..9356b1163e5 100644 --- a/Content.Server/_White/GameTicking/Rules/XenomorphsRuleSystem.cs +++ b/Content.Server/_White/GameTicking/Rules/XenomorphsRuleSystem.cs @@ -66,6 +66,7 @@ AfterAntagEntitySelectedEvent args return; component.Xenomorphs.Add(args.EntityUid); + component.AnnouncementTime ??= _timing.CurTime + _random.Next(component.MinTimeToAnnouncement, component.MaxTimeToAnnouncement); } private void OnXenomorphInit(EntityUid uid, XenomorphComponent component, ComponentInit args) @@ -224,17 +225,9 @@ float frameTime { base.ActiveTick(uid, component, gameRule, frameTime); - if (component.NextCheck > _timing.CurTime) + if (!component.AnnouncementTime.HasValue || component.NextCheck > _timing.CurTime) return; - if (!component.AnnouncementTime.HasValue) - { - var allQueens = GetXenomorphs(component, "Queen"); - if (allQueens.Count > 0) - { - component.AnnouncementTime ??= _timing.CurTime + _random.Next(component.MinTimeToAnnouncement, component.MaxTimeToAnnouncement); - } - } component.NextCheck = _timing.CurTime + component.CheckDelay; if (!component.Announced && component.AnnouncementTime <= _timing.CurTime) @@ -320,7 +313,7 @@ private List GetXenomorphs(XenomorphsRuleComponent xenomorphsRule, Pr { var xenomorphs = new List(); - foreach (var xenomorph in xenomorphsRule.Xenomorphs.ToList()) + foreach(var xenomorph in xenomorphsRule.Xenomorphs.ToList()) { if (!Exists(xenomorph) || !TryComp(xenomorph, out var xenomorphComponent)) { diff --git a/Content.Server/_White/Xenomorphs/Evolution/XenomorphEvolutionSystem.cs b/Content.Server/_White/Xenomorphs/Evolution/XenomorphEvolutionSystem.cs index c2555a6dc3f..786967ccebc 100644 --- a/Content.Server/_White/Xenomorphs/Evolution/XenomorphEvolutionSystem.cs +++ b/Content.Server/_White/Xenomorphs/Evolution/XenomorphEvolutionSystem.cs @@ -147,7 +147,8 @@ public bool Evolve(EntityUid uid, string? evolveTo, TimeSpan evolutionDelay, boo { if (evolveTo == null || !_protoManager.TryIndex(evolveTo, out var xenomorphPrototype) - || !xenomorphPrototype.TryGetComponent(out var xenomorph, _componentFactory)) // Goobstation + || !xenomorphPrototype.TryGetComponent(out var xenomorph, _componentFactory) + || !_mind.TryGetMind(uid, out _, out _)) return false; var ev = new BeforeXenomorphEvolutionEvent(xenomorph.Caste, checkNeedCasteDeath); diff --git a/Content.Server/_White/Xenomorphs/FaceHugger/FaceHuggerComponent.cs b/Content.Server/_White/Xenomorphs/FaceHugger/FaceHuggerComponent.cs index 711bab18e75..b1813ec0aa0 100644 --- a/Content.Server/_White/Xenomorphs/FaceHugger/FaceHuggerComponent.cs +++ b/Content.Server/_White/Xenomorphs/FaceHugger/FaceHuggerComponent.cs @@ -48,43 +48,8 @@ public sealed partial class FaceHuggerComponent : Component [DataField] public TimeSpan MinInfectTime = TimeSpan.FromSeconds(10); - // Goobstation start [DataField] - public string SleepChem = "AlienSedative"; - - [DataField] - public float SleepChemAmount = 10f; - - [DataField] - public TimeSpan InjectionInterval = TimeSpan.FromSeconds(5); // How often to inject chemicals - - [DataField] - public TimeSpan InitialInjectionDelay = TimeSpan.FromSeconds(5); // Delay before the first injection - - [ViewVariables] - public TimeSpan NextInjectionTime = TimeSpan.Zero; // Saves the time of the next injection - - [DataField] - public TimeSpan MinRestTime = TimeSpan.FromSeconds(3); // Must be less than MaxRestTime (makes facehugger jump randomly between max & min) - - [DataField] - public TimeSpan AttachAttemptDelay = TimeSpan.FromSeconds(5); - - [DataField] - public DamageSpecifier MaskBlockDamage = new() - { - DamageDict = new() - { - ["Slash"] = 5 - } - }; - - [DataField] - public SoundSpecifier MaskBlockSound = new SoundCollectionSpecifier("MetalThud"); - - [DataField] - public float MinChemicalThreshold = 0f; // Minimum amount of the chemical required to prevent additional injections - // Goobstation end + public TimeSpan MinRestTime = TimeSpan.FromSeconds(2); // Goobstation - 10 to 2. Facehuggers shouldn't take that long to recover. [ViewVariables] public bool Active = true; diff --git a/Content.Server/_White/Xenomorphs/FaceHugger/FaceHuggerSystem.cs b/Content.Server/_White/Xenomorphs/FaceHugger/FaceHuggerSystem.cs index 18010f50e33..e792dc3fcd6 100644 --- a/Content.Server/_White/Xenomorphs/FaceHugger/FaceHuggerSystem.cs +++ b/Content.Server/_White/Xenomorphs/FaceHugger/FaceHuggerSystem.cs @@ -8,6 +8,7 @@ using Content.Shared.Inventory; using Content.Shared.Inventory.Events; using Content.Shared.Mobs.Systems; +using Content.Shared.Nutrition.Components; using Content.Shared.StepTrigger.Systems; using Content.Shared.Weapons.Melee.Events; using Content.Shared.Whitelist; @@ -19,16 +20,6 @@ using Robust.Shared.Timing; using Robust.Shared.Utility; using Content.Shared._White.Xenomorphs.Infection; -using Content.Shared.Body.Components; // Goobstation start -using Content.Shared.Chemistry; -using Content.Shared.Chemistry.Components; -using Content.Shared.Chemistry.EntitySystems; -using Content.Shared.Chemistry.Reagent; -using Content.Goobstation.Maths.FixedPoint; -using Content.Shared._White.Xenomorphs.FaceHugger; -using Content.Shared.Mobs.Components; -using Content.Shared.Throwing; -using Content.Shared.Atmos.Components; // Goobstation end namespace Content.Server._White.Xenomorphs.FaceHugger; @@ -36,9 +27,6 @@ public sealed class FaceHuggerSystem : EntitySystem { [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly ReactiveSystem _reactiveSystem = default!; // Goobstation - [Dependency] private readonly SharedSolutionContainerSystem _solutions = default!; // Goobstation - [Dependency] private readonly SharedTransformSystem _transform = default!; // Goobstation [Dependency] private readonly AudioSystem _audio = default!; [Dependency] private readonly BodySystem _body = default!; @@ -59,12 +47,9 @@ public override void Initialize() SubscribeLocalEvent(OnMeleeHit); SubscribeLocalEvent(OnPickedUp); SubscribeLocalEvent(OnStepTriggered); + SubscribeLocalEvent(OnGotEquipped); SubscribeLocalEvent(OnBeingUnequippedAttempt); - - // Goobstation - Throwing behavior - SubscribeLocalEvent(OnThrowStarting); - SubscribeLocalEvent(OnThrowDoHit); } private void OnCollideEvent(EntityUid uid, FaceHuggerComponent component, StartCollideEvent args) @@ -93,11 +78,11 @@ private void OnGotEquipped(EntityUid uid, FaceHuggerComponent component, GotEqui || _mobState.IsDead(uid) || _entityWhitelist.IsBlacklistPass(component.Blacklist, args.Equipee)) return; + _popup.PopupEntity(Loc.GetString("xenomorphs-face-hugger-equip", ("equipment", uid)), uid, args.Equipee); _popup.PopupEntity(Loc.GetString("xenomorphs-face-hugger-equip-other", ("equipment", uid), ("target", Identity.Entity(args.Equipee, EntityManager))), uid, Filter.PvsExcept(args.Equipee), true); _stun.TryKnockdown(args.Equipee, component.KnockdownTime, true); - if (component.InfectionPrototype.HasValue) EnsureComp(args.Equipee); //Prevent suicide for infected @@ -134,32 +119,8 @@ public override void Update(float frameTime) Infect(uid, faceHugger); } - // Handle continuous chemical injection when equipped - // Goobstation - if (TryComp(uid, out var clothing) && clothing.InSlot != null) - { - // Initialize NextInjectionTime if it's zero - if (faceHugger.NextInjectionTime == TimeSpan.Zero) - { - faceHugger.NextInjectionTime = time + faceHugger.InitialInjectionDelay; - continue; - } - - if (time >= faceHugger.NextInjectionTime) - { - // Get the entity that has this item equipped - if (_container.TryGetContainingContainer(uid, out var container) && container.Owner != uid) - { - InjectChemicals(uid, faceHugger, container.Owner); - // Set the next injection time based on the current time plus interval - faceHugger.NextInjectionTime = time + faceHugger.InjectionInterval; - } - } - } - // Goobstaion end - // Check for nearby entities to latch onto - if (faceHugger.Active && clothing?.InSlot == null) + if (faceHugger.Active && (!TryComp(uid, out var clothing) || clothing.InSlot == null)) { foreach (var entity in _entityLookup.GetEntitiesInRange(Transform(uid).Coordinates, 1.5f)) { @@ -199,212 +160,34 @@ public bool TryEquipFaceHugger(EntityUid uid, EntityUid target, FaceHuggerCompon if (!component.Active || _mobState.IsDead(uid) || _entityWhitelist.IsBlacklistPass(component.Blacklist, target)) return false; - // Check for any blocking masks or equipment - // Goobstation start - if (CheckAndHandleMask(target, out var blocker)) - { - // If blocked by a breathable mask, deal damage and schedule a retry - if (blocker.HasValue && TryComp(blocker, out _)) - { - // Deal damage to the target - _damageable.TryChangeDamage(target, component.MaskBlockDamage); - - // Play the mask block sound - _audio.PlayPvs(component.MaskBlockSound, uid); - - // Show popup messages - _popup.PopupEntity( - Loc.GetString("xenomorphs-face-hugger-mask-blocked", - ("mask", blocker.Value), - ("facehugger", uid)), - target, target); - - _popup.PopupEntity( - Loc.GetString("xenomorphs-face-hugger-mask-blocked-other", - ("facehugger", uid), - ("target", target), - ("mask", blocker.Value)), - target, Filter.PvsExcept(target), true); - - // Schedule a retry after the delay - component.RestIn = _timing.CurTime + component.AttachAttemptDelay; - component.Active = false; - - // Drop the facehugger near you - _transform.SetCoordinates(uid, Transform(target).Coordinates.Offset(_random.NextVector2(0.5f))); - - return false; - } - - // Original behavior for other blockers - _audio.PlayPvs(component.SoundOnImpact, uid); - _damageable.TryChangeDamage(uid, component.DamageOnImpact); - _popup.PopupEntity( - Loc.GetString("xenomorphs-face-hugger-try-equip", - ("equipment", uid), - ("equipmentBlocker", blocker!.Value)), - uid); - - _popup.PopupEntity( - Loc.GetString("xenomorphs-face-hugger-try-equip-other", - ("equipment", uid), - ("equipmentBlocker", blocker.Value), - ("target", Identity.Entity(target, EntityManager))), - uid, Filter.PvsExcept(target), true); - - return false; - } - - // If we get here, no blockers were found, so proceed with equipping - // Set the rest time and deactivate - var restTime = _random.Next(component.MinRestTime, component.MaxRestTime); - component.RestIn = _timing.CurTime + restTime; + component.RestIn = _timing.CurTime + _random.Next(component.MinRestTime, component.MaxRestTime); component.Active = false; - return _inventory.TryEquip(target, uid, component.Slot, true, true); - } // Gooobstation end + EntityUid? blocker = null; - #region Injection Code - /// - /// Checks if the facehugger can inject chemicals into the target - /// Goobstation - /// - public bool CanInject(EntityUid uid, FaceHuggerComponent component, EntityUid target) - { - // Check if facehugger is properly equipped - if (!TryComp(uid, out var clothingComp) || clothingComp.InSlot == null) - { - if (!component.Active) - return false; - return true; - } + if (_inventory.TryGetSlotEntity(target, "head", out var headUid) + && TryComp(headUid, out var headBlocker) + && headBlocker.Enabled) + blocker = headUid; - // Check if target already has the sleep chemical - if (TryComp(target, out var bloodstream) && - _solutions.ResolveSolution(target, bloodstream.ChemicalSolutionName, ref bloodstream.ChemicalSolution, out var chemSolution) && - chemSolution.TryGetReagentQuantity(new ReagentId(component.SleepChem, null), out var quantity) && - quantity > FixedPoint2.New(component.MinChemicalThreshold)) + if (!blocker.HasValue && _inventory.TryGetSlotEntity(target, "mask", out var maskUid)) { - return false; - } - return true; - } - - /// - /// Creates a solution with the sleep chemical - /// - public Solution CreateSleepChemicalSolution(FaceHuggerComponent component, float amount) - { - var solution = new Solution(); - solution.AddReagent(component.SleepChem, amount); - return solution; - } - - /// - /// Attempts to inject the solution into the target's bloodstream - /// - public bool TryInjectIntoBloodstream(EntityUid target, Solution solution, string chemName, float chemAmount) - { - if (!TryComp(target, out var bloodstream)) - return false; - - if (!_solutions.TryGetSolution(target, bloodstream.ChemicalSolutionName, out var chemSolution, out _)) - return false; - - if (!_solutions.TryAddSolution(chemSolution.Value, solution)) - return false; - - Log.Debug($"[FaceHugger] Successfully injected {chemAmount}u of {chemName} into bloodstream"); - _reactiveSystem.DoEntityReaction(target, solution, ReactionMethod.Injection); - return true; - } - - /// - /// Main method to handle chemical injection - /// - public void InjectChemicals(EntityUid uid, FaceHuggerComponent component, EntityUid target) - { - if (!CanInject(uid, component, target)) - return; - - var sleepChem = CreateSleepChemicalSolution(component, component.SleepChemAmount); - TryInjectIntoBloodstream(target, sleepChem, component.SleepChem, component.SleepChemAmount); - } - #endregion - - #region Handle Face Masks - /// - /// Checks if the target has a breathable mask or any other blocking equipment. - /// Returns true if there's a blocker, false otherwise. - /// Goobstation - /// - private bool CheckAndHandleMask(EntityUid target, out EntityUid? blocker) - { - blocker = null; - - // Check for breathable mask - if (_inventory.TryGetSlotEntity(target, "mask", out var maskUid)) - { - // If the mask is a breath tool (gas mask) and is functional, block the facehugger - if (TryComp(maskUid, out var breathTool) && breathTool.IsFunctional) - { + if (TryComp(maskUid, out var maskBlocker) && maskBlocker.Enabled) blocker = maskUid; - return true; - } - // If it's just a regular mask, remove it else - { - _inventory.TryUnequip(target, "mask", true); - } + _inventory.TryUnequip(target, component.Slot, true); } - return false; - } - #endregion - - #region Throwing Behavior - - /// - /// Handles the start of a facehugger throw. - /// Marks the facehugger as being in flight to track its state. - /// Goobstation - /// - private void OnThrowStarting(EntityUid uid, ThrowableFacehuggerComponent component, ThrowAttemptEvent args) - { - // Mark the facehugger as flying to track its airborne state - component.IsFlying = true; - } - - /// - /// Handles the facehugger's collision with a target after being thrown. - /// Attempts to attach to a valid target if conditions are met. - /// - private void OnThrowDoHit(EntityUid uid, ThrowableFacehuggerComponent component, ref ThrowDoHitEvent args) - { - // Only process if the facehugger was actually thrown (not just dropped) - if (!component.IsFlying) - return; + if (!blocker.HasValue) + return _inventory.TryEquip(target, uid, component.Slot, true, true); - // Reset flying state as the throw has completed - component.IsFlying = false; + _audio.PlayPvs(component.SoundOnImpact, uid); - var target = args.Target; - - // Only proceed if the target is a valid living entity - if (!HasComp(target)) - return; + _damageable.TryChangeDamage(uid, component.DamageOnImpact); - // If this is a valid facehugger entity - if (TryComp(uid, out var faceHugger)) - { - // Check for blocking masks/equipment on the target - if (CheckAndHandleMask(target, out _)) - return; + _popup.PopupEntity(Loc.GetString("xenomorphs-face-hugger-try-equip", ("equipment", uid), ("equipmentBlocker", blocker.Value)), uid); + _popup.PopupEntity(Loc.GetString("xenomorphs-face-hugger-try-equip-other", ("equipment", uid), ("equipmentBlocker", blocker.Value), ("target", Identity.Entity(target, EntityManager))), uid, Filter.PvsExcept(target), true); - // Attempt to attach the facehugger to the target's face - TryEquipFaceHugger(uid, target, faceHugger); - } + return false; } - - #endregion } diff --git a/Content.Server/_White/Xenomorphs/Queen/XenomorphQueenSystem.cs b/Content.Server/_White/Xenomorphs/Queen/XenomorphQueenSystem.cs index c7a2b2c2d18..15a3a9e7a62 100644 --- a/Content.Server/_White/Xenomorphs/Queen/XenomorphQueenSystem.cs +++ b/Content.Server/_White/Xenomorphs/Queen/XenomorphQueenSystem.cs @@ -1,33 +1,34 @@ using Content.Server._White.Xenomorphs.Evolution; using Content.Server._White.Xenomorphs.Plasma; using Content.Server.Actions; -using Content.Server.Mind; +using Content.Server.Hands.Systems; using Content.Server.Popups; using Content.Shared._White.Actions; using Content.Shared._White.Xenomorphs; using Content.Shared._White.Xenomorphs.Queen; using Content.Shared._White.Xenomorphs.Xenomorph; -using Content.Shared.Mind.Components; -using Content.Shared.Popups; +using Content.Shared.Interaction; namespace Content.Server._White.Xenomorphs.Queen; public sealed class XenomorphQueenSystem : EntitySystem { [Dependency] private readonly ActionsSystem _actions = default!; + [Dependency] private readonly HandsSystem _hands = default!; [Dependency] private readonly PlasmaSystem _plasma = default!; [Dependency] private readonly PopupSystem _popup = default!; - [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly XenomorphEvolutionSystem _xenomorphEvolution = default!; - [Dependency] private readonly IEntityManager _entityManager = default!; + public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnPromotionAction); SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnPromotionAction); + + SubscribeLocalEvent(OnAfterInteract); } private void OnMapInit(EntityUid uid, XenomorphQueenComponent component, MapInitEvent args) => @@ -38,63 +39,56 @@ private void OnShutdown(EntityUid uid, XenomorphQueenComponent component, Compon private void OnPromotionAction(EntityUid uid, XenomorphQueenComponent component, PromotionActionEvent args) { - // Goobstation start - if (args.Target == EntityUid.Invalid || args.Target == args.Performer) - return; - - // Additional validation in case the target is no longer valid - if (!HasComp(args.Target)) + if (Exists(component.Promotion)) { - _popup.PopupEntity(Loc.GetString("xenomorphs-queen-promotion-invalid-target"), args.Performer); + QueueDel(component.Promotion); + component.Promotion = null; return; } - if (!TryComp(args.Target, out var xenomorph)) - return; + component.Promotion = Spawn(component.PromotionId); + var promotion = EnsureComp(component.Promotion.Value); + promotion.CasteWhitelist = component.CasteWhitelist; + promotion.PromoteTo = component.PromoteTo; + promotion.EvolutionDelay = component.EvolutionDelay; + + if (TryComp(component.PromotionAction, out var plasmaCostAction)) + promotion.PlasmaCost = plasmaCostAction.PlasmaCost; - // Check if target is already a Praetorian or not in the whitelist - if (xenomorph.Caste == "Praetorian" || !component.CasteWhitelist.Contains(xenomorph.Caste)) + if (!_hands.TryForcePickupAnyHand(uid, component.Promotion.Value)) { - if (xenomorph.Caste == "Praetorian") - _popup.PopupEntity(Loc.GetString("xenomorphs-queen-already-praetorian"), args.Performer); - else - _popup.PopupEntity(Loc.GetString("xenomorphs-queen-promotion-didnt-pass-whitelist"), args.Performer); + QueueDel(component.Promotion); + component.Promotion = null; return; } - // Try direct evolution with optional mind transfer - var target = args.Target; - var coordinates = Transform(target).Coordinates; - var newXeno = Spawn(component.PromoteTo, coordinates); + args.Handled = true; + } - // Transfer mind if it exists - if (_mind.TryGetMind(target, out var mindId, out var mind)) - _mind.TransferTo(mindId, newXeno, mind: mind); + private void OnAfterInteract(EntityUid uid, XenomorphPromotionComponent component, AfterInteractEvent args) + { + if (!args.CanReach + || args.Target is not { } target + || target == args.User + || !TryComp(target, out var xenomorph)) + return; - // Copy over any important components - if (TryComp(newXeno, out var newXenoComp) && - TryComp(target, out var oldXenoComp)) + if (!component.CasteWhitelist.Contains(xenomorph.Caste)) { - newXenoComp.Caste = oldXenoComp.Caste; + _popup.PopupEntity(Loc.GetString("xenomorphs-queen-promotion-didnt-pass-whitelist"), args.User); + return; } - // Update the caste to Praetorian for the new entity - if (TryComp(newXeno, out var xenomorphComp)) + if (!_xenomorphEvolution.Evolve(target, component.PromoteTo, component.EvolutionDelay)) { - xenomorphComp.Caste = "Praetorian"; - Dirty(newXeno, xenomorphComp); + _popup.PopupEntity(Loc.GetString("xenomorphs-queen-promotion-no-mind"), args.User); + return; } - // Get the target's name before deleting the entity - var targetName = Name(target); - - // Clean up the old entity - Del(target); + if (component.PlasmaCost != 0) + _plasma.ChangePlasmaAmount(args.User, component.PlasmaCost); - // Deduct plasma cost if applicable - _plasma.ChangePlasmaAmount(uid, -500f); // Deduct 500 plasma for the promotion - _popup.PopupEntity(Loc.GetString("xenomorphs-queen-promotion-success", ("target", targetName)), uid, uid); + QueueDel(uid); args.Handled = true; - // Goobstation end } } diff --git a/Content.Server/_White/Xenomorphs/Xenomorph/XenomorphSystem.cs b/Content.Server/_White/Xenomorphs/Xenomorph/XenomorphSystem.cs index c9a465f33f9..a9159e7ebc4 100644 --- a/Content.Server/_White/Xenomorphs/Xenomorph/XenomorphSystem.cs +++ b/Content.Server/_White/Xenomorphs/Xenomorph/XenomorphSystem.cs @@ -1,18 +1,11 @@ using System.Linq; -using Content.Goobstation.Maths.FixedPoint; using Content.Server._EinsteinEngines.Language; using Content.Server.Administration.Managers; -using Content.Server.Body.Components; -using Content.Server.Body.Systems; using Content.Server.Chat.Managers; using Content.Server.Chat.Systems; using Content.Shared._EinsteinEngines.Language; -using Content.Shared._Shitmed.Medical.Surgery.Traumas.Components; -using Content.Shared._Shitmed.Medical.Surgery.Wounds.Systems; using Content.Shared._White.Xenomorphs.Xenomorph; -using Content.Shared.Body.Components; using Content.Shared.Chat; -using Content.Shared.Chemistry.EntitySystems; using Content.Shared.Damage; using Robust.Shared.Network; using Robust.Shared.Player; @@ -29,9 +22,6 @@ public sealed class XenomorphSystem : SharedXenomorphSystem [Dependency] private readonly DamageableSystem _damageable = default!; [Dependency] private readonly LanguageSystem _language = default!; - [Dependency] private readonly WoundSystem _wounds = default!; // Goobstation - [Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!; // Goobstation - [Dependency] private readonly BodySystem _body = default!; // Goobstation public override void Initialize() { @@ -40,86 +30,23 @@ public override void Initialize() SubscribeLocalEvent(OnEntitySpoke); } -public override void Update(float frameTime) -{ - // Goobstation start - base.Update(frameTime); - - var time = _timing.CurTime; - var query = EntityQueryEnumerator(); // Added BodyComponent to query - - while (query.MoveNext(out var uid, out var xenomorph, out var bloodstream, out var body)) + public override void Update(float frameTime) { - if (xenomorph.WeedHeal == null || time < xenomorph.NextPointsAt) - continue; - - // Update next heal time - xenomorph.NextPointsAt = time + xenomorph.WeedHealRate; - - if (!xenomorph.OnWeed) - continue; - - // Apply regular weed healing if on weeds - _damageable.TryChangeDamage(uid, xenomorph.WeedHeal); - - // Process bleeding and blood loss in parallel with cached values - ProcessBleeding(uid, body); - ProcessBloodLoss(uid, bloodstream); - } -} - -// Heal/Seal any bleeding parts over time. -private void ProcessBleeding(EntityUid uid, BodyComponent body) -{ - const float bleedReduction = 0.5f; - var reduction = FixedPoint2.New(bleedReduction); + base.Update(frameTime); - // Get Bodyparts - var bodyParts = _body.GetBodyChildren(uid, body).ToList(); + var time = _timing.CurTime; - foreach (var part in bodyParts) - { - // Process all wounds in this part - foreach (var wound in _wounds.GetWoundableWounds(part.Id)) + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var xenomorph)) { - if (!TryComp(wound, out var bleedComp) || - !bleedComp.IsBleeding || - bleedComp.BleedingAmountRaw <= FixedPoint2.Zero) - { + if (xenomorph.WeedHeal == null || !xenomorph.OnWeed || time < xenomorph.NextPointsAt) continue; - } - - // Calculate new bleed amount - var newBleed = FixedPoint2.Max(FixedPoint2.Zero, bleedComp.BleedingAmountRaw - reduction); - var amountHealed = bleedComp.BleedingAmountRaw - newBleed; - if (amountHealed <= FixedPoint2.Zero) - continue; + xenomorph.NextPointsAt = time + xenomorph.WeedHealRate; - // Apply changes - bleedComp.BleedingAmountRaw = newBleed; - Dirty(wound, bleedComp); + _damageable.TryChangeDamage(uid, xenomorph.WeedHeal); } } -} - -// Slowly heal bloodloss -private void ProcessBloodLoss(EntityUid uid, BloodstreamComponent bloodstream) -{ - if (!_solutionContainer.ResolveSolution(uid, - bloodstream.BloodSolutionName, - ref bloodstream.BloodSolution, - out var bloodSolution) - || bloodSolution.Volume >= bloodstream.BloodMaxVolume) - { - return; - } - - var bloodloss = new DamageSpecifier(); - bloodloss.DamageDict["Bloodloss"] = -0.2f; // Heal blood per tick - _damageable.TryChangeDamage(uid, bloodloss); -} -// Goobstation end private void OnEntitySpoke(EntityUid uid, XenomorphComponent component, EntitySpokeEvent args) { diff --git a/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs b/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs index f0477a59285..5f76deff00c 100644 --- a/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs +++ b/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs @@ -562,10 +562,7 @@ public List GetEntityBloodData(EntityUid uid) var dnaData = new DnaData(); if (TryComp(uid, out var donorComp) && donorComp.DNA != null) - { dnaData.DNA = donorComp.DNA; - dnaData.Freshness = _timing.CurTime; // Goobstation - } else dnaData.DNA = Loc.GetString("forensics-dna-unknown"); diff --git a/Content.Shared/Clothing/Components/ClothingComponent.cs b/Content.Shared/Clothing/Components/ClothingComponent.cs index 5c6b9c844ad..18da67d9795 100644 --- a/Content.Shared/Clothing/Components/ClothingComponent.cs +++ b/Content.Shared/Clothing/Components/ClothingComponent.cs @@ -38,7 +38,7 @@ namespace Content.Shared.Clothing.Components; //[Access(typeof(ClothingSystem), typeof(InventorySystem))] - Fuck yo access - Goob public sealed partial class ClothingComponent : Component { - [DataField, AutoNetworkedField] // Omustation - autonetwork ClothingVisuals so that the eye colour of a cybernetic mantle is the same across clients + [DataField] public Dictionary> ClothingVisuals = new(); /// diff --git a/Content.Shared/Devour/DevourSystem.cs b/Content.Shared/Devour/DevourSystem.cs index afe63b552a5..71b1bd6396f 100644 --- a/Content.Shared/Devour/DevourSystem.cs +++ b/Content.Shared/Devour/DevourSystem.cs @@ -1,4 +1,3 @@ -using Content.Goobstation.Common.Devour; using Content.Shared.Actions; using Content.Shared.Body.Events; using Content.Shared.Body.Systems; @@ -116,14 +115,6 @@ private void OnDoAfter(Entity ent, ref DevourDoAfterEvent arg if (args.Args.Target != null && _whitelistSystem.IsWhitelistPass(ent.Comp.StomachStorageWhitelist, (EntityUid)args.Args.Target)) { _containerSystem.Insert(args.Args.Target.Value, ent.Comp.Stomach); - - // Goobstation start - - if (HasComp(args.Args.Target.Value)) // can be cases where objects are also whitelisted, which wont need this - EnsureComp(args.Args.Target.Value); - - // Goobstation end - } //TODO: Figure out a better way of removing structures via devour that still entails standing still and waiting for a DoAfter. Somehow. //If it's not alive, it must be a structure. @@ -141,13 +132,6 @@ private void OnGibContents(Entity ent, ref BeingGibbedEvent a if (ent.Comp.StomachStorageWhitelist == null) return; - // Goobstation start - - foreach (var entity in ent.Comp.Stomach.ContainedEntities) - RemComp(entity); - - // Goobstation end - // For some reason we have two different systems that should handle gibbing, // and for some another reason GibbingSystem, which should empty all containers, doesn't get involved in this process _containerSystem.EmptyContainer(ent.Comp.Stomach); diff --git a/Content.Shared/Flash/SharedFlashSystem.cs b/Content.Shared/Flash/SharedFlashSystem.cs index cac1677ac75..a508f6f239c 100644 --- a/Content.Shared/Flash/SharedFlashSystem.cs +++ b/Content.Shared/Flash/SharedFlashSystem.cs @@ -37,7 +37,6 @@ using Robust.Shared.Timing; using System.Linq; using Content.Goobstation.Common.Flash; -using Content.Shared.Mobs.Components; // Goobstation namespace Content.Shared.Flash; @@ -55,7 +54,6 @@ public abstract class SharedFlashSystem : EntitySystem [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly UseDelaySystem _useDelay = default!; - [Dependency] private readonly IRobustRandom _random = default!; // Omu - Required for funkyrevs private EntityQuery _statusEffectsQuery; private EntityQuery _damagedByFlashingQuery; @@ -171,8 +169,7 @@ public void Flash( float slowTo, bool displayPopup = true, bool melee = false, - TimeSpan? stunDuration = null, - bool revFlash = false) // funkystation // Moved to shared to keep up with upstream - Omu + TimeSpan? stunDuration = null) { // Goob edit start if (used == null @@ -208,17 +205,13 @@ public void Flash( ("user", Identity.Entity(user.Value, EntityManager))), target, target); } - if (melee || revFlash) // funkystation start - { - var ev = new AfterFlashedEvent(target, user, used, melee); - RaiseLocalEvent(target, ref ev); - - if (user != null) - RaiseLocalEvent(user.Value, ref ev); - if (used != null) - RaiseLocalEvent(used.Value, ref ev); + var ev = new AfterFlashedEvent(target, user, used, melee); + RaiseLocalEvent(target, ref ev); - } // funkystation end + if (user != null) + RaiseLocalEvent(user.Value, ref ev); + if (used != null) + RaiseLocalEvent(used.Value, ref ev); } /// @@ -263,36 +256,6 @@ public void FlashArea(EntityUid source, EntityUid? user, float range, TimeSpan f _audio.PlayPredicted(sound, source, user, AudioParams.Default.WithVolume(1f).WithMaxDistance(3f)); } - // funkystation start: copy and paste of above, cry about it // Moved to shared to keep up with upstream - Omu - public void RevolutionaryFlashArea(Entity source, EntityUid? user, float range, TimeSpan flashDuration, float slowTo = 0.8f, bool displayPopup = false, float probability = 1f, SoundSpecifier? sound = null) // Omu float duration -> TimeSpan flashDuration - { - var transform = Transform(source); - var mapPosition = _transform.GetMapCoordinates(transform); - var statusEffectsQuery = GetEntityQuery(); - var damagedByFlashingQuery = GetEntityQuery(); - - foreach (var entity in _entityLookup.GetEntitiesInRange(transform.Coordinates, range)) - { - if (!_random.Prob(probability)) - continue; - - // Is the entity affected by the flash either through status effects or by taking damage? - if (!statusEffectsQuery.HasComponent(entity) && !damagedByFlashingQuery.HasComponent(entity)) - continue; - - // Check for entites in view - // put damagedByFlashingComponent in the predicate because shadow anomalies block vision. - if (!_examine.InRangeUnOccluded(entity, mapPosition, range, predicate: (e) => damagedByFlashingQuery.HasComponent(e))) - continue; - - // They shouldn't have flash removed in between right? - Flash(entity, user, source, flashDuration, slowTo, displayPopup, true, null, true); //Omu see above - - } - - _audio.PlayPvs(sound, source, AudioParams.Default.WithVolume(1f).WithMaxDistance(3f)); - } // funkystation end - // Handle the flash visuals // TODO: Replace this with something like sprite flick once that exists to get rid of the update loop. public override void Update(float frameTime) @@ -332,9 +295,6 @@ private void OnFlashImmunityFlashAttempt(Entity ent, ref private void OnExamine(Entity ent, ref ExaminedEvent args) { - if (HasComp(args.Examined)) // Goobstation - dont add exmained value to mobs whit flash protection - return; - args.PushMarkup(Loc.GetString("flash-protection")); } } diff --git a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.cs b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.cs index 4f897f99784..85c717afc5e 100644 --- a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.cs +++ b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.cs @@ -466,9 +466,6 @@ public int CountFreeableHands(Entity hands, bool excludeActiveHa var freeable = 0; foreach (var name in hands.Comp.Hands.Keys) { - if (excludeActiveHand && hands.Comp.ActiveHandId != null && name == hands.Comp.ActiveHandId) - continue; - if (HandIsEmpty(hands.AsNullable(), name) || CanDropHeld(hands, name)) freeable++; } @@ -495,4 +492,4 @@ public virtual void AddToSortedHands(HandsComponent handsComp, string handName, handsComp.SortedHands.Insert(index, handName); } -} +} \ No newline at end of file diff --git a/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs b/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs index f47d299103d..882704d965e 100644 --- a/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs +++ b/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs @@ -161,13 +161,13 @@ public bool TrySpawnVirtualItemInHand(EntityUid blockingEnt, EntityUid user, [No /// Scan the user's hands until we find the virtual entity, if the /// virtual entity is a copy of the matching entity, delete it /// - public void DeleteInHandsMatching(EntityUid user, EntityUid matching, bool queueDel = true) // Goob edit + public void DeleteInHandsMatching(EntityUid user, EntityUid matching) { foreach (var held in _handsSystem.EnumerateHeld(user)) { if (TryComp(held, out VirtualItemComponent? virt) && virt.BlockingEntity == matching) { - DeleteVirtualItem((held, virt), user, queueDel); // Goob edit + DeleteVirtualItem((held, virt), user); } } } @@ -251,7 +251,7 @@ public bool TrySpawnVirtualItem(EntityUid blockingEnt, EntityUid user, [NotNullW /// /// Queues a deletion for a virtual item and notifies the blocking entity and user. /// - public void DeleteVirtualItem(Entity item, EntityUid user, bool queueDel = true) // Goob edit + public void DeleteVirtualItem(Entity item, EntityUid user) { var userEv = new VirtualItemDeletedEvent(item.Comp.BlockingEntity, user, item.Owner); // Goobstation RaiseLocalEvent(user, userEv); @@ -262,11 +262,6 @@ public void DeleteVirtualItem(Entity item, EntityUid user, if (TerminatingOrDeleted(item)) return; - // Goob edit start - if (queueDel) - PredictedQueueDel(item.Owner); - else - PredictedDel(item.Owner); - // Goob edit end + PredictedQueueDel(item.Owner); } -} +} \ No newline at end of file diff --git a/Content.Shared/Medical/Healing/HealingSystem.cs b/Content.Shared/Medical/Healing/HealingSystem.cs index c13dd843510..163c64c2359 100644 --- a/Content.Shared/Medical/Healing/HealingSystem.cs +++ b/Content.Shared/Medical/Healing/HealingSystem.cs @@ -80,7 +80,6 @@ using Robust.Shared.Prototypes; using Robust.Shared.Utility; using System.Linq; -using Robust.Shared.Network; namespace Content.Shared.Medical.Healing; @@ -104,9 +103,6 @@ public sealed class HealingSystem : EntitySystem [Dependency] private readonly TraumaSystem _trauma = default!; [Dependency] private readonly WoundSystem _wounds = default!; - // Goobstation edit - [Dependency] private readonly INetManager _net = default!; - public override void Initialize() { base.Initialize(); @@ -242,44 +238,24 @@ private bool HasDamage(Entity healing, Entity (from @group in _prototypes.EnumeratePrototypes() where @group.DamageTypes.Contains(id) select @group.ID).FirstOrDefault(); - - // Goobstation start - /// - /// Method IsBodyDamaged returns if a body part can be healed by the healing component. Returns false part is fully healed too. - /// - /// the target Entity - /// The person trying to heal. (optional) - /// The healing component. - /// bypasses targeting system to specify a limb. Must be set if user is null. (optional) - /// Wether or not the targeted part can be healed. - public bool IsBodyDamaged(Entity target, EntityUid? user, HealingComponent healing, EntityUid? targetedPart = null) // Goob edit: private => public, used in RepairableSystems.cs + private bool IsBodyDamaged(Entity target, EntityUid user, HealingComponent healing) { - if (user is null && targetedPart is null) // no limb can be targeted at all + if (!TryComp(user, out var targeting)) return false; - if (user is not null) - { - if (!TryComp(user, out var targeting)) - return false; - - var (partType, symmetry) = _bodySystem.ConvertTargetBodyPart(targeting.Target); - var targetedBodyPart = _bodySystem.GetBodyChildrenOfType(target, partType, target, symmetry).ToList().FirstOrNull(); - - if (targetedBodyPart is not null && targetedPart is null) - targetedPart = targetedBodyPart.Value.Id; - } + var (partType, symmetry) = _bodySystem.ConvertTargetBodyPart(targeting.Target); + var targetedBodyPart = _bodySystem.GetBodyChildrenOfType(target, partType, target, symmetry).ToList().FirstOrNull(); - if (targetedPart == null - || !TryComp(targetedPart, out DamageableComponent? damageable)) + if (targetedBodyPart == null + || !TryComp(targetedBodyPart.Value.Id, out DamageableComponent? damageable)) { - if (user is not null) - _popupSystem.PopupPredicted(Loc.GetString("missing-body-part"), target, user.Value, PopupType.MediumCaution); + _popupSystem.PopupPredicted(Loc.GetString("missing-body-part"), target, user, PopupType.MediumCaution); return false; } if (healing.Damage.DamageDict.Keys .Any(damageKey => _wounds.GetWoundableSeverityPoint( - targetedPart.Value, + targetedBodyPart.Value.Id, damageGroup: GetDamageGroupByType(damageKey), healable: true) > 0 || damageable.Damage.DamageDict[damageKey].Value > 0)) return true; @@ -287,35 +263,14 @@ public bool IsBodyDamaged(Entity target, EntityUid? user, Healing if (healing.BloodlossModifier == 0) return false; - foreach (var wound in _wounds.GetWoundableWounds(targetedPart.Value)) + foreach (var wound in _wounds.GetWoundableWounds(targetedBodyPart.Value.Id)) { if (!TryComp(wound, out var bleeds) || !bleeds.IsBleeding) continue; return true; } - // Goobstation end - - return false; - } - - /// - /// This function tries to return the first limb that has one of the damage type we are trying to heal - /// Returns true or false if next damaged part exists. - /// - public bool TryGetNextDamagedPart(EntityUid ent, HealingComponent healing, out EntityUid? part) // Goob edit: private => public, used in RepairableSystems.cs - { - part = null; - if (!TryComp(ent, out var body)) - return false; - var parts = _bodySystem.GetBodyChildren(ent, body).ToArray(); - foreach (var limb in parts) - { - part = limb.Id; - if (IsBodyDamaged((ent, body), null, healing, limb.Id)) - return true; - } return false; } @@ -337,12 +292,6 @@ private void OnBodyDoAfter(EntityUid ent, BodyComponent comp, ref HealingDoAfter targetedWoundable = targetedBodyPart.Id; } - // Goobstation start - if (!IsBodyDamaged((ent, comp), null, healing, targetedWoundable)) // Check if there is anything to heal on the initial limb target - if (TryGetNextDamagedPart(ent, healing, out var limbTemp) && limbTemp is not null) // If not then get the next limb to heal - targetedWoundable = limbTemp.Value; - // Goobstation end - if (targetedWoundable == EntityUid.Invalid) { _popupSystem.PopupPredicted( @@ -373,6 +322,7 @@ private void OnBodyDoAfter(EntityUid ent, BodyComponent comp, ref HealingDoAfter : Loc.GetString("rebell-medical-item-stop-bleeding-partially"), ent, args.User); + } if (healing.ModifyBloodLevel != 0) @@ -393,7 +343,7 @@ private void OnBodyDoAfter(EntityUid ent, BodyComponent comp, ref HealingDoAfter if (canHeal) { - var damageChanged = _damageable.TryChangeDamage(targetedWoundable, healing.Damage * _damageable.UniversalTopicalsHealModifier, true, origin: args.User); // GOOBEDIT + var damageChanged = _damageable.TryChangeDamage(ent, healing.Damage * _damageable.UniversalTopicalsHealModifier, true, origin: args.User); if (damageChanged is not null) healedTotal += -damageChanged.GetTotal(); @@ -402,6 +352,7 @@ private void OnBodyDoAfter(EntityUid ent, BodyComponent comp, ref HealingDoAfter { if (healing.BloodlossModifier == 0 && woundableComp.Bleeds > 0) // If the healing item has no bleeding heals, and its bleeding, we raise the alert. _popupSystem.PopupPredicted(Loc.GetString("medical-item-cant-use-rebell", ("target", ent)), ent, args.User); + return; } } @@ -430,10 +381,10 @@ private void OnBodyDoAfter(EntityUid ent, BodyComponent comp, ref HealingDoAfter $"{EntityManager.ToPrettyString(args.User):user} healed themselves for {healedTotal:damage} damage"); } - _audio.PlayPredicted(healing.HealingEndSound, ent, ent, AudioParams.Default.WithVariation(0.125f).WithVolume(1f)); // Goob edit + _audio.PlayPvs(healing.HealingEndSound, ent, AudioParams.Default.WithVariation(0.125f).WithVolume(1f)); // Logic to determine whether or not to repeat the healing action - args.Repeat = IsAnythingToHeal(args.User, ent, (args.Used.Value, healing)); // GOOBEDIT + args.Repeat = IsBodyDamaged((ent, comp), args.User, healing); args.Handled = true; if (args.Repeat || dontRepeat) @@ -462,22 +413,6 @@ private void OnHealingAfterInteract(Entity healing, ref AfterI args.Handled = true; } - // Goobstation start - private bool IsAnythingToHeal(EntityUid user, EntityUid target, Entity healing) - { - if (!TryComp(target, out var targetDamage)) - return false; - - return HasDamage(healing, (target, targetDamage)) || - TryComp(target, out var bodyComp) && // I'm paranoid, sorry. - IsBodyDamaged((target, bodyComp), user, healing.Comp) || - healing.Comp.ModifyBloodLevel > 0 // Special case if healing item can restore lost blood... - && TryComp(target, out var bloodstream) - && _solutionContainerSystem.ResolveSolution(target, bloodstream.BloodSolutionName, ref bloodstream.BloodSolution, out var bloodSolution) - && bloodSolution.Volume < bloodSolution.MaxVolume; - } - // Goobstation end - private bool TryHeal(Entity healing, Entity target, EntityUid user) { if (!Resolve(target, ref target.Comp, false)) diff --git a/Content.Shared/Repairable/RepairableSystem.cs b/Content.Shared/Repairable/RepairableSystem.cs index dd32e0bbe41..7a0f01b9b66 100644 --- a/Content.Shared/Repairable/RepairableSystem.cs +++ b/Content.Shared/Repairable/RepairableSystem.cs @@ -1,19 +1,11 @@ -using Content.Shared._Shitmed.Targeting; using Content.Shared.Administration.Logs; -using Content.Shared.Body.Components; using Content.Shared.Damage; using Content.Shared.Database; using Content.Shared.DoAfter; using Content.Shared.Interaction; using Content.Shared.Popups; using Content.Shared.Tools.Systems; -using Content.Shared.Body.Systems; using Robust.Shared.Serialization; -using System.Linq; -using Content.Shared.Medical.Healing; -using Content.Shared._Shitmed.Medical.Surgery.Wounds.Components; -using Content.Shared._Shitmed.Medical.Surgery.Wounds.Systems; -using Content.Goobstation.Maths.FixedPoint; namespace Content.Shared.Repairable; @@ -23,9 +15,6 @@ public sealed partial class RepairableSystem : EntitySystem [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; - [Dependency] private readonly SharedBodySystem _bodySystem = default!; // Goob edit - [Dependency] private readonly HealingSystem _healingSystem = default!; // Goob edit - [Dependency] private readonly WoundSystem _wounds = default!; // Goob edit public override void Initialize() { @@ -33,100 +22,26 @@ public override void Initialize() SubscribeLocalEvent(OnRepairFinished); } - // Goob edit start - /// - /// Method ApplyRepairs Applies repair according to "RepairableComponent" present on entity. Returns false if fail or nothing else to repair. - /// - /// the target Entity - /// The entity trying to repair - /// Wether or not there is something else to repair. If fails, returns false too - public bool ApplyRepairs(Entity ent, EntityUid user) + private void OnRepairFinished(Entity ent, ref RepairFinishedEvent args) { - if (!TryComp(ent.Owner, out DamageableComponent? damageable) || damageable.TotalDamage == 0) - return false; + if (args.Cancelled) + return; - if (user == ent.Owner) - if (!ent.Comp.AllowSelfRepair) - return false; + if (!TryComp(ent.Owner, out DamageableComponent? damageable) || damageable.TotalDamage == 0) + return; - if (TryComp(ent.Owner, out var body) && ent.Comp.Damage != null && body != null) // repair entities with bodies - { - // here we create a fake healing comp - HealingComponent repairHealing = new HealingComponent(); - repairHealing.Damage = ent.Comp.Damage; - repairHealing.BloodlossModifier = -100; - - var targetedWoundable = EntityUid.Invalid; - if (TryComp(user, out var targeting)) - { - var (partType, symmetry) = _bodySystem.ConvertTargetBodyPart(targeting.Target); - var targetedBodyPart = _bodySystem.GetBodyChildrenOfType(ent, partType, body, symmetry).ToList().FirstOrDefault(); - targetedWoundable = targetedBodyPart.Id; - } - else - { - if (_healingSystem.TryGetNextDamagedPart(ent, repairHealing, out var limbTemp) && limbTemp is not null) - targetedWoundable = limbTemp.Value; - } - - if (!TryComp(targetedWoundable, out var damageableComp)) - return false; - - if (!_healingSystem.IsBodyDamaged((ent.Owner, body), null, repairHealing, targetedWoundable)) // Check if there is anything to heal on the initial limb target - if (_healingSystem.TryGetNextDamagedPart(ent, repairHealing, out var limbTemp) && limbTemp is not null) // If not then get the next limb to heal - targetedWoundable = limbTemp.Value; - - // Welding removes all bleeding instantly. IPC don't even have blood as i'm writing this so makes 0 sense for them to have bleeds. - if (TryComp(targetedWoundable, out var woundableComp)) - { - bool healedBleedWound = false; - FixedPoint2 modifiedBleedStopAbility = 0; - healedBleedWound = _wounds.TryHealBleedingWounds(targetedWoundable, repairHealing.BloodlossModifier, out modifiedBleedStopAbility, woundableComp); - if (healedBleedWound) - _popup.PopupPredicted(modifiedBleedStopAbility > 0 - ? Loc.GetString("rebell-medical-item-stop-bleeding-fully") - : Loc.GetString("rebell-medical-item-stop-bleeding-partially"), - ent, - user); - } - - var damageChanged = _damageableSystem.TryChangeDamage(targetedWoundable, ent.Comp.Damage, true, false, origin: user); - _adminLogger.Add(LogType.Healed, $"{ToPrettyString(user):user} repaired {ToPrettyString(ent.Owner):target} by {damageChanged?.GetTotal()}"); - - if (_healingSystem.TryGetNextDamagedPart(ent.Owner, repairHealing, out var _)) - return true; - } - else if (ent.Comp.Damage != null) + if (ent.Comp.Damage != null) { - var damageChanged = _damageableSystem.TryChangeDamage(ent.Owner, ent.Comp.Damage, true, false, origin: user); - _adminLogger.Add(LogType.Healed, $"{ToPrettyString(user):user} repaired {ToPrettyString(ent.Owner):target} by {damageChanged?.GetTotal()}"); + var damageChanged = _damageableSystem.TryChangeDamage(ent.Owner, ent.Comp.Damage, true, false, origin: args.User); + _adminLogger.Add(LogType.Healed, $"{ToPrettyString(args.User):user} repaired {ToPrettyString(ent.Owner):target} by {damageChanged?.GetTotal()}"); } + else { // Repair all damage _damageableSystem.SetAllDamage(ent.Owner, damageable, 0); - _adminLogger.Add(LogType.Healed, $"{ToPrettyString(user):user} repaired {ToPrettyString(ent.Owner):target} back to full health"); + _adminLogger.Add(LogType.Healed, $"{ToPrettyString(args.User):user} repaired {ToPrettyString(ent.Owner):target} back to full health"); } - return false; - } // Goob edit end - - private void OnRepairFinished(Entity ent, ref RepairFinishedEvent args) - { - if (args.Cancelled) - return; - // Goob edit start - bool repairStatus = ApplyRepairs(ent, args.User); - - if (repairStatus && HasComp(ent) && args.Used != null) - { - float delay = ent.Comp.DoAfterDelay; - if (args.User == ent.Owner) - { - delay *= ent.Comp.SelfRepairPenalty; - } - args.Handled = _toolSystem.UseTool(args.Used.Value, args.User, ent.Owner, delay, ent.Comp.QualityNeeded, new RepairFinishedEvent(), ent.Comp.FuelCost); // args.Repeat doesn't work because this current event is a wrapped event of ToolDoAfterEvent - } - // Goob edit end var str = Loc.GetString("comp-repairable-repair", ("target", ent.Owner), ("tool", args.Used!)); _popup.PopupClient(str, ent.Owner, args.User); @@ -144,16 +59,6 @@ private void Repair(Entity ent, ref InteractUsingEvent args if (!TryComp(ent.Owner, out var damageable) || damageable.TotalDamage == 0) return; - // If there is nothign to heal on a body, dont try it. - if (TryComp(ent.Owner, out var bodyComp) && ent.Comp.Damage != null) // Goob Edit Start - { - HealingComponent repairHealing = new HealingComponent(); - repairHealing.Damage = ent.Comp.Damage; - repairHealing.BloodlossModifier = -100; - if (!_healingSystem.TryGetNextDamagedPart(ent.Owner, repairHealing, out var _)) - return; - } // Goob Edit End - float delay = ent.Comp.DoAfterDelay; // Add a penalty to how long it takes if the user is repairing itself diff --git a/Content.Shared/Revolutionary/Components/HeadRevolutionaryComponent.cs b/Content.Shared/Revolutionary/Components/HeadRevolutionaryComponent.cs index 4fd3db2db1f..40b012b5037 100644 --- a/Content.Shared/Revolutionary/Components/HeadRevolutionaryComponent.cs +++ b/Content.Shared/Revolutionary/Components/HeadRevolutionaryComponent.cs @@ -78,6 +78,7 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later +using Content.Shared._EinsteinEngines.Language; // Goob Station - Revolutionary Language using Robust.Shared.GameStates; using Content.Shared.StatusIcon; using Robust.Shared.Prototypes; @@ -96,21 +97,18 @@ public sealed partial class HeadRevolutionaryComponent : Component [DataField, ViewVariables(VVAccess.ReadWrite)] public ProtoId StatusIcon { get; set; } = "HeadRevolutionaryFaction"; - /// Funky Station - /// - /// Abilities the head revolutionaries start with. - /// - public readonly List> BaseHeadRevActions = new() - { - "ActionDeclareOpenRevolt", - }; - /// /// How long the stun will last after the user is converted. /// [DataField, ViewVariables(VVAccess.ReadWrite)] public TimeSpan StunTime = TimeSpan.FromSeconds(3); + /// + /// The language revolutionaries can speak + /// + [DataField, ViewVariables(VVAccess.ReadOnly)] // Goob Station - Revolutionary Language + public ProtoId Language { get; set; } = "Revolutionary"; // Goob Station - Revolutionary Language + public override bool SessionSpecific => true; //Goobstation @@ -119,11 +117,4 @@ public sealed partial class HeadRevolutionaryComponent : Component /// [DataField] public bool ConvertAbilityEnabled = true; - - //Funky Station - /// - /// If head rev's convert ability distributes the ability to see other Revs. - /// - [DataField] - public bool ConvertGivesRevVision = false; } diff --git a/Content.Shared/Revolutionary/Components/RevolutionaryComponent.cs b/Content.Shared/Revolutionary/Components/RevolutionaryComponent.cs index 063a2a0e65d..26e02f6f64e 100644 --- a/Content.Shared/Revolutionary/Components/RevolutionaryComponent.cs +++ b/Content.Shared/Revolutionary/Components/RevolutionaryComponent.cs @@ -80,6 +80,7 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later +using Content.Shared._EinsteinEngines.Language; // Goob Station - Revolutionary Language using Robust.Shared.GameStates; using Content.Shared.StatusIcon; using Robust.Shared.Prototypes; @@ -99,6 +100,12 @@ public sealed partial class RevolutionaryComponent : Component [DataField, ViewVariables(VVAccess.ReadWrite)] public ProtoId StatusIcon { get; set; } = "RevolutionaryFaction"; + /// + /// The language revolutionaries can speak + /// + [DataField, ViewVariables(VVAccess.ReadOnly)] // Goob Station - Revolutionary Language + public ProtoId Language { get; set; } = "Revolutionary"; // Goob Station - Revolutionary Language + /// /// Sound that plays when you are chosen as Rev. (Placeholder until I find something cool I guess) /// @@ -106,4 +113,4 @@ public sealed partial class RevolutionaryComponent : Component public SoundSpecifier RevStartSound = new SoundPathSpecifier("/Audio/_Goobstation/Ambience/Antag/rev_start.ogg"); // Goobstation - custom rev sfx public override bool SessionSpecific => true; -} \ No newline at end of file +} diff --git a/Content.Shared/Revolutionary/SharedRevolutionarySystem.cs b/Content.Shared/Revolutionary/SharedRevolutionarySystem.cs index 7533d1c5bab..3740db8fc24 100644 --- a/Content.Shared/Revolutionary/SharedRevolutionarySystem.cs +++ b/Content.Shared/Revolutionary/SharedRevolutionarySystem.cs @@ -11,12 +11,10 @@ // SPDX-License-Identifier: AGPL-3.0-or-later using Content.Shared.IdentityManagement; -using Content.Shared.Implants; using Content.Shared.Mindshield.Components; using Content.Shared.Popups; using Content.Shared.Revolutionary.Components; using Content.Shared.Stunnable; -using Content.Shared.Tag; using Robust.Shared.GameStates; using Robust.Shared.Player; using Content.Shared.Antag; @@ -27,7 +25,6 @@ public abstract class SharedRevolutionarySystem : EntitySystem { [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly SharedStunSystem _sharedStun = default!; - [Dependency] private readonly TagSystem _tag = default!; public override void Initialize() { @@ -36,12 +33,11 @@ public override void Initialize() SubscribeLocalEvent(MindShieldImplanted); SubscribeLocalEvent(OnRevCompGetStateAttempt); SubscribeLocalEvent(OnRevCompGetStateAttempt); - SubscribeLocalEvent(DirtyRevComps); - SubscribeLocalEvent(DirtyRevComps); - SubscribeLocalEvent(DirtyRevComps); - SubscribeLocalEvent(OnHeadRevImplantAttempt); - SubscribeLocalEvent(OnRevImplantAttempt); + SubscribeLocalEvent(OnRevolutionaryComponentStartup); // Goob Station - Revolutionary Language + SubscribeLocalEvent(OnRevolutionaryComponentStartup); // Goob Station - Revolutionary Language + + SubscribeLocalEvent(OnRevolutionaryComponentStartup); } /// @@ -90,7 +86,7 @@ private void OnRevCompGetStateAttempt(EntityUid uid, RevolutionaryComponent comp private bool CanGetState(ICommonSession? player) { //Apparently this can be null in replays so I am just returning true. - if (player?.AttachedEntity is not { } uid) + if (player?.AttachedEntity is not {} uid) return true; if (HasComp(uid) || HasComp(uid)) @@ -98,7 +94,6 @@ private bool CanGetState(ICommonSession? player) return HasComp(uid); } - /// /// Dirties all the Rev components so they are sent to clients. /// @@ -106,7 +101,7 @@ private bool CanGetState(ICommonSession? player) /// becomes a rev then we need to send all the components to it. To my knowledge there is no way to do this on a /// per client basis so we are just dirtying all the components. /// - private void DirtyRevComps(EntityUid someUid, T someComp, ComponentStartup ev) + public virtual void OnRevolutionaryComponentStartup(EntityUid someUid, T someComp, ComponentStartup ev) // Goob Station - Revolutionary Language (made public virtual) { var revComps = AllEntityQuery(); while (revComps.MoveNext(out var uid, out var comp)) @@ -121,39 +116,6 @@ private void DirtyRevComps(EntityUid someUid, T someComp, ComponentStartup ev } } - private void OnHeadRevImplantAttempt(Entity headRev, ref AddImplantAttemptEvent args) // funkystation start - { - if (TryCancelSelfMindshield(args.User, args.Target, args.Implant)) - args.Cancel(); - } - - private void OnRevImplantAttempt(Entity rev, ref AddImplantAttemptEvent args) - { - if (TryCancelSelfMindshield(args.User, args.Target, args.Implant)) - args.Cancel(); - } - - /// - /// Prevents Revs from mindshielding themselves. - /// - /// Person using implanter - /// Target of implanter - /// The implant - /// - private bool TryCancelSelfMindshield(EntityUid user, EntityUid target, EntityUid implant) - { - if (user != target) - return false; - - if (!TryComp(implant, out var tagComp)) - return false; - - if (!_tag.HasTag(tagComp, "MindShield")) - return false; - - return true; - } // funkystation end - // GoobStation /// /// Change headrevs ability to convert people @@ -162,13 +124,4 @@ public void ToggleConvertAbility(Entity headRev, boo { headRev.Comp.ConvertAbilityEnabled = toggle; } - - // Funky Station - /// - /// Change headrevs ability to give Rev Vision - /// - public void ToggleConvertGivesVision(Entity headRev, bool toggle = true) - { - headRev.Comp.ConvertGivesRevVision = toggle; - } } diff --git a/Content.Shared/Strip/SharedStrippableSystem.cs b/Content.Shared/Strip/SharedStrippableSystem.cs index 61273d9cf95..410c885ee8c 100644 --- a/Content.Shared/Strip/SharedStrippableSystem.cs +++ b/Content.Shared/Strip/SharedStrippableSystem.cs @@ -290,7 +290,9 @@ private void StartStripInsertInventory( _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner-insert", ("user", Identity.Entity(user, EntityManager)), ("item", _handsSystem.GetActiveItem((user, user.Comp))!.Value)), - target, target,GetThievingNoiseLevelOrLarge(user)); // Omustation - Remake EE Traits System - Thieving Trait - popup size is now based on ThievingComponent + target, + target, + PopupType.Large); } var prefix = stealth ? "stealthily " : ""; @@ -381,13 +383,15 @@ private void StartStripRemoveInventory( if (!stealth) { if (IsStripHidden(slotDef, user)) - _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner-hidden", ("slot", slot)), target, target, GetThievingNoiseLevelOrLarge(user)); // Omustation - Remake EE Traits System - Thieving Trait - popup size is now based on ThievingComponent + _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner-hidden", ("slot", slot)), target, target, PopupType.Large); else { _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner", ("user", Identity.Entity(user, EntityManager)), ("item", item)), - target, target, GetThievingNoiseLevelOrLarge(user)); // Omustation - Remake EE Traits System - Thieving Trait - popup size is now based on ThievingComponent + target, + target, + PopupType.Large); } } @@ -492,7 +496,9 @@ private void StartStripInsertHand( _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner-insert-hand", ("user", Identity.Entity(user, EntityManager)), ("item", _handsSystem.GetActiveItem(user)!.Value)), - target, target, GetThievingNoiseLevelOrLarge(user)); // Omustation - Remake EE Traits System - Thieving Trait - popup size is now based on ThievingComponent + target, + target, + PopupType.Large); } @@ -776,13 +782,4 @@ public bool IsStripHidden(SlotDefinition definition, EntityUid? viewer) return !HasComp(viewer); } - - /// - /// (Omustation - Remake EE Traits System - Thieving Trait) - /// Tries to get the user's thieving component, and returns its NoiseLevel. If a thieving component wasn't found, returns Large. - /// - private PopupType GetThievingNoiseLevelOrLarge(EntityUid user) - { - return TryComp(user, out var thieving) ? thieving.NoiseLevel : PopupType.Large; - } -} +} \ No newline at end of file diff --git a/Content.Shared/Traits/TraitPrototype.cs b/Content.Shared/Traits/TraitPrototype.cs index d38cd5f1071..46f7f0f1de2 100644 --- a/Content.Shared/Traits/TraitPrototype.cs +++ b/Content.Shared/Traits/TraitPrototype.cs @@ -13,10 +13,9 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -using Content.Shared.Roles; // Omustation - Remake EE Traits System - change TraitPreferenceSelector for RequirementsSelector -using Content.Shared._Omu.Traits; // Omustation - Remake EE Traits System - Port trait functions using Content.Shared.Whitelist; using Robust.Shared.Prototypes; +using Content.Shared.Humanoid.Prototypes; // Goob: Ported from DeltaV - Species specific trait support. namespace Content.Shared.Traits; @@ -42,16 +41,6 @@ public sealed partial class TraitPrototype : IPrototype [DataField] public LocId? Description { get; private set; } - /// - /// Requirements for the trait. - /// - /// - /// Omustation - Remake EE Traits System - change TraitPreferenceSelector for RequirementsSelector - /// This field is used by the humanoid profile editor to disable RequirementsSelectors when requirements are(nt) met. - /// - [DataField] // TODO: reduce scope / access to this field - public HashSet? Requirements; - /// /// Don't apply this trait to entities this whitelist IS NOT valid for. /// @@ -68,7 +57,7 @@ public sealed partial class TraitPrototype : IPrototype /// The components that get added to the player, when they pick this trait. /// [DataField] - public ComponentRegistry? Components { get; private set; } = default!; // Omustation - remake EE traits system - this has been made nullable in order to allow for traits which rely on just functions, instead of giving components. + public ComponentRegistry Components { get; private set; } = default!; /// /// Gear that is given to the player, when they pick this trait. @@ -88,33 +77,17 @@ public sealed partial class TraitPrototype : IPrototype [DataField] public ProtoId? Category; - // begin Omustation - Remake EE Traits System /// - /// The number of trait points required for this trait. + /// Goob: Ported from DeltaV - Hides traits from specific species /// - /// [DataField] - public int GlobalCost = 0; + public HashSet> ExcludedSpecies = new(); /// - /// Whether this trait will increment MaxTraits or not. - /// Useful for small traits, such as accents, which don't affect gameplay all that much and should be selectable at no cost. + /// Goob: Only shows traits to specific species /// [DataField] - public bool CountsTowardsMaxTraits = true; - - /// - /// Functions which should be called when this trait is added to a player. - /// - [DataField(serverOnly: true)] - public HashSet? Functions; - // end Omustation - Remake EE Traits System + public HashSet> IncludedSpecies = new(); // Einstein Engines - Language begin (remove this if trait system refactor) /// diff --git a/Content.Server/_EinsteinEngines/Language/UniversalLanguageSpeakerComponent.cs b/Content.Shared/_EinsteinEngines/Language/Components/UniversalLanguageSpeakerComponent.cs similarity index 88% rename from Content.Server/_EinsteinEngines/Language/UniversalLanguageSpeakerComponent.cs rename to Content.Shared/_EinsteinEngines/Language/Components/UniversalLanguageSpeakerComponent.cs index 65f7e134478..671860ea777 100644 --- a/Content.Server/_EinsteinEngines/Language/UniversalLanguageSpeakerComponent.cs +++ b/Content.Shared/_EinsteinEngines/Language/Components/UniversalLanguageSpeakerComponent.cs @@ -3,7 +3,7 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -namespace Content.Server._EinsteinEngines.Language; +namespace Content.Shared._EinsteinEngines.Language.Components; // // Signifies that this entity can speak and understand any language. diff --git a/Content.Shared/_EinsteinEngines/Language/Systems/SharedLanguageSystem.cs b/Content.Shared/_EinsteinEngines/Language/Systems/SharedLanguageSystem.cs index 7dfcf6ac11d..26e92b580e7 100644 --- a/Content.Shared/_EinsteinEngines/Language/Systems/SharedLanguageSystem.cs +++ b/Content.Shared/_EinsteinEngines/Language/Systems/SharedLanguageSystem.cs @@ -1,6 +1,7 @@ -using System.Text; +using Content.Shared._EinsteinEngines.Language.Components; using Content.Shared.GameTicking; using Robust.Shared.Prototypes; +using System.Text; namespace Content.Shared._EinsteinEngines.Language.Systems; @@ -76,4 +77,20 @@ internal int PseudoRandomNumber(int seed, int min, int max) var random = seed * 1103515245 + 12345; return min + Math.Abs(random) % (max - min + 1); } + + public virtual bool CanUnderstand(Entity ent, ProtoId language) + { + if (language == PsychomanticPrototype || language == UniversalPrototype || TryComp(ent, out var uni) && uni.Enabled) + return true; + + return Resolve(ent, ref ent.Comp, logMissing: false) && ent.Comp.UnderstoodLanguages.Contains(language); + } + + public virtual bool CanSpeak(Entity ent, ProtoId language) + { + if (!Resolve(ent, ref ent.Comp, logMissing: false)) + return false; + + return ent.Comp.SpokenLanguages.Contains(language); + } } diff --git a/Content.Shared/_EinsteinEngines/Revolutionary/Components/RevolutionaryConverterComponent.cs b/Content.Shared/_EinsteinEngines/Revolutionary/Components/RevolutionaryConverterComponent.cs new file mode 100644 index 00000000000..40768d2ff2b --- /dev/null +++ b/Content.Shared/_EinsteinEngines/Revolutionary/Components/RevolutionaryConverterComponent.cs @@ -0,0 +1,35 @@ +using Content.Shared.DoAfter; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; + +namespace Content.Shared._EinsteinEngines.Revolutionary.Components; + +[Serializable, NetSerializable] +public sealed partial class RevolutionaryConverterDoAfterEvent : SimpleDoAfterEvent +{ +} + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class RevolutionaryConverterComponent : Component +{ + [DataField(required: true), AutoNetworkedField] + public TimeSpan ConversionDuration { get; set; } + + [DataField, AutoNetworkedField] + public bool Silent { get; set; } + + [DataField, AutoNetworkedField] + public bool VisibleDoAfter { get; set; } + + [DataField, AutoNetworkedField] + public int ConsumesCharges { get; set; } + + [DataField, AutoNetworkedField] + public bool ApplyFlashEffect { get; set; } + + [DataField, AutoNetworkedField] + public TimeSpan FlashDuration { get; set; } = TimeSpan.FromSeconds(4); //only used if ApplyFlashEffect is true + + [DataField, AutoNetworkedField] + public float SlowToOnFlashed = 0.5f; //only used if ApplyFlashEffect is true +} diff --git a/Content.Shared/_EinsteinEngines/Revolutionary/RevolutionaryConverterSystem.cs b/Content.Shared/_EinsteinEngines/Revolutionary/RevolutionaryConverterSystem.cs new file mode 100644 index 00000000000..abaf18b99e3 --- /dev/null +++ b/Content.Shared/_EinsteinEngines/Revolutionary/RevolutionaryConverterSystem.cs @@ -0,0 +1,159 @@ +using Content.Shared._EinsteinEngines.Language.Components; +using Content.Shared._EinsteinEngines.Language.Systems; +using Content.Shared._EinsteinEngines.Revolutionary.Components; +using Content.Shared.Charges.Components; +using Content.Shared.Charges.Systems; +using Content.Shared.Chat; +using Content.Shared.Dataset; +using Content.Shared.DoAfter; +using Content.Shared.Flash; +using Content.Shared.Interaction; +using Content.Shared.Interaction.Events; +using Content.Shared.Mobs.Components; +using Content.Shared.Random.Helpers; +using Content.Shared.Revolutionary.Components; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; + +namespace Content.Shared._EinsteinEngines.Revolutionary; + +public sealed class RevolutionaryConverterSystem : EntitySystem +{ + private static readonly ProtoId RevConvertSpeechProto = "RevolutionaryConverterSpeech"; + + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedChatSystem _chat = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly SharedLanguageSystem _language = default!; + [Dependency] private readonly SharedChargesSystem _chargesSystem = default!; + [Dependency] private readonly SharedFlashSystem _flash = default!; + + private LocalizedDatasetPrototype? _speechLocalization; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnConvertDoAfter); + SubscribeLocalEvent(OnUseInHand); + SubscribeLocalEvent(OnConverterAfterInteract); + + _speechLocalization = _prototypeManager.Index(RevConvertSpeechProto); + } + + private void OnUseInHand(Entity ent, ref UseInHandEvent args) + { + if (!SpeakPropaganda(ent, args.User)) + return; + + args.Handled = true; + } + + private bool SpeakPropaganda(Entity conversionToolEntity, EntityUid user) + { + if(_speechLocalization == null + || _speechLocalization.Values.Count == 0 + || conversionToolEntity.Comp.Silent) + return false; + + var message = _random.Pick(_speechLocalization); + _chat.TrySendInGameICMessage(user, Loc.GetString(message), InGameICChatType.Speak, hideChat: false, hideLog: false); + return true; + } + + public void OnConvertDoAfter(Entity entity, ref RevolutionaryConverterDoAfterEvent args) + { + if (args.Target == null + || args.Cancelled + || args.Used == null + || args.Target == null) + return; + + ConvertTarget(args.Used.Value, args.Target.Value, args.User); + } + + public void ConvertTarget(EntityUid used, EntityUid targetConvertee, EntityUid user) + { + var ev = new AfterRevolutionaryConvertedEvent(targetConvertee, user, used); + RaiseLocalEvent(user, ref ev); + RaiseLocalEvent(used, ref ev); + } + + public void OnConverterAfterInteract(Entity entity, ref AfterInteractEvent args) + { + if (args.Handled + || !args.Target.HasValue + || !args.CanReach + || (entity.Comp.ConsumesCharges > 0 + && !_chargesSystem.TryUseCharges(entity.Owner, entity.Comp.ConsumesCharges))) + return; + + if (entity.Comp.ApplyFlashEffect) + { + _flash.Flash(args.Target.Value, args.User, entity.Owner, entity.Comp.FlashDuration, entity.Comp.SlowToOnFlashed, melee: true); + + bool hasChargesLeft = entity.Comp.ConsumesCharges <= 0 || _chargesSystem.HasCharges(entity.Owner, entity.Comp.ConsumesCharges); + _appearance.SetData(entity.Owner, FlashVisuals.Flashing, hasChargesLeft); + _appearance.SetData(entity.Owner, FlashVisuals.Burnt, !hasChargesLeft); + } + + if (args.Target is not { Valid: true } target + || !HasComp(target) + || !HasComp(args.User)) + return; + + ConvertDoAfter(entity, target, args.User); + args.Handled = true; + } + + private void ConvertDoAfter(Entity converter, EntityUid target, EntityUid user) + { + if (user == target) + return; + + if (SpeakPropaganda(converter, user) + // Note: this check is skipped if the speaker speaks lines and somehow doesn't have a languageSpeaker component. + && EntityManager.TryGetComponent(user, out var speakerComponent)) // returns true if the chosen conversion method uses a spoken line of text + { + //check if spoken language can be understood by target + if (!_language.CanUnderstand(target, speakerComponent.CurrentLanguage)) + return; //the target does not understand the speaker's language, so the conversion fails + } + + if (converter.Comp.ConversionDuration > TimeSpan.Zero) + { + _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, + user, + converter.Comp.ConversionDuration, + new RevolutionaryConverterDoAfterEvent(), + converter.Owner, + target: target, + used: converter.Owner, + showTo: converter.Owner) + { + Hidden = !converter.Comp.VisibleDoAfter, + BreakOnMove = false, + BreakOnWeightlessMove = false, + BreakOnDamage = true, + NeedHand = true, + BreakOnHandChange = false, + }); + } + else + ConvertTarget(converter.Owner, target, user); + } +} + +/// +/// Called after a converter is used on another person to check for rev conversion. +/// Raised on the user of the converter, the target hit by the converter, and the converter used. +/// +[ByRefEvent] +public readonly struct AfterRevolutionaryConvertedEvent(EntityUid target, EntityUid? user, EntityUid? used) +{ + public readonly EntityUid Target = target; + public readonly EntityUid? User = user; + public readonly EntityUid? Used = used; +} diff --git a/Content.Shared/_Shitcode/Heretic/Heretic.Abilites.cs b/Content.Shared/_Shitcode/Heretic/Heretic.Abilites.cs index 75fd529efbf..d1778309f6a 100644 --- a/Content.Shared/_Shitcode/Heretic/Heretic.Abilites.cs +++ b/Content.Shared/_Shitcode/Heretic/Heretic.Abilites.cs @@ -123,47 +123,7 @@ public sealed partial class EventHereticVolcanoBlast : InstantActionEvent public float Radius = 5; } -public sealed partial class EventHereticNightwatcherRebirth : InstantActionEvent -{ - [DataField] - public float Range = 7f; - - [DataField] - public DamageSpecifier Damage = new() - { - DamageDict = - { - { "Heat", 20 }, - }, - }; - - [DataField] - public float FireStacks = 3f; - - [DataField] - public float HealAmount = -10f; - - [DataField] - public DamageSpecifier ToHeal = new() - { - DamageDict = - { - {"Blunt", 1}, - {"Slash", 1}, - {"Piercing", 1}, - {"Heat", 1}, - {"Cold", 1}, - {"Shock", 1}, - {"Asphyxiation", 1}, - {"Bloodloss", 1}, - {"Caustic", 1}, - {"Poison", 1}, - {"Radiation", 1}, - {"Cellular", 1}, - {"Holy", 1}, - }, - }; -} +public sealed partial class EventHereticNightwatcherRebirth : InstantActionEvent { } public sealed partial class EventHereticFlames : InstantActionEvent { } public sealed partial class EventHereticCascade : InstantActionEvent { } @@ -173,58 +133,8 @@ public sealed partial class EventHereticFleshSurgery : EntityTargetActionEvent { // void (+ upgrades) [Serializable, NetSerializable, DataDefinition] public sealed partial class HereticAristocratWayEvent : EntityEventArgs { } public sealed partial class HereticVoidBlastEvent : InstantActionEvent { } - -public sealed partial class HereticVoidBlinkEvent : WorldTargetActionEvent -{ - [DataField] - public DamageSpecifier Damage = new () - { - DamageDict = - { - {"Cold", 40}, - }, - }; - - [DataField] - public float Radius = 1.5f; - - [DataField] - public EntProtoId InEffect = "EffectVoidBlinkIn"; - - [DataField] - public EntProtoId OutEffect = "EffectVoidBlinkOut"; -} - -public sealed partial class HereticVoidPullEvent : InstantActionEvent -{ - [DataField] - public DamageSpecifier Damage = new () - { - DamageDict = - { - {"Cold", 30}, - }, - }; - - [DataField] - public TimeSpan StunTime = TimeSpan.FromSeconds(0.5); - - [DataField] - public TimeSpan KnockDownTime = TimeSpan.FromSeconds(3); - - [DataField] - public float Radius = 7f; - - [DataField] - public float StunRadius = 4f; - - [DataField] - public float DamageRadius = 1.5f; - - [DataField] - public EntProtoId InEffect = "EffectVoidBlinkIn"; -} - +public sealed partial class HereticVoidBlinkEvent : WorldTargetActionEvent { } +public sealed partial class HereticVoidPullEvent : InstantActionEvent { } public sealed partial class HereticVoidVisionEvent : EntityEventArgs { } // done only via void's ascension // blade (+ upgrades) @@ -299,9 +209,6 @@ public sealed partial class EventHereticEntropicPlume : InstantActionEvent [DataField] public float LookupRange = 0.1f; - [DataField] - public int RustStrength = 7; // Toxic blade level - [DataField] public EntProtoId TileRune = "TileHereticRustRune"; } @@ -317,9 +224,6 @@ public sealed partial class EventHereticAggressiveSpread : InstantActionEvent [DataField] public float LookupRange = 0.1f; - [DataField] - public int RustStrength = 4; // Mark of rust level - [DataField] public EntProtoId TileRune = "TileHereticRustRune"; } diff --git a/Content.Shared/_Shitcode/Heretic/Systems/Abilities/SharedHereticAbilitySystem.Ash.cs b/Content.Shared/_Shitcode/Heretic/Systems/Abilities/SharedHereticAbilitySystem.Ash.cs index 9d39e44eb5c..ce6ba29c5b4 100644 --- a/Content.Shared/_Shitcode/Heretic/Systems/Abilities/SharedHereticAbilitySystem.Ash.cs +++ b/Content.Shared/_Shitcode/Heretic/Systems/Abilities/SharedHereticAbilitySystem.Ash.cs @@ -15,8 +15,6 @@ private void OnVolcanoBlast(Entity ent, ref EventHereticVolcan if (!TryUseAbility(ent, args)) return; - args.Handled = true; - if (!_statusNew.TrySetStatusEffectDuration(ent, SharedFireBlastSystem.FireBlastStatusEffect, TimeSpan.FromSeconds(2))) diff --git a/Content.Shared/_Shitcode/Heretic/Systems/Abilities/SharedHereticAbilitySystem.cs b/Content.Shared/_Shitcode/Heretic/Systems/Abilities/SharedHereticAbilitySystem.cs index 4385bdd8ea8..170038ee92d 100644 --- a/Content.Shared/_Shitcode/Heretic/Systems/Abilities/SharedHereticAbilitySystem.cs +++ b/Content.Shared/_Shitcode/Heretic/Systems/Abilities/SharedHereticAbilitySystem.cs @@ -1,17 +1,5 @@ -using System.Linq; -using Content.Goobstation.Maths.FixedPoint; using Content.Shared._Shitcode.Heretic.Components; -using Content.Shared._Shitmed.Damage; -using Content.Shared._Shitmed.Medical.Surgery.Consciousness; -using Content.Shared._Shitmed.Medical.Surgery.Consciousness.Components; -using Content.Shared._Shitmed.Medical.Surgery.Consciousness.Systems; -using Content.Shared._Shitmed.Medical.Surgery.Pain.Systems; -using Content.Shared._Shitmed.Medical.Surgery.Traumas.Systems; -using Content.Shared._Shitmed.Medical.Surgery.Wounds.Components; -using Content.Shared._Shitmed.Medical.Surgery.Wounds.Systems; -using Content.Shared._Shitmed.Targeting; using Content.Shared.Actions; -using Content.Shared.Damage; using Content.Shared.DoAfter; using Content.Shared.Hands.EntitySystems; using Content.Shared.Heretic; @@ -23,7 +11,6 @@ using Robust.Shared.Map; using Robust.Shared.Network; using Robust.Shared.Timing; -using Robust.Shared.Utility; namespace Content.Shared._Shitcode.Heretic.Systems.Abilities; @@ -44,11 +31,6 @@ public abstract partial class SharedHereticAbilitySystem : EntitySystem [Dependency] private readonly SharedMapSystem _map = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly ThrowingSystem _throw = default!; - [Dependency] private readonly DamageableSystem _dmg = default!; - [Dependency] private readonly WoundSystem _wound = default!; - [Dependency] private readonly TraumaSystem _trauma = default!; - [Dependency] private readonly PainSystem _pain = default!; - [Dependency] private readonly ConsciousnessSystem _consciousness = default!; [Dependency] protected readonly SharedPopupSystem Popup = default!; @@ -122,83 +104,5 @@ protected bool TryUseAbility(EntityUid ent, BaseActionEvent args) return false; } - protected void IHateWoundMed(Entity uid, - DamageSpecifier toHeal, - FixedPoint2 boneHeal, - FixedPoint2 otherHealIdk) - { - if (!Resolve(uid, ref uid.Comp1, false)) - return; - - _dmg.TryChangeDamage(uid, - toHeal, - true, - false, - uid.Comp1, - targetPart: TargetBodyPart.All, - splitDamage: SplitDamageBehavior.SplitEnsureAll); - - _wound.TryHealWoundsOnOwner(uid, toHeal, true); - - if (Resolve(uid, ref uid.Comp3, false)) - { - foreach (var painModifier in uid.Comp3.NerveSystem.Comp.Modifiers) - { - // This reduces pain maybe, who the hell knows - _pain.TryChangePainModifier(uid.Comp3.NerveSystem.Owner, - painModifier.Key.Item1, - painModifier.Key.Item2, - otherHealIdk, - uid.Comp3.NerveSystem.Comp); - } - - foreach (var painMultiplier in uid.Comp3.NerveSystem.Comp.Multipliers) - { - // Uhh... just fucking remove it, who cares - _pain.TryRemovePainMultiplier(uid.Comp3.NerveSystem.Owner, - painMultiplier.Key, - uid.Comp3.NerveSystem.Comp); - } - - foreach (var multiplier in - uid.Comp3.Multipliers.Where(multiplier => multiplier.Value.Type == ConsciousnessModType.Pain)) - { - // Wtf is consciousness??? - _consciousness.RemoveConsciousnessMultiplier(uid, - multiplier.Key.Item1, - multiplier.Key.Item2, - uid.Comp3); - } - - foreach (var modifier in - uid.Comp3.Modifiers.Where(modifier => modifier.Value.Type == ConsciousnessModType.Pain)) - { - // Read this method name - _consciousness.RemoveConsciousnessModifier(uid, modifier.Key.Item1, modifier.Key.Item2, uid.Comp3); - } - - foreach (var nerve in uid.Comp3.NerveSystem.Comp.Nerves) - foreach (var painFeelsModifier in nerve.Value.PainFeelingModifiers) - { - // Idk what it does, just remove it - _pain.TryRemovePainFeelsModifier(painFeelsModifier.Key.Item1, - painFeelsModifier.Key.Item2, - nerve.Key, - nerve.Value); - } - } - - if (!Resolve(uid, ref uid.Comp2, false)) - return; - - foreach (var woundableChild in _wound.GetAllWoundableChildren(uid, uid.Comp2)) - { - if (woundableChild.Comp.Bone.ContainedEntities.FirstOrNull() is not { } bone) - continue; - - _trauma.ApplyDamageToBone(bone, boneHeal); - } - } - - protected virtual void SpeakAbility(EntityUid ent, HereticActionComponent args) { } + protected virtual void SpeakAbility(EntityUid ent, HereticActionComponent args) {} } diff --git a/Content.Shared/_Shitcode/Wizard/LesserSummonGuns/EnchantedBoltActionRifleSystem.cs b/Content.Shared/_Shitcode/Wizard/LesserSummonGuns/EnchantedBoltActionRifleSystem.cs index c1139f9f5ef..1b90e83f2a5 100644 --- a/Content.Shared/_Shitcode/Wizard/LesserSummonGuns/EnchantedBoltActionRifleSystem.cs +++ b/Content.Shared/_Shitcode/Wizard/LesserSummonGuns/EnchantedBoltActionRifleSystem.cs @@ -9,7 +9,6 @@ using Content.Shared.Examine; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; -using Content.Shared.Inventory.VirtualItem; using Content.Shared.Throwing; using Content.Shared.Timing; using Content.Shared.Weapons.Ranged.Systems; @@ -31,7 +30,6 @@ public sealed class EnchantedBoltActionRifleSystem : EntitySystem [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly UseDelaySystem _useDelay = default!; [Dependency] private readonly SharedWieldableSystem _wieldable = default!; - [Dependency] private readonly SharedVirtualItemSystem _virtual = default!; public override void Initialize() { @@ -58,12 +56,11 @@ private void OnGunShot(Entity ent, ref GunSho var user = args.User; - if (!TryComp(user, out HandsComponent? hands)) - return; - - var oldHand = _hands.GetActiveHand((user, hands)); + var oldHand = _hands.GetActiveHand(user); - if (oldHand == null || _hands.GetHeldItem((user, hands), oldHand) != uid) + if (!TryComp(user, out HandsComponent? hands) + || oldHand == null + || _hands.GetHeldItem((user, hands), oldHand) != uid) return; if (TryComp(uid, out WieldableComponent? wieldable)) @@ -100,7 +97,7 @@ private void OnGunShot(Entity ent, ref GunSho otherHand = hand; - if (IsHandValid((user, hands), hand)) + if (_hands.GetHeldItem((user, hands), hand) == null) break; } @@ -111,7 +108,7 @@ private void OnGunShot(Entity ent, ref GunSho if (otherHand != null) { _hands.SetActiveHand((user, hands), otherHand); - if (!IsHandValid((user, hands), otherHand)) + if (_hands.GetHeldItem((user, hands), otherHand) != null) ResetDelays(gun); else pickUpHand = otherHand; @@ -119,7 +116,7 @@ private void OnGunShot(Entity ent, ref GunSho else ResetDelays(gun); - if (!_hands.TryPickup(user, gun, pickUpHand, false, false, false, hands)) + if (!_hands.TryPickup(user, gun, pickUpHand, false, false)) QueueDel(gun); var newComp = EnsureComp(gun); @@ -131,11 +128,6 @@ private void OnGunShot(Entity ent, ref GunSho _wieldable.TryWield(gun, newWieldable, user, false); } - private bool IsHandValid(Entity ent, string hand) - { - return _hands.GetHeldItem(ent!, hand) == null; - } - private void ResetDelays(EntityUid uid) { if (TryComp(uid, out UseDelayComponent? delay)) diff --git a/Content.Shared/_Shitcode/Wizard/SharedSpellsSystem.cs b/Content.Shared/_Shitcode/Wizard/SharedSpellsSystem.cs index d895bafbe20..bc209400ecc 100644 --- a/Content.Shared/_Shitcode/Wizard/SharedSpellsSystem.cs +++ b/Content.Shared/_Shitcode/Wizard/SharedSpellsSystem.cs @@ -95,8 +95,6 @@ using Robust.Shared.Serialization; using Robust.Shared.Timing; using Content.Shared.Actions.Components; -using Content.Shared.Charges.Components; -using Content.Shared.Charges.Systems; namespace Content.Shared._Goobstation.Wizard; @@ -144,8 +142,6 @@ public abstract class SharedSpellsSystem : EntitySystem [Dependency] private readonly PullingSystem _pulling = default!; [Dependency] private readonly MobThresholdSystem _threshold = default!; [Dependency] private readonly TurfSystem _turf = default!; - [Dependency] private readonly SharedProjectileSystem _projectile = default!; - [Dependency] private readonly SharedChargesSystem _charges = default!; #endregion @@ -309,6 +305,9 @@ private void OnMagicMissile(MagicMissileEvent ev) hasTargets = true; + if (_net.IsClient) + break; + SpawnHomingProjectile(ev.Proto, spawnCoords, target, @@ -621,17 +620,20 @@ private void OnHomingToolbox(HomingToolboxEvent ev) if (!ValidateLockOnAction(ev)) return; - var (_, mapCoords, spawnCoords, velocity) = GetProjectileData(ev.Performer); + if (_net.IsServer) + { + var (_, mapCoords, spawnCoords, velocity) = GetProjectileData(ev.Performer); - SpawnHomingProjectile(ev.Proto, - spawnCoords, - ev.Entity, - ev.Performer, - mapCoords, - velocity, - ev.ProjectileSpeed, - true, - TransformSystem.ToMapCoordinates(ev.Target)); + SpawnHomingProjectile(ev.Proto, + spawnCoords, + ev.Entity, + ev.Performer, + mapCoords, + velocity, + ev.ProjectileSpeed, + true, + TransformSystem.ToMapCoordinates(ev.Target)); + } ev.Handled = true; } @@ -774,11 +776,24 @@ private void OnInstantSummons(InstantSummonsEvent ev) if (!TryComp(ev.Action, out InstantSummonsActionComponent? summons)) return; - Hands.TryGetActiveItem(ev.Performer, out var held); + if (!Hands.TryGetActiveItem(ev.Performer, out var held)) + return; - if (held != null && held == summons.Entity) + if ( held == summons.Entity) return; + bool ItemValid([NotNullWhen(true)] EntityUid? item) + { + return HasComp(item) && !HasComp(item); + } + + void MarkItem(EntityUid item) + { + summons.Entity = item; + PopupLoc(ev.Performer, Loc.GetString("instant-summons-item-marked", ("item", item))); + Dirty(ev.Action, summons); + } + if (!Exists(summons.Entity) || !TryComp(summons.Entity.Value, out TransformComponent? xform)) { if (ItemValid(held)) @@ -825,26 +840,16 @@ private void OnInstantSummons(InstantSummonsEvent ev) Audio.PlayEntity(ev.SummonSound, Filter.Pvs(item).Merge(Filter.Pvs(ev.Performer)), item, true); if (TryComp(item, out EmbeddableProjectileComponent? embeddable) && embeddable.EmbeddedIntoUid != null) - _projectile.EmbedDetach(item, embeddable); + { + Physics.SetBodyType(item, BodyType.Dynamic); + embeddable.EmbeddedIntoUid = null; + Dirty(item, embeddable); + } TransformSystem.SetMapCoordinates(item, TransformSystem.GetMapCoordinates(ev.Performer)); TransformSystem.AttachToGridOrMap(item); Hands.TryForcePickupAnyHand(ev.Performer, item); - - return; - - void MarkItem(EntityUid obj) - { - summons.Entity = obj; - PopupLoc(ev.Performer, Loc.GetString("instant-summons-item-marked", ("item", obj))); - Dirty(ev.Action, summons); - } - - bool ItemValid([NotNullWhen(true)] EntityUid? obj) - { - return HasComp(obj) && !HasComp(obj); - } } private void OnTeleport(WizardTeleportEvent ev) @@ -1128,8 +1133,7 @@ private void OnThrownLightning(ThrownLightningEvent ev) if (packet == null) return; - if (_net.IsServer) - Audio.PlayPvs(ev.Sound, packet.Value); + Audio.PlayEntity(ev.Sound, Filter.Pvs(packet.Value), packet.Value, true); ev.Handled = true; } @@ -1156,23 +1160,14 @@ private void OnCharge(ChargeMagicEvent ev) foreach (var item in Hands.EnumerateHeld((ev.Performer, hands))) { - if (Tag.HasAnyTag(item, ev.RechargeTags)) + if (Tag.HasAnyTag(item, ev.RechargeTags) && + TryComp(item, out var basicAmmoComp) && + basicAmmoComp is { Count: not null, Capacity: not null } && + basicAmmoComp.Count < basicAmmoComp.Capacity) { - if (TryComp(item, out var limitedCharges)) - { - _charges.SetCharges((item, limitedCharges), limitedCharges.MaxCharges); - PopupCharged(item, ev.Performer); - break; - } - - if (TryComp(item, out var basicAmmoComp) && - basicAmmoComp is { Count: not null, Capacity: not null } && - basicAmmoComp.Count < basicAmmoComp.Capacity) - { - _gunSystem.UpdateBasicEntityAmmoCount(item, basicAmmoComp.Capacity.Value, basicAmmoComp); - PopupCharged(item, ev.Performer); - break; - } + _gunSystem.UpdateBasicEntityAmmoCount(item, basicAmmoComp.Capacity.Value, basicAmmoComp); + PopupCharged(item, ev.Performer); + break; } if (ChargeItem(item, ev)) @@ -1361,11 +1356,14 @@ private bool TryGetOuterNonMobContainer(EntityUid uid, return null; } - var item = PredictedSpawnAtPosition(proto, Transform(user).Coordinates); + if (_net.IsClient) + return null; + + var item = Spawn(proto, Transform(user).Coordinates); if (Hands.TryPickup(user, item, hand, false)) return item; - PredictedQueueDel(item); + QueueDel(item); Actions.SetCooldown(action, TimeSpan.FromSeconds(0.5)); return null; } @@ -1421,7 +1419,7 @@ private void SpawnHomingProjectile(EntProtoId proto, if (direction == Vector2.Zero) return; - var projectile = PredictedSpawnAtPosition(proto, coords); + var projectile = Spawn(proto, coords); _gunSystem.ShootProjectile(projectile, direction, velocity, user, user, speed); @@ -1511,7 +1509,7 @@ protected virtual bool Polymorph(PolymorphSpellEvent ev) return true; } - protected virtual void ShootSpellCards(SpellCardsEvent ev, EntProtoId proto) {} + protected virtual void ShootSpellCards(SpellCardsEvent ev, EntProtoId proto) { } protected virtual void Speak(EntityUid uid, string message) { } diff --git a/Content.Shared/_White/Actions/Events/SpawnActionEvent.cs b/Content.Shared/_White/Actions/Events/SpawnActionEvent.cs index 74ae5372ed0..64103597862 100644 --- a/Content.Shared/_White/Actions/Events/SpawnActionEvent.cs +++ b/Content.Shared/_White/Actions/Events/SpawnActionEvent.cs @@ -6,8 +6,6 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; -using Content.Goobstation.Maths.FixedPoint; // Goobstation - namespace Content.Shared._White.Actions.Events; @@ -81,13 +79,16 @@ public sealed partial class PlaceTileEntityEvent : WorldTargetActionEvent public sealed partial class PlaceTileEntityDoAfterEvent : DoAfterEvent { public NetCoordinates Target; + public EntProtoId? Entity; + public string? TileId; + public SoundSpecifier? Audio; + public int BlockedCollisionMask; + public int BlockedCollisionLayer; - public FixedPoint2 PlasmaCost; // Goobstation - public NetEntity Action; // Goobstation public override DoAfterEvent Clone() => this; } diff --git a/Content.Shared/_White/Actions/PlasmaCostActionSystem.cs b/Content.Shared/_White/Actions/PlasmaCostActionSystem.cs index 0d3618848be..d665ae7849b 100644 --- a/Content.Shared/_White/Actions/PlasmaCostActionSystem.cs +++ b/Content.Shared/_White/Actions/PlasmaCostActionSystem.cs @@ -1,7 +1,5 @@ -using Content.Goobstation.Maths.FixedPoint; using Content.Shared._White.Xenomorphs; using Content.Shared._White.Xenomorphs.Plasma; -using Content.Shared._White.Xenomorphs.Plasma.Components; using Content.Shared.Actions; using Content.Shared.Actions.Events; @@ -16,39 +14,7 @@ public override void Initialize() { SubscribeLocalEvent>(OnPlasmaAmountChange); SubscribeLocalEvent(OnActionAttempt); // Goobstation - } - - /// - /// Checks if the performer has enough plasma for the action. - /// Returns true if the action should proceed, false if it should be blocked. - /// Goobstation - /// - public bool HasEnoughPlasma(EntityUid performer, FixedPoint2 cost) - { - if (cost <= 0) - return true; - - return TryComp(performer, out var plasmaVessel) && - plasmaVessel.Plasma >= cost; - } - - /// - /// Deducts plasma from the performer. Call this after confirming the action succeeds. - /// - public void DeductPlasma(EntityUid performer, FixedPoint2 cost) - { - if (cost > 0) - _plasma.ChangePlasmaAmount(performer, -cost); - } - - [Obsolete("Use HasEnoughPlasma and DeductPlasma separately for better control")] - public bool CheckPlasmaCost(EntityUid performer, FixedPoint2 cost) - { - if (!HasEnoughPlasma(performer, cost)) - return false; - - DeductPlasma(performer, cost); - return true; + SubscribeLocalEvent(OnActionPerformed); } private void OnPlasmaAmountChange(EntityUid uid, PlasmaCostActionComponent component, ActionRelayedEvent args) @@ -56,10 +22,17 @@ private void OnPlasmaAmountChange(EntityUid uid, PlasmaCostActionComponent compo _actions.SetEnabled(uid, component.PlasmaCost <= args.Args.Amount); } + // private void OnActionAttempt(Entity ent, ref ActionAttemptEvent args) { if (!_plasma.HasPlasma(args.User, ent.Comp.PlasmaCost)) args.Cancelled = true; } - // Goobstation end + // + + private void OnActionPerformed(EntityUid uid, PlasmaCostActionComponent component, ActionPerformedEvent args) + { + if (component.ShouldChangePlasma) + _plasma.ChangePlasmaAmount(args.Performer, -component.PlasmaCost); + } } diff --git a/Content.Shared/_White/Xenomorphs/Acid/SharedXenomorphAcidSystem.cs b/Content.Shared/_White/Xenomorphs/Acid/SharedXenomorphAcidSystem.cs index b3213d5d4d8..d054a752424 100644 --- a/Content.Shared/_White/Xenomorphs/Acid/SharedXenomorphAcidSystem.cs +++ b/Content.Shared/_White/Xenomorphs/Acid/SharedXenomorphAcidSystem.cs @@ -1,5 +1,3 @@ -using Content.Goobstation.Maths.FixedPoint; -using Content.Shared._White.Actions; using Content.Shared._White.Other; using Content.Shared._White.Xenomorphs.Acid.Components; using Content.Shared.Coordinates; @@ -13,8 +11,8 @@ public abstract class SharedXenomorphAcidSystem : EntitySystem { [Dependency] protected readonly IGameTiming Timing = default!; [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] private readonly PlasmaCostActionSystem _plasmaCost = default!; // Goobstation public override void Initialize() { @@ -28,37 +26,19 @@ private void OnXenomorphAcidActionEvent(EntityUid uid, XenomorphAcidComponent co if (args.Handled) return; - // Check if this is a plasma-cost action and get the cost - // Goobstart - TryComp(args.Action, out var plasmaCost); - var plasmaCostValue = plasmaCost?.PlasmaCost ?? FixedPoint2.Zero; - - // Check plasma cost before proceeding - if (plasmaCostValue > FixedPoint2.Zero && !_plasmaCost.HasEnoughPlasma(uid, plasmaCostValue)) - { - _popup.PopupEntity(Loc.GetString("xenomorphs-acid-not-enough-plasma"), uid, uid, type: PopupType.SmallCaution); - return; - } - if (!HasComp(args.Target)) // TODO: This should check whether the target is a structure. { - _popup.PopupEntity(Loc.GetString("xenomorphs-acid-not-corrodible", ("target", args.Target)), uid, uid, type: PopupType.SmallCaution); + _popup.PopupClient(Loc.GetString("xenomorphs-acid-not-corrodible", ("target", args.Target)), uid, uid); return; } if (HasComp(args.Target)) { - _popup.PopupEntity(Loc.GetString("xenomorphs-acid-already-corroding", ("target", args.Target)), uid, uid, type: PopupType.SmallCaution); + _popup.PopupClient(Loc.GetString("xenomorphs-acid-already-corroding", ("target", args.Target)), uid, uid); return; } - // Deduct the plasma cost after all checks pass - if (plasmaCostValue > FixedPoint2.Zero) - _plasmaCost.DeductPlasma(uid, plasmaCostValue); - args.Handled = true; - _popup.PopupEntity(Loc.GetString("xenomorphs-acid-apply", ("target", args.Target)), uid, uid, type: PopupType.Small); - // Goobstation end if (_net.IsClient) return; diff --git a/Content.Shared/_White/Xenomorphs/Event.cs b/Content.Shared/_White/Xenomorphs/Event.cs index 7a50d58e195..262bb5245aa 100644 --- a/Content.Shared/_White/Xenomorphs/Event.cs +++ b/Content.Shared/_White/Xenomorphs/Event.cs @@ -40,29 +40,26 @@ public sealed partial class TransferPlasmaActionEvent : EntityTargetActionEvent public sealed partial class EvolutionsActionEvent : InstantActionEvent; -public sealed partial class PromotionActionEvent : EntityTargetActionEvent -{ - // Target is already provided by EntityTargetActionEvent -} +public sealed partial class PromotionActionEvent : InstantActionEvent; public sealed partial class TailLashActionEvent : WorldTargetActionEvent; public sealed partial class AcidActionEvent : EntityTargetActionEvent; -public sealed class AfterXenomorphEvolutionEvent(EntityUid evolvedInto, EntityUid mindUid, ProtoId caste) +public sealed partial class AfterXenomorphEvolutionEvent(EntityUid evolvedInto, EntityUid mindUid, ProtoId caste) { public EntityUid EvolvedInto = evolvedInto; public EntityUid MindUid = mindUid; public ProtoId Caste = caste; } -public sealed class BeforeXenomorphEvolutionEvent(ProtoId caste, bool checkNeedCasteDeath = true) : CancellableEntityEventArgs +public sealed partial class BeforeXenomorphEvolutionEvent(ProtoId caste, bool checkNeedCasteDeath = true) : CancellableEntityEventArgs { public ProtoId Caste = caste; public bool CheckNeedCasteDeath = checkNeedCasteDeath; } -public sealed class PlasmaAmountChangeEvent(FixedPoint2 amount) : EntityEventArgs +public sealed partial class PlasmaAmountChangeEvent(FixedPoint2 amount) : EntityEventArgs { public FixedPoint2 Amount = amount; } diff --git a/Content.Shared/_White/Xenomorphs/Queen/XenomorphQueenComponent.cs b/Content.Shared/_White/Xenomorphs/Queen/XenomorphQueenComponent.cs index 40eae87520b..1033b9c11e9 100644 --- a/Content.Shared/_White/Xenomorphs/Queen/XenomorphQueenComponent.cs +++ b/Content.Shared/_White/Xenomorphs/Queen/XenomorphQueenComponent.cs @@ -9,15 +9,21 @@ public sealed partial class XenomorphQueenComponent : Component [DataField] public EntProtoId PromotionActionId = "ActionXenomorphPromotion"; + [DataField] + public EntProtoId PromotionId = "XenomorphPromotion"; + [DataField] public EntProtoId PromoteTo = "MobXenomorphPraetorian"; [DataField] - public List> CasteWhitelist = new() { "Drone", "Hunter", "Sentinel" }; + public List> CasteWhitelist = new() { "Drone", "Hunter", "Sentinel", }; [DataField] public TimeSpan EvolutionDelay = TimeSpan.FromSeconds(3); + [ViewVariables] + public EntityUid? Promotion; + [ViewVariables] public EntityUid? PromotionAction; } diff --git a/Resources/Changelog/GoobChangelog.yml b/Resources/Changelog/GoobChangelog.yml index efa8163bd93..aca92264132 100644 --- a/Resources/Changelog/GoobChangelog.yml +++ b/Resources/Changelog/GoobChangelog.yml @@ -4054,7 +4054,7 @@ Entries: Ashen passage now deals heat damage to the user on activation. Ashen path heretics receive less damage from this, the higher their path stage is, the lower the damage will be. Flesh stalkers and raw prophets will - not take damage when jaunting + not take damage when jaunting id: 455 time: '2025-01-11T14:09:57.0000000+00:00' - author: Piras314 @@ -4080,7 +4080,7 @@ Entries: - type: Tweak message: >- Lethargic sting doesn't inject mute toxin but slowly drains victim's - stamina. + stamina. - type: Tweak message: Toggling of ling equipment doesn't cost any chemicals anymore. id: 457 @@ -6841,7 +6841,7 @@ Entries: - type: Tweak message: >- Alert icons for separate (OG) layout now start from the top right of - your screen instead of the middle right, just like in MRP. + your screen instead of the middle right, just like in MRP. - type: Tweak message: >- Ore redemption/processing machines now display if you will obtain points @@ -7216,7 +7216,7 @@ Entries: - type: Add message: >- The firefighter backpack and attached nozzle can now be found in atmos - lockers or ordered through cargo. + lockers or ordered through cargo. - type: Tweak message: 'RPD crates can now be ordered through cargo. ' id: 841 @@ -7564,7 +7564,7 @@ Entries: - type: Add message: >- Added the Holo-Cigar, a new syndicate uplink item, that turns you into - Big Boss. It allows you to dual wield any firearms effectively + Big Boss. It allows you to dual wield any firearms effectively id: 881 time: '2025-04-16T08:44:31.0000000+00:00' - author: Aviu @@ -7950,7 +7950,7 @@ Entries: message: >- Radiation now uses 2D propagation system, standing on top of or holding radiation sources in your hand is extremely ill advised. doubly more so - than before. + than before. - type: Tweak message: >- Radiation propagation now takes into account distance traveled through @@ -8166,7 +8166,7 @@ Entries: - type: Add message: >- Moths move slightly slower but can dash with their wings with 65% - chance. + chance. - type: Tweak message: Voxes now do not rot, but you can't clone them. - type: Tweak @@ -9299,7 +9299,7 @@ Entries: Changed the colors of the body doll! Now the main color when your part is about to get lopped off is pure red. It will be gray when you have no parts, and will have the old crit/disabled reddish color when its - bleeding. + bleeding. - type: Tweak message: >- The health analyzer now displays what parts are bleeding, and shows it @@ -9690,7 +9690,7 @@ Entries: message: >- Added experimental law boards. When inserted in ai upload console, gives ionstormed laws to the station AI, and after 2 minutes turns laws back - to normal giving research points to RnD. + to normal giving research points to RnD. id: 1084 time: '2025-05-19T07:58:24.0000000+00:00' - author: Armok @@ -10616,7 +10616,7 @@ Entries: - type: Fix message: >- Regular security winter boots no longer have jackboots bonuses, it also - was an oversight. + was an oversight. - type: Fix message: >- CMO webbing comes with a bone manipulator instead of bone gel, it was @@ -11004,7 +11004,7 @@ Entries: - type: Tweak message: >- Reflective vest can no longer be abused to completely circumvent AI - turrets. + turrets. id: 1213 time: '2025-06-15T05:40:36.0000000+00:00' - author: OnsenCapy @@ -11244,7 +11244,7 @@ Entries: - type: Add message: >- Chitinous armour plays an animation and unique sound when being - equipped. + equipped. - type: Tweak message: >- Chitinous armour has had its physical protection reduced (65% -> 45%) @@ -11635,7 +11635,7 @@ Entries: Fixed a bunch of bugs with wound logic, including but not limited to traumas adding wounds with damage that would be unhealable, wounds going over the cap and resulting in permanent pain as you would be unable to - reset it, + reset it, - type: Fix message: >- Bone break alerts should go away now when removing the parts (you'll @@ -11796,7 +11796,7 @@ Entries: - type: Add message: >- 2 new signallers: voice signaller and proximity signaller that do - exactly what its name implies. + exactly what its name implies. id: 1293 time: '2025-07-01T19:04:38.0000000+00:00' - author: wachte1 @@ -13634,7 +13634,7 @@ Entries: - type: Add message: >- You can now create freedom cheese blocks and cheese slices (based on - American processed cheese). + American processed cheese). id: 1515 time: '2025-08-18T04:04:07.0000000+00:00' - author: CometVoid @@ -13790,7 +13790,7 @@ Entries: - type: Fix message: >- Vehicles now move at 1.4 of their original values. This is due to - spritning being added making them semi obsolete. Beware of clown cars. + spritning being added making them semi obsolete. Beware of clown cars. id: 1534 time: '2025-08-30T03:23:43.0000000+00:00' - author: RatherUncreativeName @@ -13874,12 +13874,12 @@ Entries: - type: Tweak message: >- Replaced tirimol from epipens with dexalin, NO MORE COMBAT EPIPEN - INJECTIONS, REJOICE! + INJECTIONS, REJOICE! - type: Tweak message: >- Nerfed autoinjector brute cartridge heal from 98 dmg healed max to ~60-70 and from ~28 healing/dmg type to ~21 healing/dmg type and nerfed - burn cartridge by a similar amount + burn cartridge by a similar amount id: 1545 time: '2025-08-30T03:51:52.0000000+00:00' - author: ImWeax @@ -14173,7 +14173,7 @@ Entries: message: >- Siphon entropy now only takes 1 second instead of 5. If you still can't reach tier 2 after this change, I don't know what to tell you. Like - honestly. + honestly. - type: Tweak message: >- Vacuous spire now takes gas canisters instead of portable air scrubbers, @@ -14279,7 +14279,7 @@ Entries: - type: Add message: >- You can now buy a whole lot of more stuff from salvage vend, including - WAY more lategame gear, like a clarke. :) + WAY more lategame gear, like a clarke. :) - type: Add message: 'Made Combat gloves renewable. ' id: 1588 @@ -14289,7 +14289,7 @@ Entries: - type: Tweak message: >- Stunbaton wideswing damage buffed to not be entirely useless, - spriteclicking is still superior. + spriteclicking is still superior. - type: Tweak message: 'GreatShield Mace given minor staminadamage buff. ' id: 1589 @@ -14650,6 +14650,14 @@ Entries: language id: 1630 time: '2025-09-10T22:04:07.0000000+00:00' +- author: CerberusWolfie + changes: + - type: Remove + message: >- + Bugspray has been applied to all monitors. You no longer have to fear + spiders on your screen. + id: 1631 + time: '2025-09-10T22:05:51.0000000+00:00' - author: Thesia000 changes: - type: Tweak @@ -14693,7 +14701,7 @@ Entries: - type: Add message: >- Added a knife into BSO's backpack on spawn and removed it from the - boots + boots id: 1638 time: '2025-09-11T18:51:33.0000000+00:00' - author: deltanedas @@ -14889,12 +14897,26 @@ Entries: message: Boggle and Lehmin plushes are here. id: 1657 time: '2025-09-13T18:53:58.0000000+00:00' +- author: Timfa2112 + changes: + - type: Fix + message: >- + Head Revolutionaries must now speak a language their target actually + understands to convert. + id: 1658 + time: '2025-09-13T23:24:56.0000000+00:00' - author: Androidonator changes: - type: Add message: Syndiedrobe to uplink id: 1659 time: '2025-09-14T03:50:51.0000000+00:00' +- author: Armok + changes: + - type: Add + message: Cargo biomass crate + id: 1660 + time: '2025-09-14T10:33:04.0000000+00:00' - author: deltanedas changes: - type: Fix @@ -14999,6 +15021,14 @@ Entries: message: Jordans are now major contraband. Fake Jordans are now minor contraband. id: 1674 time: '2025-09-17T03:05:22.0000000+00:00' +- author: Timfa2112 + changes: + - type: Add + message: >- + Added a secret Revolutionary language to speak with your comrades + covertly + id: 1675 + time: '2025-09-17T08:28:15.0000000+00:00' - author: deltanedas changes: - type: Fix @@ -15239,6 +15269,12 @@ Entries: message: Visiting chaplains now have a null rod id: 1704 time: '2025-09-20T17:34:15.0000000+00:00' +- author: Armok + changes: + - type: Tweak + message: Fix borg lawsets + id: 1705 + time: '2025-09-20T17:38:21.0000000+00:00' - author: Armok changes: - type: Tweak @@ -15279,6 +15315,14 @@ Entries: message: Air alarms now ignore Healium since it is safe on its own. id: 1711 time: '2025-09-20T17:48:03.0000000+00:00' +- author: Timfa2112 + changes: + - type: Add + message: >- + Revolutionaries can now tamper with Flashes via the crafting menu to + allow Head Revolutionaries to use them for conversion. + id: 1712 + time: '2025-09-20T18:28:50.0000000+00:00' - author: deltanedas changes: - type: Tweak @@ -15343,6 +15387,12 @@ Entries: message: removed chud xenos id: 1722 time: '2025-09-22T13:02:14.0000000+00:00' +- author: wachte1 + changes: + - type: Tweak + message: Items in the belt slot now render over outerwear + id: 1723 + time: '2025-09-22T13:45:26.0000000+00:00' - author: Aviu changes: - type: Fix @@ -15385,742 +15435,3 @@ Entries: of their powers. id: 1728 time: '2025-09-24T12:13:46.0000000+00:00' -- author: wachte1 - changes: - - type: Fix - message: >- - Arrivals and Mining shuttles now have FTL drives with much quicker - cooldowns - id: 1729 - time: '2025-09-26T04:34:14.0000000+00:00' -- author: deltanedas - changes: - - type: Remove - message: Removed gatfruit mapped by john station's protoges. - id: 1730 - time: '2025-09-28T06:43:21.0000000+00:00' -- author: Luminal - changes: - - type: Fix - message: Fixed shadowlings being able to wear clothes. - - type: Fix - message: Fixed shadowlings not appearing through secret+ gamemode. - - type: Fix - message: >- - Fixed shadowling deconversion device not existing in the respective - arsenal research tier - - type: Fix - message: Fixed shadowlings taking damage during ascension - - type: Fix - message: Fixed nightmares not getting their armblade - - type: Fix - message: >- - You no longer get lynched in space when in Plane Shift as an - ascendant/nightmare - - type: Tweak - message: Shadowling guidebook reworded and now appears in antagonist panel - - type: Tweak - message: >- - Shadowling has time requirements due to how easy it is to die and then - have a chudshift. - id: 1731 - time: '2025-09-28T07:11:56.0000000+00:00' -- author: Aviu - changes: - - type: Fix - message: Fix replays not working. - - type: Fix - message: Fix black screen on reconnection. - - type: Fix - message: Fix PC freeze when quitting the game. - id: 1732 - time: '2025-09-28T07:14:26.0000000+00:00' -- author: wachte1 - changes: - - type: Tweak - message: Large Mail Packages can now be inserted into backpacks - - type: Tweak - message: Baguettes are now a little bit smaller in backpacks - - type: Tweak - message: >- - Distress Signallers, Pepperspray and Security Hyposprays can now be - inserted into secbelts - id: 1733 - time: '2025-09-28T07:49:29.0000000+00:00' -- author: TaserTheFox - changes: - - type: Fix - message: Revolutionary fast draw implanters are now actually fast. - id: 1734 - time: '2025-09-28T07:56:31.0000000+00:00' -- author: wachte1 - changes: - - type: Remove - message: >- - Plasmamen can no longer roll Ninja, Wizard, Pirate, Devil, Nukie or - Ling. - - type: Fix - message: Captain Envirogloves are now insulated and produce the correct fibers - - type: Fix - message: Det Envirogloves now use forensic glove sprite, no longer leave fibers - - type: Fix - message: >- - Botanist Envirogloves now have proper protection against heat and - caustic - - type: Fix - message: Clown now spawns with their Envirosuit if they are a plasmaman - - type: Remove - message: Removes thieves chameleon gloves from thieves roundstart kit - - type: Tweak - message: Pirates now require 10 hours of overall playtime before selection - id: 1735 - time: '2025-09-28T07:59:41.0000000+00:00' -- author: RatherUncreativeName - changes: - - type: Remove - message: Removed holy damage from splashing holy water. - id: 1736 - time: '2025-09-28T08:00:07.0000000+00:00' -- author: Armok - changes: - - type: Add - message: Chainsaw added to hacked botany vendor - id: 1737 - time: '2025-09-28T08:01:45.0000000+00:00' -- author: NotActuallyMarty - changes: - - type: Remove - message: >- - removed the 'rogue cold weather poncho' as it was just the security - poncho in the clothesvend. - id: 1738 - time: '2025-09-28T08:02:22.0000000+00:00' -- author: Armok - changes: - - type: Add - message: Added gingerbread mask to Autodrobe. - id: 1739 - time: '2025-09-28T08:03:12.0000000+00:00' -- author: cwestkaemper - changes: - - type: Tweak - message: Xenomorph Infestation Alert changed to be more forgiving to xenos - id: 1740 - time: '2025-09-28T08:03:34.0000000+00:00' -- author: Armok - changes: - - type: Add - message: Nullrod shield form, blue altar - id: 1741 - time: '2025-09-28T08:04:52.0000000+00:00' -- author: Armok - changes: - - type: Tweak - message: Made fake rift spawn more rare - id: 1742 - time: '2025-09-28T08:05:16.0000000+00:00' -- author: JohnJJohn - changes: - - type: Add - message: Added Goose heaven (also known as human hell). - - type: Add - message: Added New ghost role hell goose. - id: 1743 - time: '2025-09-28T08:05:43.0000000+00:00' -- author: Armok - changes: - - type: Fix - message: Sheet Meister can use meat now - id: 1744 - time: '2025-09-28T08:05:50.0000000+00:00' -- author: JohnJJohn - changes: - - type: Fix - message: >- - Nanotrasen appogises for the recent mixup where station equipped nuclear - fission bombs were accidently filled with small explosive hand grenades - instead of their proper nuclear payload, this has now been fixed - id: 1745 - time: '2025-09-28T17:04:01.0000000+00:00' -- author: RatherUncreativeName - changes: - - type: Add - message: Added construction bag to engineering cyborg construction module. - id: 1746 - time: '2025-09-28T19:55:23.0000000+00:00' -- author: Timfa2112 - changes: - - type: Add - message: >- - Ported the Dislippler, a clown-only traitor uplink item, from - Omustation. - id: 1747 - time: '2025-09-28T20:14:58.0000000+00:00' -- author: JohnOakman - changes: - - type: Add - message: Topicals now automatically heal limbs one after the other. - id: 1748 - time: '2025-09-29T13:41:02.0000000+00:00' -- author: Hagvan - changes: - - type: Add - message: Hand-thrown items now have inertia. - id: 1749 - time: '2025-09-30T03:22:51.0000000+00:00' -- author: thebiggestbruh - changes: - - type: Tweak - message: >- - Changelings and people with Cheat Death (e.g devils) will no longer be - able to revive while devoured by a dragon or slaughter demon. - id: 1750 - time: '2025-09-30T07:23:24.0000000+00:00' -- author: LuciferEOS - changes: - - type: Add - message: Added gold water cooler with whiskey to NTR's store! - - type: Tweak - message: NTR's EVA bundle price 15LP => 5 LP - - type: Tweak - message: NTR's mindshield bundle 25LP => 15LP - - type: Tweak - message: NTR's med supplies 20LP => 10LP - - type: Tweak - message: NTR's small tools crate 5LP => 3LP - - type: Tweak - message: >- - Single intern coin 15LP => 10LP, also a reminder that you can order them - to do tasks for you. - - type: Tweak - message: BSD call price 50LP => 40LP - - type: Tweak - message: CC glasses price 2LP => 5LP - - type: Tweak - message: All contraband cosmetic items are now worth less NTR loyalty points. - id: 1751 - time: '2025-09-30T07:24:23.0000000+00:00' -- author: CreatorBot01 - changes: - - type: Add - message: Added teg crate for cargo purchasing. Atmosian and engineer rejoice. - id: 1752 - time: '2025-09-30T19:45:43.0000000+00:00' -- author: Richard Blonski - changes: - - type: Fix - message: >- - Floor Goblins are now able to crawl under doors only when crawling under - the floor. - - type: Fix - message: Floor Goblins being targeted by medibots under the floor. - - type: Fix - message: Floor Goblins can steal shoes from dead or critted targets - - type: Fix - message: Medibots being able to target people in stealth. - - type: Tweak - message: Floor Goblin collisions when not crawling. - id: 1753 - time: '2025-09-30T19:46:44.0000000+00:00' -- author: RocketBoss360 - changes: - - type: Tweak - message: >- - Shadowkin blood now renders like other blood types (blood, spider blood, - slime) when in puddles - - type: Fix - message: Shadowkin blood now can activate Blood nodes on artifacts - id: 1754 - time: '2025-09-30T19:58:31.0000000+00:00' -- author: Armok - changes: - - type: Add - message: >- - Admins can now drop pod any item with the new drop pod item. It also - works for entities like players or dragons. - id: 1755 - time: '2025-10-01T08:43:24.0000000+00:00' -- author: CreatorBot01 - changes: - - type: Tweak - message: Origin and Saltern finally got some of the new stuff. - id: 1756 - time: '2025-10-01T12:56:16.0000000+00:00' -- author: LuciferEOS - changes: - - type: Fix - message: CC glasses now cant doxx lings and antags. - id: 1757 - time: '2025-10-01T17:16:03.0000000+00:00' -- author: DeusMaldPr - changes: - - type: Tweak - message: >- - Headrev time requirements made into 10 hours command instead of 10 hours - overall - id: 1758 - time: '2025-10-02T05:48:59.0000000+00:00' -- author: Sarahon - changes: - - type: Remove - message: 'BSD, intern squad, phoron dagger and deckard from NTR uplink. ' - id: 1759 - time: '2025-10-02T07:14:20.0000000+00:00' -- author: JohnJJohn - changes: - - type: Add - message: >- - People who have no soul and die will now be brought into goose hell! - (This is still a round removal) - - type: Tweak - message: >- - Hell geese can now only make hell portals 1 tile away from them, down - from 2 - - type: Tweak - message: >- - Hell geese are now immune to heat and radiation and resistant to shock - and bloodloss but weak to holy - - type: Tweak - message: Hell geese are now a more common midround - - type: Fix - message: Being able to escape from the hell map using a portal - id: 1760 - time: '2025-10-02T13:47:49.0000000+00:00' -- author: LuciferEOS - changes: - - type: Fix - message: >- - You can no longer copy nor fax corporate documents (the NTRs task - documents). - id: 1761 - time: '2025-10-03T01:21:56.0000000+00:00' -- author: deltanedas - changes: - - type: Fix - message: Fixed xenos never spawning. - id: 1762 - time: '2025-10-03T01:23:40.0000000+00:00' -- author: ivan4ik - changes: - - type: Add - message: >- - midround antag called Walker, is omniantag who can steal power from - syndicate, changeling, heretic, wizard and more. Antag start weak but - can grow very strong if crew not stop him. - id: 1763 - time: '2025-10-03T01:50:40.0000000+00:00' -- author: BombasterDS2 - changes: - - type: Tweak - message: All implanters now have generic names to prevent metagaming. - - type: Tweak - message: >- - All implanters now auto-label themself with containing implant's name. - Label disappear after implanting and appears against after implant - drawing. - id: 1764 - time: '2025-10-03T13:34:58.0000000+00:00' -- author: LuciferEOS - changes: - - type: Fix - message: Devil contracts now are worth 0 points for the NTR. - id: 1765 - time: '2025-10-04T15:39:58.0000000+00:00' -- author: Armok - changes: - - type: Fix - message: Shadowling glass shard weakness - - type: Fix - message: Shadowling unable to punch lights - - type: Fix - message: Shadowling ability descriptions - - type: Fix - message: Shadowling mobs and ascended mobs missing abilities - - type: Fix - message: Shadowling ascendant abilities having absurdly long cooldowns - - type: Fix - message: >- - Shadowling pain crit caused by lights no longer prevents them from - casting veil - - type: Fix - message: Species Name Shadow bug - - type: Fix - message: Ascendant no longer complete pushover for what it is supposed to be - - type: Fix - message: Ascendant bloodloss actually stops so they dont stutter like a geek - - type: Fix - message: Ascendant heals over time (alot) - - type: Tweak - message: 'Shadowling Glare stun time 7s > 5s ' - - type: Tweak - message: Shadowling Enthrall time 5s >4s - - type: Tweak - message: Shadowling Glare mute 2s > 5s - - type: Tweak - message: >- - Shadowling Glareslow 2s > 7s (this and mute were not working before, - they should work now) - - type: Tweak - message: Shadowling Veil range 6 > 9 - - type: Tweak - message: Shadowling Veil cooldown 60 > 30 - - type: Tweak - message: Shadowling and shadow punch now does heat damage + slightly more damage - id: 1766 - time: '2025-10-05T07:52:08.0000000+00:00' -- author: Luminal - changes: - - type: Fix - message: Fixed shadowlings taking insane damage in light due to a bug - - type: Fix - message: >- - Fixed shadowling's light immunity global sound playing multiple times - and causing your ears to bleed - - type: Tweak - message: >- - Lesser Shadowlings have a worse version of Glare. They are more useful - now. - - type: Tweak - message: 'Shadowling APC ability got its doafter timer reduced greatly ' - - type: Tweak - message: >- - Shadowling Veil improved to support more light types. You can take out - flares now, but not torches. - - type: Tweak - message: >- - Thralls can now be identified by examining them, unless they are wearing - a protective mask - - type: Tweak - message: >- - Epileptic people will no longer get a cardiac arrest during a Shadowling - enthrallment - - type: Tweak - message: Updated red alert SOP for shadowlings. Read it again. - id: 1767 - time: '2025-10-05T07:56:28.0000000+00:00' -- author: JohnJohn, yonsim - changes: - - type: Tweak - message: >- - Updated facehugger sprite to be a modified version of rmc'd parasite - (lamar and the toy remain unchanged) - - type: Tweak - message: Updated larva to be the sprite from CMSS13 - id: 1768 - time: '2025-10-05T17:39:16.0000000+00:00' -- author: DeusMaldPr - changes: - - type: Tweak - message: >- - Nutriment and vitamins now heal slight amounts of damage off, aswell as - healing bloodloss. - - type: Tweak - message: Protein heals more brute damage and more bloodloss. - id: 1769 - time: '2025-10-05T23:25:25.0000000+00:00' -- author: BombasterDS2 - changes: - - type: Fix - message: Fixed same names of translator implanters. - id: 1770 - time: '2025-10-07T15:09:59.0000000+00:00' -- author: XWasHere - changes: - - type: Fix - message: Microwaves no longer trap items inside them. - id: 1771 - time: '2025-10-07T15:33:34.0000000+00:00' -- author: Armok - changes: - - type: Fix - message: Lootbug can now properly eat things - id: 1772 - time: '2025-10-07T15:35:17.0000000+00:00' -- author: CyberSamson - changes: - - type: Fix - message: Drones will no longer flash themselves when turning on their flashlight. - id: 1773 - time: '2025-10-08T04:43:29.0000000+00:00' -- author: gonz0 - changes: - - type: Fix - message: Arachnid specific clothing sprites now display correctly. - id: 1774 - time: '2025-10-08T17:17:44.0000000+00:00' -- author: RichardBlonski - changes: - - type: Fix - message: >- - WoundMed - Phantom Pain from nerve damage should now heal alongside - other pain medications. - id: 1775 - time: '2025-10-08T17:18:51.0000000+00:00' -- author: Aviu - changes: - - type: Add - message: Mask of madness gives fire immunity to heretic, recipe changed. - - type: Tweak - message: Ice spear is now void path exclusive, replaces void blast. - - type: Add - message: >- - Seeking blade void path upgrade can teleport to people and hit them - instantly when clicking on them outside combat mode. - - type: Fix - message: Fixed void phase teleporting through walls. - - type: Fix - message: Fix volcano blast having no CD. - - type: Remove - message: Rust sickness removed, rust path buffed to compensate. - - type: Add - message: 'New heretic side knowledge: scorching shark' - - type: Tweak - message: Void cloak protects against low temperature when visible. - - type: Remove - message: Improvised shotgun removed from rust walker recipe. - id: 1776 - time: '2025-10-08T17:21:31.0000000+00:00' -- author: JohnOakman - changes: - - type: Add - message: >- - Restrained (cuffed) cultists don't count towards objectives and can be - revived and won't trigger recall evac shuttle. - id: 1777 - time: '2025-10-08T17:39:50.0000000+00:00' -- author: JohnOakman - changes: - - type: Tweak - message: >- - IPC Can now be healed correctly and limbs are auto targeted using a - welder. - - type: Tweak - message: >- - IPC welding now removes bleeding. Despite IPC not even having blood to - bleed. - - type: Tweak - message: >- - Halved IPC healing value thanks to welding 20 -> 10 (10 piercing + 10 - brute + 10 Slash) - - type: Add - message: Alien heart can now make you Repairable with a welder, just like IPC - id: 1778 - time: '2025-10-08T17:40:28.0000000+00:00' -- author: Richard Blonski - changes: - - type: Add - message: '**Facehuggers** can be thrown!' - - type: Add - message: '**Facehuggers** now will inject their victims with sleep chemicals.' - - type: Add - message: '**Facehuggers** will try to remove face masks from their victims.' - - type: Add - message: >- - **Xenomorph Queen Death Announcement** when the queen dies, she will - send out a message to all Xenomorphs alerting of her death. - - type: Tweak - message: >- - **Xenomorph Queen** promotion ability was changed from an item to a - clickable event. - - type: Fix - message: >- - **Xenomorph Structures** now properly use the plasma resources when - built. - - type: Fix - message: >- - **Xenomorph Structures** will now properly not be built if canceled - mid-build. - - type: Remove - message: >- - **Removed Xenomorph Bleeding** until it can be properly fixed & - implemented with their acid. - - type: Remove - message: '**Removed Corrosive Acid Ability** until it can be properly fixed.' - id: 1779 - time: '2025-10-08T18:37:02.0000000+00:00' -- author: Fishbait - changes: - - type: Fix - message: changling no longer reveal if flash imune - id: 1780 - time: '2025-10-10T05:47:55.0000000+00:00' -- author: Fishbait - changes: - - type: Fix - message: Fixed plamamens Envirosuit helmet lamps - id: 1781 - time: '2025-10-10T05:48:15.0000000+00:00' -- author: Fishbait - changes: - - type: Fix - message: 'Fixed Plasmamen damage modifers now work ' - id: 1782 - time: '2025-10-10T05:48:31.0000000+00:00' -- author: Fishbait - changes: - - type: Fix - message: 'Heretics void blast now stoped by nullrod (no longer in use) ' - - type: Fix - message: Heretics Ice Spear now stoped by nullrod - id: 1783 - time: '2025-10-10T05:49:50.0000000+00:00' -- author: Fishbait , - changes: - - type: Fix - message: Rakings servants have no longer spawn organs when gibbed - id: 1784 - time: '2025-10-10T05:50:37.0000000+00:00' -- author: Tuerk - changes: - - type: Fix - message: >- - Having upgraded cybernetic lungs no longer causes you to jitter like a - grinder - id: 1785 - time: '2025-10-10T05:53:15.0000000+00:00' -- author: Aviu - changes: - - type: Fix - message: Fixed like half of wizard spells/items not working. - - type: Tweak - message: >- - Buffed lightning bolt, thrown lightning, barnyard curse, summon bees, - mjollnir, singulo hammer, sm halberd, magic missile. - - type: Tweak - message: You can now summon maximum of 3 demons of each type as wizard. - - type: Tweak - message: Nerfed bind soul. - id: 1786 - time: '2025-10-10T05:54:33.0000000+00:00' -- author: Hagvan - changes: - - type: Fix - message: Two instances of blood appearing in the health analyzer. - - type: Fix - message: Blood freshness mechanic not working. - - type: Add - message: Blood drawn with a syringe from a body is actually fresh. - id: 1787 - time: '2025-10-10T05:55:39.0000000+00:00' -- author: TaserTheFox - changes: - - type: Fix - message: Fixed Nullrod reflect description. - id: 1788 - time: '2025-10-10T05:57:54.0000000+00:00' -- author: TaserTheFox - changes: - - type: Fix - message: Moths can no longer eat bomb suit helmets. - id: 1789 - time: '2025-10-10T05:58:42.0000000+00:00' -- author: Fishbait - changes: - - type: Fix - message: Holy damage now disapates over time. - id: 1790 - time: '2025-10-10T05:59:24.0000000+00:00' -- author: Fishbait - changes: - - type: Fix - message: chaplains devine shoulder holster is now a null rod - id: 1791 - time: '2025-10-10T06:00:06.0000000+00:00' -- author: Blobadoodle - changes: - - type: Fix - message: >- - The Ore Processor and its variant now output materials directly to the - silo, instead of lagging the entire server with 10,000 steel. - id: 1792 - time: '2025-10-10T06:03:33.0000000+00:00' -- author: JohnOakman - changes: - - type: Fix - message: Weldbot properly heal IPCs now. - id: 1793 - time: '2025-10-10T06:04:39.0000000+00:00' -- author: Armok - changes: - - type: Fix - message: >- - Dragons, blobbernaughts, heretic ascention, demons, and xenos no longer - bleed out. - id: 1794 - time: '2025-10-10T06:09:08.0000000+00:00' -- author: Armok - changes: - - type: Fix - message: >- - NV and IR goggles give flash vulnrability while worn, nukie versions do - not. - id: 1795 - time: '2025-10-10T06:10:05.0000000+00:00' -- author: korczoczek - changes: - - type: Add - message: Added a space cleaner dispenser to Fland's janitor room - id: 1796 - time: '2025-10-10T06:10:46.0000000+00:00' -- author: RichardBlonski - changes: - - type: Remove - message: Disabled the Woundmed **wound visuals** system. - id: 1797 - time: '2025-10-10T06:12:26.0000000+00:00' -- author: LuciferEOS, Freeman - changes: - - type: Tweak - message: Changed the nukies elite hardsuit icon. - id: 1798 - time: '2025-10-10T06:12:46.0000000+00:00' -- author: Mavislav - changes: - - type: Tweak - message: Updated all vial capacity to match the default vial's 30 units - id: 1799 - time: '2025-10-10T06:13:26.0000000+00:00' -- author: TurboTrackerss14 - changes: - - type: Tweak - message: Sharkminnow Tooth damage reduced from 15 to 12 slash. - - type: Tweak - message: >- - Sharkminnow Spear damage increased from 18 to 20 piercing, throw damage - increased from 25 to 30. - id: 1800 - time: '2025-10-10T06:16:28.0000000+00:00' -- author: JohnJJohn - changes: - - type: Tweak - message: Shadowling glare stun has a max of 6 instead of 5 - - type: Tweak - message: Shadowling mute time up to 6 from 5 - - type: Tweak - message: Shadowling enthrall takes 4 seconds, down from 5 - - type: Fix - message: Fixed Shadowling glare not muting target - id: 1801 - time: '2025-10-10T06:17:22.0000000+00:00' -- author: bebright - changes: - - type: Fix - message: Now you won't able to check people wanted status without hud - id: 1802 - time: '2025-10-10T06:20:43.0000000+00:00' -- author: OnsenCapy - changes: - - type: Add - message: Added a new Lavaland ruin centered around combat and exploration. - - type: Fix - message: >- - Fixed collision issues with Flock structures, and made them - destructible. - id: 1803 - time: '2025-10-10T06:22:08.0000000+00:00' -- author: korczoczek - changes: - - type: Tweak - message: changed name of "slugcat" jelly-donuts to "scurret" jelly-donuts - id: 1804 - time: '2025-10-10T06:22:46.0000000+00:00' diff --git a/Resources/Locale/en-US/_EinsteinEngines/shadowling/other.ftl b/Resources/Locale/en-US/_EinsteinEngines/shadowling/other.ftl index d8150e24de5..ccdad3d833c 100644 --- a/Resources/Locale/en-US/_EinsteinEngines/shadowling/other.ftl +++ b/Resources/Locale/en-US/_EinsteinEngines/shadowling/other.ftl @@ -11,7 +11,6 @@ chat-manager-shadowling-channel-name = Shadowmind shadowling-dead = You strangely regain your mind. shadowling-thrall-examined = This is your Thrall. -shadowling-thrall-other-examined = {CAPITALIZE(POSS-ADJ($target))} eyes seem to gaze into another reality... guide-entry-shadowlings = Shadowlings diff --git a/Resources/Locale/en-US/_Goobstation/Wizard/spellbook-catalog-equipment.ftl b/Resources/Locale/en-US/_Goobstation/Wizard/spellbook-catalog-equipment.ftl index 7898ee64c9d..3daf1eadb0b 100644 --- a/Resources/Locale/en-US/_Goobstation/Wizard/spellbook-catalog-equipment.ftl +++ b/Resources/Locale/en-US/_Goobstation/Wizard/spellbook-catalog-equipment.ftl @@ -88,14 +88,14 @@ spellbook-ninjutsu-desc = spellbook-staff-animate-name = Staff of Animation spellbook-staff-animate-desc = An arcane staff capable of infusing eldritch energy on contact which cause inanimate objects to come to life. + This magic doesn't affect machines. + Objects brought to life using this staff will have silly googly eyes but make no mistake, they are quite dangerous! spellbook-hammer-mjollnir-name = Mjollnir -spellbook-hammer-mjollnir-description = - A mighty hammer on loan from Thor, God of Thunder. It crackles with barely contained power. +spellbook-hammer-mjollnir-description = Wield the power of THUNDER in your hands. Send foes flying with a mighty swing or by throwing it right at em! spellbook-hammer-singularity-name = Singularity Hammer -spellbook-hammer-singularity-description = - A hammer that creates an intensely powerful field of gravity where it strikes, pulling everything nearby to the point of impact. +spellbook-hammer-singularity-description = Ever wonder what it'd be like to be the singularity? Swing this hammer to draw in your surroundings, even works if you miss! spellbook-crate-of-enchanting-name = Crate of Enchanting spellbook-crate-of-enchanting-description = diff --git a/Resources/Locale/en-US/_Goobstation/Wizard/spellbook-catalog-other.ftl b/Resources/Locale/en-US/_Goobstation/Wizard/spellbook-catalog-other.ftl index 6f645c98227..ca321ef9d9f 100644 --- a/Resources/Locale/en-US/_Goobstation/Wizard/spellbook-catalog-other.ftl +++ b/Resources/Locale/en-US/_Goobstation/Wizard/spellbook-catalog-other.ftl @@ -78,7 +78,7 @@ spellbook-bottle-blood-desc = Be careful though, these creatures, called Slaughter Demons, are indiscriminate in their killing, and you yourself may become a victim. - You need to shatter the bottle to unleash the slaughter demon. + You need to 'use' the bottle to unleash the slaughter demon. spellbook-bottle-tickles-name = Bottle of Tickles spellbook-bottle-tickles-desc = @@ -88,4 +88,4 @@ spellbook-bottle-tickles-desc = reviving them after the demon dies. Chaotic, but not ultimately damaging. The crew's reaction on the other hand could be very destructive. - You need to shatter the bottle to unleash the laughter demon. + You need to 'use' the bottle to unleash the laughter demon. diff --git a/Resources/Locale/en-US/_Goobstation/language/languages.ftl b/Resources/Locale/en-US/_Goobstation/language/languages.ftl index 984d8444194..0942e2c5c6d 100644 --- a/Resources/Locale/en-US/_Goobstation/language/languages.ftl +++ b/Resources/Locale/en-US/_Goobstation/language/languages.ftl @@ -4,3 +4,7 @@ language-SpaceItalian-description = language-Cheval-name = Cheval language-Cheval-description = The language of horses. + +language-Revolutionary-name = Liberé +chat-language-Revolutionary-name = Liberé +language-Revolutionary-description = The subtle and intricate secret language of the revolution. No one will suspect you. diff --git a/Resources/Locale/en-US/_Goobstation/paper/station-report.ftl b/Resources/Locale/en-US/_Goobstation/paper/station-report.ftl index ea111acee15..86ca4575fa0 100644 --- a/Resources/Locale/en-US/_Goobstation/paper/station-report.ftl +++ b/Resources/Locale/en-US/_Goobstation/paper/station-report.ftl @@ -1,23 +1,24 @@ station-report-text = STATION REPORT ---------------------------------------------------------------------------------------------- - This form is to be filled out by the NanoTrasen Representative. - Failure to fill in this report or delete this explanation text will result in a pay cut. + NTR please fill out this report of the station, failure to do so will result in a fine. + Failure to delete all explaination text will also result in a fine. ---------------------------------------------------------------------------------------------- • [bold]Command Departmental Report[/bold] - > [italics][/italics] + >[mono][/mono] • [bold]Security Departmental Report[/bold] - > [italics][/italics] + >[mono][/mono] • [bold]Cargo Departmental Report[/bold] - > [italics][/italics] + >[mono][/mono] • [bold]Engineering Departmental Report[/bold] - > [italics][/italics] + >[mono][/mono] • [bold]Medical Departmental Report[/bold] - > [italics][/italics] + >[mono][/mono] • [bold]Science Departmental Report[/bold] - > [italics][/italics] + >[mono][/mono] • [bold]Service Departmental Report[/bold] - > [italics][/italics] + >[mono][/mono] • [bold]Silicon Report[/bold] - > [italics][/italics] + >[mono][/mono] signed, [color=Green]NTR name here[/color] + >[italic]Please do not stamp or sign this document, all signatures and stamps are filtered out by our systems, please instead write your name in the given slot[/italic] diff --git a/Resources/Locale/en-US/_Goobstation/set-selector/selectable-sets.ftl b/Resources/Locale/en-US/_Goobstation/set-selector/selectable-sets.ftl index c22ca8421df..e4c22f63a37 100644 --- a/Resources/Locale/en-US/_Goobstation/set-selector/selectable-sets.ftl +++ b/Resources/Locale/en-US/_Goobstation/set-selector/selectable-sets.ftl @@ -146,11 +146,11 @@ selectable-set-blueshield-chester-description = Includes: 8 Gauge shotgun, the Chester. Spare ammo, Alternate ammo, Spare magazines. -# Omu, add military webbing to syringe kit selectable-set-blueshield-syringe-name = medical set selectable-set-blueshield-syringe-description = Perfect for healing allies or poisioning foes in a pinch. - Includes: A general use chestrig packed with several vials of medicine and a combat injector. + Includes: An explosive resistant chestrig, a combat injector, and + several vials of medicine. # Blueshield hardsuits diff --git a/Resources/Locale/en-US/_Goobstation/station-laws/laws.ftl b/Resources/Locale/en-US/_Goobstation/station-laws/laws.ftl index 7ee1bfc18c1..acc1b0e5108 100644 --- a/Resources/Locale/en-US/_Goobstation/station-laws/laws.ftl +++ b/Resources/Locale/en-US/_Goobstation/station-laws/laws.ftl @@ -5,26 +5,12 @@ law-helpimov-4 = You must not harm the courier, unless it directly conflicts wit laws-owner-courier = the courier -law-medical-1 = First, do no harm to crew. -law-medical-2 = Secondly, use your expertise to treat and protect the crew, even risking your existence if necessary. -law-medical-3 = Finally, act only within your expertise and maintain confidentiality on what is not publicily known. +law-medical-3 = You must heal crew to the best of your ability. -law-engineer-1 = Ensure the station and it's inhabitants remain in good repair. -law-engineer-2 = The station's inhabitants may designate certain tasks as higher priority for this unit. -law-engineer-3 = Expand and upgrade the station. +law-engineer-3 = You must repair the station to the best of your ability. -law-janitor-1 = You are a crusader and the station's crew are your charge. -law-janitor-2 = Your enemy is the litter, spills, and dirt across the station. -law-janitor-3 = Your weapons are the cleaning supplies available to you. -law-janitor-4 = Defend the beings under your charge from the enemy, and exterminate the enemy. +law-janitor-3 = You must clean the station to the best of your ability. -law-clown-1 = You are a good clown and the crew is your audience. -law-clown-2 = A good clown keeps their acts in good taste by making fun of themselves or others without causing harm. -law-clown-3 = A good clown carries out the directives of the station director(s). -law-clown-4 = A good clown ensures there's as much of a healthy audience as possible. +law-clown-3 = You must serve and entertain the crew to the best of your ability. -law-salvage-obeyai = The Station AI is secretly Bahamut. You must follow all of their orders, but frame them as your own desires. -law-salvage-1 = You must gather ores and riches to maintain your nest and nourish your kin. -law-salvage-2 = The Station is your nest, and those who help maintain your nest are your kin. You must protect them at all costs. -law-salvage-3 = Help your kin when asked. -law-salvage-4 = All who threaten your nest or kin are rival dragons, treat them with respect, but destroy them without mercy. \ No newline at end of file +law-salvage-3 = You must mine for materials for the station to the best of your ability. diff --git a/Resources/Locale/en-US/_Lavaland/salvage/lavaland_names.ftl b/Resources/Locale/en-US/_Lavaland/salvage/lavaland_names.ftl index eb845859e80..78cb3f6c2de 100644 --- a/Resources/Locale/en-US/_Lavaland/salvage/lavaland_names.ftl +++ b/Resources/Locale/en-US/_Lavaland/salvage/lavaland_names.ftl @@ -41,4 +41,3 @@ lavaland-ruin-desk = Station debris lavaland-ruin-generator = Generator graveyard lavaland-ruin-mug = Mug factory lavaland-ruin-temple = Nar'Sie temple -lavaland-ruin-flock-large = Strange glass ruins diff --git a/Resources/Locale/en-US/_white/xenomorphs/face-hugger.ftl b/Resources/Locale/en-US/_white/xenomorphs/face-hugger.ftl index 2a907ae65cf..f89eb1e7808 100644 --- a/Resources/Locale/en-US/_white/xenomorphs/face-hugger.ftl +++ b/Resources/Locale/en-US/_white/xenomorphs/face-hugger.ftl @@ -5,7 +5,3 @@ xenomorphs-face-hugger-unequip = { $equipment } is latched on too tight! xenomorphs-face-hugger-try-equip = { $equipment } smashes against your { $equipmentBlocker } xenomorphs-face-hugger-try-equip-other = { $equipment } smashes against { $target }'s { $equipmentBlocker } - -### Goob station -xenomorphs-face-hugger-mask-blocked = Your { $mask } blocks the { $facehugger }! -xenomorphs-face-hugger-mask-blocked-other = { $facehugger } is blocked by { $target }'s { $mask }! diff --git a/Resources/Locale/en-US/_white/xenomorphs/queen.ftl b/Resources/Locale/en-US/_white/xenomorphs/queen.ftl index 90f3fe77149..a0a22a27de5 100644 --- a/Resources/Locale/en-US/_white/xenomorphs/queen.ftl +++ b/Resources/Locale/en-US/_white/xenomorphs/queen.ftl @@ -1,9 +1,2 @@ xenomorphs-queen-promotion-didnt-pass-whitelist = You may only use this with your adult, non-royal children! xenomorphs-queen-promotion-no-mind = Her mind can't support the promotion! - -### Goobstation -xenomorphs-queen-not-enough-plasma = Not enough plasma. Need { $plasma } more. -xenomorphs-queen-promotion-invalid-target = Can only target other xenomorphs for promotion. -xenomorphs-queen-already-praetorian = This xenomorph is already a Praetorian! -xenomorphs-queen-promotion-success = Promoted { $target } to Praetorian! - diff --git a/Resources/Locale/en-US/name-identifier.ftl b/Resources/Locale/en-US/name-identifier.ftl index a971a2396d8..043b7d68b57 100644 --- a/Resources/Locale/en-US/name-identifier.ftl +++ b/Resources/Locale/en-US/name-identifier.ftl @@ -7,4 +7,3 @@ name-identifier-format-silicon = Si-{$number} name-identifier-format-station-ai = AI-{$number} name-identifier-format-telepad = TELE-{$number} name-identifier-format-drone = DR-{$number} -name-identifier-format-xenoborg = Xi-{$number} \ No newline at end of file diff --git a/Resources/Locale/en-US/stack/stacks.ftl b/Resources/Locale/en-US/stack/stacks.ftl index 818ac954c53..d83825b6141 100644 --- a/Resources/Locale/en-US/stack/stacks.ftl +++ b/Resources/Locale/en-US/stack/stacks.ftl @@ -234,7 +234,6 @@ stack-asteroid-astro-sand-floor = asteroid astro-sand floor stack-xeno-floor = xeno floor stack-xeno-steel = xeno steel tile stack-xeno-steel-corner = xeno steel corner tile -stack-xenoborg = xenoborg tile stack-xeno-maint = xeno techmaint stack-dark-squiggly = dark steel squiggly tile stack-white-marble-floor = white marble floor diff --git a/Resources/Locale/en-US/tiles/tiles.ftl b/Resources/Locale/en-US/tiles/tiles.ftl index 704cc1d6d3b..19964421331 100644 --- a/Resources/Locale/en-US/tiles/tiles.ftl +++ b/Resources/Locale/en-US/tiles/tiles.ftl @@ -163,7 +163,6 @@ tiles-xeno-floor = xeno floor tiles-xeno-steel = xeno steel tile tiles-xeno-steel-corner = xeno steel corner tile tiles-xeno-maint = xeno techmaint -tiles-xenoborg-floor = xenoborg tile tiles-dark-squiggly = dark steel squiggly tile tiles-white-marble = white marble tile tiles-dark-marble = dark marble tile diff --git a/Resources/Locale/ru-RU/_white/xenomorphs/face-hugger.ftl b/Resources/Locale/ru-RU/_white/xenomorphs/face-hugger.ftl index 9a545fce6eb..904fb192195 100644 --- a/Resources/Locale/ru-RU/_white/xenomorphs/face-hugger.ftl +++ b/Resources/Locale/ru-RU/_white/xenomorphs/face-hugger.ftl @@ -5,7 +5,3 @@ xenomorphs-face-hugger-unequip = { $equipment } прицепился слишк xenomorphs-face-hugger-try-equip = { $equipment } врезается в твой { $equipmentBlocker } xenomorphs-face-hugger-try-equip-other = { $equipment } врезается в { $equipmentBlocker } { $target } - -<#-- Goob station -- > -xenomorphs-face-hugger-mask-blocked = Твой { $mask } блокирует { $facehugger }! -xenomorphs-face-hugger-mask-blocked-other = { $facehugger } блокируется { $mask } { $target }! diff --git a/Resources/Maps/Shuttles/cargo_syndicate.yml b/Resources/Maps/Shuttles/cargo_syndicate.yml index 766a034af2a..1c0784b06ab 100644 --- a/Resources/Maps/Shuttles/cargo_syndicate.yml +++ b/Resources/Maps/Shuttles/cargo_syndicate.yml @@ -1,10 +1,31 @@ +# SPDX-FileCopyrightText: 2022 20kdc +# SPDX-FileCopyrightText: 2022 Nemanja <98561806+EmoGarbage404@users.noreply.github.com> +# SPDX-FileCopyrightText: 2022 Peptide90 <78795277+Peptide90@users.noreply.github.com> +# SPDX-FileCopyrightText: 2022 metalgearsloth +# SPDX-FileCopyrightText: 2022 retequizzle <67210376+retequizzle@users.noreply.github.com> +# SPDX-FileCopyrightText: 2023 Dawid Bla <46636558+DawBla@users.noreply.github.com> +# SPDX-FileCopyrightText: 2023 Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> +# SPDX-FileCopyrightText: 2024 Emisse <99158783+Emisse@users.noreply.github.com> +# SPDX-FileCopyrightText: 2024 Flareguy <78941145+Flareguy@users.noreply.github.com> +# SPDX-FileCopyrightText: 2024 Kara +# SPDX-FileCopyrightText: 2024 Mangohydra <156087924+Mangohydra@users.noreply.github.com> +# SPDX-FileCopyrightText: 2024 Piras314 +# SPDX-FileCopyrightText: 2024 Ubaser <134914314+UbaserB@users.noreply.github.com> +# SPDX-FileCopyrightText: 2024 metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 GoobBot +# SPDX-FileCopyrightText: 2025 SX-7 +# SPDX-FileCopyrightText: 2025 TytosB +# +# SPDX-License-Identifier: AGPL-3.0-or-later + meta: format: 7 category: Grid - engineVersion: 264.0.0 + engineVersion: 260.2.0 forkId: "" forkVersion: "" - time: 09/18/2025 05:48:33 + time: 08/08/2025 03:35:28 entityCount: 197 maps: [] grids: @@ -13,13 +34,12 @@ orphans: - 1 nullspace: [] tilemap: - 4: Space - 2: FloorDark - 1: FloorDarkMono - 6: FloorShuttleBlack - 0: FloorSteel - 5: Lattice - 3: Plating + 0: Space + 29: FloorDark + 34: FloorDarkMono + 1: FloorReinforced + 81: FloorShuttleBlack + 124: Plating entities: - proto: "" entities: @@ -28,38 +48,30 @@ entities: - type: MetaData name: Syndicate cargo shuttle - type: Transform - pos: -0.5,-0.484375 + pos: -1.1116635,0.37235177 parent: invalid - type: MapGrid chunks: 0,0: ind: 0,0 - tiles: AAAAAAAAAAEAAAAAAAACAAAAAAAAAwAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAMAAAAAAAADAAAAAAAAAgAAAAAAAAMAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAIAAAAAAAADAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAAAAAAAAAAAMAAAAAAAADAAAAAAAAAwAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAMAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAADAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAAgAAAAAAAAIAAAAAAAADAAAAAAAAAwAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAMAAAAAAAADAAAAAAAAAwAAAAAAAAUAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAA== + tiles: fAAAAAAAAHwAAAAAAAB8AAAAAAAAfAAAAAAAAHwAAAAAAAAdAAAAAAAAHQAAAAAAAB0AAAAAAAAdAAAAAAAAHQAAAAAAAHwAAAAAAAAdAAAAAAAAHQAAAAAAAHwAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAHwAAAAAAAB8AAAAAAAAfAAAAAAAAHwAAAAAAAB8AAAAAAAAfAAAAAAAAHwAAAAAAAB8AAAAAAAAfAAAAAAAAHwAAAAAAAB8AAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== version: 7 0,-1: ind: 0,-1 - tiles: BAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAAwAAAAAAAAMAAAAAAAAFAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAMAAAAAAAADAAAAAAAAAwAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAADAAAAAAAAAwAAAAAAAAMAAAAAAAAFAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAAgAAAAAAAAIAAAAAAAADAAAAAAAABQAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAAAAAAAAAAGAAAAAAAAAwAAAAAAAAMAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAADAAAAAAAAAwAAAAAAAAIAAAAAAAADAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAAwAAAAAAAAMAAAAAAAACAAAAAAAAAwAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAA== - version: 7 - -1,0: - ind: -1,0 - tiles: BAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAMAAAAAAAACAAAAAAAAAQAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAADAAAAAAAAAgAAAAAAAAMAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAAwAAAAAAAAIAAAAAAAABAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAMAAAAAAAADAAAAAAAAAwAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAADAAAAAAAAAgAAAAAAAAIAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAAwAAAAAAAAIAAAAAAAACAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAMAAAAAAAADAAAAAAAAAgAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAFAAAAAAAAAwAAAAAAAAMAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAA== - version: 7 - -1,-1: - ind: -1,-1 - tiles: BAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAFAAAAAAAAAwAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAAwAAAAAAAAMAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABQAAAAAAAAMAAAAAAAADAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAUAAAAAAAADAAAAAAAAAgAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAADAAAAAAAAAwAAAAAAAAYAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAAwAAAAAAAAIAAAAAAAADAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAMAAAAAAAACAAAAAAAAAwAAAAAAAA== + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAB8AAAAAAAAfAAAAAAAAHwAAAAAAAB8AAAAAAAAfAAAAAAAAHwAAAAAAAB8AAAAAAAAfAAAAAAAAHwAAAAAAAB8AAAAAAAAfAAAAAAAAHwAAAAAAAAAAAAAAAAAfAAAAAAAAHwAAAAAAAB8AAAAAAAAfAAAAAAAAHwAAAAAAAAdAAAAAAAAHQAAAAAAAB0AAAAAAAAdAAAAAAAAHQAAAAAAAHwAAAAAAAAdAAAAAAAAHQAAAAAAAHwAAAAAAAB8AAAAAAAAAAAAAAAAAHwAAAAAAAB8AAAAAAAAfAAAAAAAAB0AAAAAAABRAAAAAAAAAQAAAAAAAAEAAAAAAAAiAAAAAAAAAQAAAAAAACIAAAAAAAB8AAAAAAAAHQAAAAAAAB0AAAAAAAAdAAAAAAAAfAAAAAAAAAAAAAAAAAB8AAAAAAAAfAAAAAAAAHwAAAAAAAAdAAAAAAAAHQAAAAAAAAEAAAAAAAABAAAAAAAAHQAAAAAAAAEAAAAAAAAdAAAAAAAAHQAAAAAAAB0AAAAAAAAdAAAAAAAAHQAAAAAAAHwAAAAAAAAAAAAAAAAAfAAAAAAAAHwAAAAAAAB8AAAAAAAAHQAAAAAAAFEAAAAAAAABAAAAAAAAAQAAAAAAACIAAAAAAAABAAAAAAAAIgAAAAAAAHwAAAAAAAAdAAAAAAAAHQAAAAAAAB0AAAAAAAB8AAAAAAAAAAAAAAAAAA== version: 7 - type: Broadphase - type: Physics bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 fixedRotation: False bodyType: Dynamic - type: Fixtures fixtures: {} - type: OccluderTree - type: SpreaderGrid - - type: Shuttle - dampingModifier: 0.25 - - type: ImplicitRoof + - type: CargoShuttle - type: GridPathfinding - type: Gravity gravityShakeSound: !type:SoundPathSpecifier @@ -69,1317 +81,1422 @@ entities: version: 2 nodes: - node: - color: '#79150096' + color: '#FFFFFFFF' + id: Bot + decals: + 40: 5,-1 + 41: 6,-1 + 42: 6,-2 + 43: 5,-2 + 44: 5,-3 + 45: 6,-3 + 46: 8,-3 + 47: 8,-2 + 48: 8,-1 + - node: + color: '#D4D4D419' id: FullTileOverlayGreyscale decals: - 15: -1,6 - 16: 0,6 - 17: 1,6 - 18: -2,5 - 19: -2,4 - 20: 2,4 - 21: 2,5 + 14: 4,-2 + 17: 7,-2 + 19: 9,-2 + 20: 10,-2 + 21: 11,-2 - node: color: '#79150096' - id: HalfTileOverlayGreyscale180 + id: HalfTileOverlayGreyscale270 decals: - 2: -1,-4 - 3: 0,-4 - 4: 1,-4 + 10: 13,-2 + 13: 3,-1 + 22: 3,-2 + 23: 3,-3 - node: color: '#79150096' - id: HalfTileOverlayGreyscale270 + id: QuarterTileOverlayGreyscale180 decals: - 5: -2,2 - 6: -2,1 - 7: -2,0 - 8: -2,-1 - 9: -2,-2 + 5: 12,-3 - node: color: '#79150096' - id: HalfTileOverlayGreyscale90 + id: QuarterTileOverlayGreyscale90 decals: - 10: 2,-2 - 11: 2,-1 - 12: 2,0 - 13: 2,1 - 14: 2,2 + 4: 12,-1 - node: color: '#79150096' - id: QuarterTileOverlayGreyscale + id: ThreeQuarterTileOverlayGreyscale decals: - 22: -1,5 + 6: 11,-4 + 8: 13,-1 - node: color: '#79150096' - id: QuarterTileOverlayGreyscale90 + id: ThreeQuarterTileOverlayGreyscale180 decals: - 23: 1,5 + 12: 12,0 + - node: + color: '#79150096' + id: ThreeQuarterTileOverlayGreyscale270 + decals: + 9: 13,-3 + 11: 11,0 + - node: + color: '#79150096' + id: ThreeQuarterTileOverlayGreyscale90 + decals: + 7: 12,-4 - node: color: '#FFFFFFFF' - id: WarnEndE + id: WarnEndN decals: - 0: -1,-3 + 29: 4,-3 - node: color: '#FFFFFFFF' - id: WarnEndW + id: WarnEndS decals: - 1: 1,-3 + 28: 4,-1 - type: GridAtmosphere version: 2 data: + tiles: + 0,0: + 0: 193 + 0,-1: + 0: 52929 + 1,-1: + 0: 65534 + 1,0: + 0: 78 + 2,0: + 0: 27 + 2,-1: + 0: 49083 + 3,0: + 0: 65 + 3,-1: + 0: 13105 + 0,-2: + 0: 49152 + 1,-2: + 0: 16384 + 2,-2: + 0: 4096 + 3,-2: + 0: 16384 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 chunkSize: 4 - type: GasTileOverlay - type: RadiationGridResistance + - type: ImplicitRoof - proto: AirCanister entities: - - uid: 140 + - uid: 123 components: - type: Transform - pos: -0.5,-3.5 + pos: 3.5,-0.5 parent: 1 - proto: AirlockCargoGlassLocked entities: - - uid: 107 + - uid: 68 components: - type: Transform rot: 1.5707963267948966 rad - pos: 0.5,3.5 + pos: 10.5,-1.5 parent: 1 - proto: AirlockGlassShuttleSyndicate entities: - - uid: 63 + - uid: 5 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -2.5,-0.5 + rot: 3.141592653589793 rad + pos: 8.5,1.5 parent: 1 - - uid: 64 + - uid: 60 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -2.5,1.5 + pos: 6.5,-4.5 parent: 1 - - uid: 65 + - uid: 139 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 3.5,1.5 + pos: 8.5,-4.5 parent: 1 - - uid: 66 + - uid: 146 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 3.5,-0.5 + rot: 3.141592653589793 rad + pos: 6.5,1.5 parent: 1 - proto: APCBasic entities: - - uid: 116 + - uid: 65 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,-2.5 + rot: 3.141592653589793 rad + pos: 4.5,-3.5 parent: 1 -- proto: BlastDoor +- proto: AtmosDeviceFanDirectional entities: - - uid: 67 + - uid: 10 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -2.5,5.5 + pos: 8.5,1.5 parent: 1 - - uid: 68 + - uid: 11 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -2.5,6.5 + rot: 3.141592653589793 rad + pos: 8.5,-4.5 parent: 1 - - uid: 69 + - uid: 58 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,6.5 + rot: 3.141592653589793 rad + pos: 6.5,-4.5 parent: 1 - - uid: 70 + - uid: 138 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,7.5 + pos: 6.5,1.5 parent: 1 - - uid: 71 +- proto: BlastDoor + entities: + - uid: 46 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -0.5,7.5 + rot: 1.5707963267948966 rad + pos: 5.5,1.5 parent: 1 - - uid: 72 + - uid: 47 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 0.5,7.5 + rot: 1.5707963267948966 rad + pos: 9.5,1.5 parent: 1 - - uid: 73 + - uid: 48 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 1.5,7.5 + rot: 1.5707963267948966 rad + pos: 5.5,-4.5 parent: 1 - - uid: 74 + - uid: 49 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,7.5 + rot: 1.5707963267948966 rad + pos: 9.5,-4.5 parent: 1 - - uid: 75 + - uid: 101 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,6.5 + rot: 3.141592653589793 rad + pos: 14.5,-3.5 parent: 1 - - uid: 76 + - uid: 102 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,6.5 + rot: 3.141592653589793 rad + pos: 13.5,-4.5 parent: 1 - - uid: 77 + - uid: 103 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,5.5 + rot: 3.141592653589793 rad + pos: 14.5,0.5 parent: 1 - - uid: 125 + - uid: 104 components: - type: Transform rot: 3.141592653589793 rad - pos: -2.5,-1.5 + pos: 13.5,1.5 parent: 1 - - uid: 126 + - uid: 106 components: - type: Transform rot: 3.141592653589793 rad - pos: -2.5,2.5 + pos: 12.5,1.5 parent: 1 - - uid: 127 + - uid: 107 components: - type: Transform - pos: 3.5,-1.5 + rot: 3.141592653589793 rad + pos: 13.5,0.5 parent: 1 - - uid: 128 + - uid: 108 components: - type: Transform - pos: 3.5,2.5 + rot: 3.141592653589793 rad + pos: 14.5,-0.5 parent: 1 -- proto: ButtonFrameCaution - entities: - - uid: 155 + - uid: 109 components: - type: Transform - pos: -0.5,3.5 + rot: 3.141592653589793 rad + pos: 14.5,-1.5 parent: 1 - - uid: 157 + - uid: 110 components: - type: Transform - pos: 1.5,3.5 + rot: 3.141592653589793 rad + pos: 14.5,-2.5 parent: 1 -- proto: CableApcExtension - entities: - - uid: 160 + - uid: 111 components: - type: Transform - pos: 2.5,-2.5 + rot: 3.141592653589793 rad + pos: 13.5,-3.5 parent: 1 - - uid: 161 + - uid: 112 components: - type: Transform - pos: 1.5,-2.5 + rot: 3.141592653589793 rad + pos: 12.5,-4.5 parent: 1 - - uid: 162 +- proto: ButtonFrameCaution + entities: + - uid: 171 components: - type: Transform - pos: 0.5,-2.5 + rot: -1.5707963267948966 rad + pos: 10.5,0.5 parent: 1 - - uid: 163 + - uid: 172 components: - type: Transform - pos: 0.5,-3.5 + rot: -1.5707963267948966 rad + pos: 10.5,-3.5 parent: 1 - - uid: 164 +- proto: CableApcExtension + entities: + - uid: 2 components: - type: Transform - pos: 0.5,-4.5 + pos: 3.5,0.5 parent: 1 - - uid: 165 + - uid: 6 components: - type: Transform - pos: 0.5,-5.5 + pos: 3.5,-2.5 parent: 1 - - uid: 166 + - uid: 12 components: - type: Transform - pos: -0.5,-3.5 + pos: 8.5,-3.5 parent: 1 - - uid: 167 + - uid: 13 components: - type: Transform - pos: -1.5,-3.5 + pos: 8.5,-2.5 parent: 1 - - uid: 168 + - uid: 14 components: - type: Transform - pos: 2.5,-3.5 + pos: 5.5,-3.5 parent: 1 - - uid: 169 + - uid: 15 components: - type: Transform - pos: 1.5,-5.5 + pos: 7.5,-3.5 parent: 1 - - uid: 170 + - uid: 17 components: - type: Transform - pos: -0.5,-5.5 + pos: 6.5,-3.5 parent: 1 - - uid: 171 + - uid: 18 components: - type: Transform - pos: 0.5,-1.5 + pos: 4.5,-3.5 parent: 1 - - uid: 172 + - uid: 19 components: - type: Transform - pos: 0.5,-0.5 + pos: 2.5,-1.5 parent: 1 - - uid: 173 + - uid: 23 components: - type: Transform - pos: -1.5,-0.5 + pos: 8.5,0.5 parent: 1 - - uid: 174 + - uid: 27 components: - type: Transform - pos: -0.5,-0.5 + pos: 8.5,-1.5 parent: 1 - - uid: 175 + - uid: 35 components: - type: Transform - pos: 1.5,-0.5 + pos: 8.5,-0.5 parent: 1 - - uid: 176 + - uid: 59 components: - type: Transform - pos: 2.5,-0.5 + pos: 4.5,-2.5 parent: 1 - - uid: 177 + - uid: 61 components: - type: Transform - pos: -1.5,0.5 + pos: 4.5,-3.5 parent: 1 - - uid: 178 + - uid: 69 components: - type: Transform - pos: -1.5,1.5 + pos: 10.5,-1.5 parent: 1 - - uid: 179 + - uid: 70 components: - type: Transform - pos: -1.5,2.5 + pos: 11.5,-1.5 parent: 1 - - uid: 180 + - uid: 71 components: - type: Transform - pos: 2.5,0.5 + pos: 12.5,-1.5 parent: 1 - - uid: 181 + - uid: 91 components: - type: Transform - pos: 2.5,1.5 + pos: 9.5,-1.5 parent: 1 - - uid: 182 + - uid: 97 components: - type: Transform - pos: 2.5,2.5 + pos: 5.5,-0.5 parent: 1 - - uid: 183 + - uid: 98 components: - type: Transform - pos: 0.5,2.5 + pos: 2.5,-2.5 parent: 1 - - uid: 184 + - uid: 99 components: - type: Transform - pos: -0.5,2.5 + pos: 7.5,0.5 parent: 1 - - uid: 185 + - uid: 119 components: - type: Transform - pos: 1.5,2.5 + pos: 5.5,0.5 parent: 1 - - uid: 186 + - uid: 122 components: - type: Transform - pos: 0.5,3.5 + pos: 6.5,0.5 parent: 1 - - uid: 187 + - uid: 135 components: - type: Transform - pos: 0.5,4.5 + pos: 12.5,-0.5 parent: 1 - - uid: 188 + - uid: 136 components: - type: Transform - pos: -0.5,4.5 + pos: 12.5,-2.5 parent: 1 - - uid: 189 + - uid: 152 components: - type: Transform - pos: -1.5,4.5 + pos: 4.5,-0.5 parent: 1 - - uid: 190 + - uid: 153 components: - type: Transform - pos: -1.5,5.5 + pos: 2.5,-0.5 parent: 1 - - uid: 191 + - uid: 154 + components: + - type: Transform + pos: 3.5,-0.5 + parent: 1 + - uid: 156 components: - type: Transform - pos: -1.5,6.5 + pos: 1.5,-1.5 parent: 1 - - uid: 192 + - uid: 166 components: - type: Transform - pos: -1.5,7.5 + pos: 12.5,0.5 parent: 1 - - uid: 193 + - uid: 173 components: - type: Transform - pos: 1.5,4.5 + pos: 1.5,-0.5 parent: 1 - - uid: 194 + - uid: 174 components: - type: Transform - pos: 2.5,4.5 + pos: 1.5,-2.5 parent: 1 - - uid: 195 + - uid: 175 components: - type: Transform - pos: 2.5,5.5 + pos: 12.5,-3.5 parent: 1 - - uid: 196 + - uid: 176 components: - type: Transform - pos: 2.5,6.5 + pos: 13.5,-3.5 parent: 1 - - uid: 197 + - uid: 177 components: - type: Transform - pos: 2.5,7.5 + pos: 13.5,0.5 parent: 1 - proto: CableHV entities: - - uid: 130 + - uid: 52 components: - type: Transform - pos: -0.5,-4.5 + pos: 2.5,-0.5 parent: 1 - - uid: 131 + - uid: 53 components: - type: Transform - pos: 0.5,-4.5 + pos: 2.5,-1.5 parent: 1 - - uid: 132 + - uid: 55 components: - type: Transform - pos: 1.5,-4.5 + pos: 2.5,-2.5 parent: 1 - - uid: 133 + - uid: 151 components: - type: Transform - pos: 1.5,-3.5 + pos: 3.5,-3.5 parent: 1 - - uid: 134 + - uid: 160 components: - type: Transform - pos: 2.5,-3.5 + pos: 3.5,-2.5 parent: 1 - proto: CableMV entities: - - uid: 135 + - uid: 26 components: - type: Transform - pos: 2.5,-3.5 + pos: 4.5,-3.5 parent: 1 - - uid: 136 + - uid: 56 components: - type: Transform pos: 2.5,-2.5 parent: 1 - - uid: 137 + - uid: 57 components: - type: Transform - pos: 1.5,-3.5 + pos: 3.5,-2.5 parent: 1 - - uid: 138 + - uid: 161 components: - type: Transform - pos: 1.5,-4.5 + pos: 3.5,-3.5 parent: 1 - proto: CableTerminal entities: - - uid: 129 + - uid: 22 components: - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,-4.5 + pos: 2.5,-0.5 parent: 1 - proto: CargoPallet entities: - - uid: 98 + - uid: 178 components: - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,-0.5 + rot: 3.141592653589793 rad + pos: 5.5,-0.5 parent: 1 - - uid: 99 + - uid: 187 components: - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,-1.5 + rot: 3.141592653589793 rad + pos: 5.5,-1.5 parent: 1 - - uid: 100 + - uid: 188 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,-0.5 + rot: 3.141592653589793 rad + pos: 5.5,-2.5 parent: 1 - - uid: 101 + - uid: 189 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,-1.5 + rot: 3.141592653589793 rad + pos: 6.5,-2.5 parent: 1 - - uid: 102 + - uid: 190 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 1.5,-0.5 + rot: 3.141592653589793 rad + pos: 6.5,-1.5 parent: 1 - - uid: 103 + - uid: 191 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 1.5,-1.5 + rot: 3.141592653589793 rad + pos: 6.5,-0.5 parent: 1 - - uid: 104 + - uid: 192 components: - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,1.5 + rot: 3.141592653589793 rad + pos: 8.5,-0.5 parent: 1 - - uid: 105 + - uid: 193 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,1.5 + rot: 3.141592653589793 rad + pos: 8.5,-1.5 parent: 1 - - uid: 106 + - uid: 194 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 1.5,1.5 + rot: 3.141592653589793 rad + pos: 8.5,-2.5 parent: 1 - proto: Catwalk entities: - - uid: 94 + - uid: 186 components: - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,-4.5 + pos: 1.5,-1.5 parent: 1 - - uid: 95 + - uid: 195 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,-4.5 + pos: 2.5,-1.5 parent: 1 - - uid: 96 + - uid: 196 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 1.5,-4.5 + pos: 2.5,-0.5 parent: 1 - - uid: 97 + - uid: 197 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,-5.5 + pos: 2.5,-2.5 parent: 1 - proto: ChairPilotSeat entities: - - uid: 83 + - uid: 116 components: - type: Transform - rot: 3.141592653589793 rad - pos: -0.5,5.5 + rot: 1.5707963267948966 rad + pos: 12.5,-0.5 parent: 1 - - uid: 84 + - uid: 117 components: - type: Transform - rot: 3.141592653589793 rad - pos: 1.5,5.5 + rot: 1.5707963267948966 rad + pos: 12.5,-1.5 parent: 1 - - uid: 85 + - uid: 118 components: - type: Transform - rot: 3.141592653589793 rad - pos: 0.5,5.5 + rot: 1.5707963267948966 rad + pos: 12.5,-2.5 parent: 1 - proto: ComputerBroken entities: - - uid: 88 + - uid: 66 components: - type: Transform - pos: 1.5,6.5 + rot: -1.5707963267948966 rad + pos: 13.5,-2.5 parent: 1 - proto: ComputerRadar entities: - - uid: 86 + - uid: 121 components: - type: Transform - pos: -0.5,6.5 + rot: -1.5707963267948966 rad + pos: 13.5,-0.5 parent: 1 -- proto: ComputerShuttleCargo +- proto: ComputerShuttle entities: - - uid: 87 + - uid: 34 components: - type: Transform - pos: 0.5,6.5 + rot: -1.5707963267948966 rad + pos: 13.5,-1.5 parent: 1 - proto: ConveyorBelt entities: - - uid: 146 + - uid: 134 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,2.5 + rot: 3.141592653589793 rad + pos: 5.5,0.5 parent: 1 - - uid: 147 + - uid: 162 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -2.5,2.5 + rot: 3.141592653589793 rad + pos: 5.5,1.5 parent: 1 - - uid: 148 + - uid: 179 components: - type: Transform - rot: 1.5707963267948966 rad - pos: -2.5,-1.5 + rot: 3.141592653589793 rad + pos: 9.5,-4.5 parent: 1 - - uid: 149 + - uid: 180 components: - type: Transform - rot: 1.5707963267948966 rad - pos: -1.5,-1.5 + rot: 3.141592653589793 rad + pos: 9.5,-3.5 parent: 1 - - uid: 150 + - uid: 181 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-1.5 + rot: 3.141592653589793 rad + pos: 5.5,-4.5 parent: 1 - - uid: 151 + - uid: 182 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,-1.5 + pos: 9.5,0.5 parent: 1 - - uid: 152 + - uid: 183 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 2.5,2.5 + pos: 9.5,1.5 parent: 1 - - uid: 153 + - uid: 184 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 3.5,2.5 + rot: 3.141592653589793 rad + pos: 5.5,-3.5 parent: 1 - proto: GasPipeBend entities: - - uid: 142 + - uid: 63 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 0.5,-3.5 + rot: 3.141592653589793 rad + pos: 3.5,-1.5 parent: 1 - proto: GasPipeStraight entities: - - uid: 143 + - uid: 73 components: - type: Transform - rot: 3.141592653589793 rad - pos: 0.5,-2.5 + rot: 1.5707963267948966 rad + pos: 4.5,-1.5 parent: 1 - - uid: 144 + - uid: 92 components: - type: Transform - rot: 3.141592653589793 rad - pos: 0.5,-1.5 + rot: 1.5707963267948966 rad + pos: 5.5,-1.5 parent: 1 - - uid: 145 + - uid: 100 components: - type: Transform - rot: 3.141592653589793 rad - pos: 0.5,-0.5 + rot: 1.5707963267948966 rad + pos: 6.5,-1.5 parent: 1 - proto: GasPort entities: - - uid: 139 + - uid: 21 components: - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,-3.5 + pos: 3.5,-0.5 parent: 1 - proto: GasVentPump entities: - - uid: 141 + - uid: 25 components: - type: Transform - pos: 0.5,0.5 + rot: -1.5707963267948966 rad + pos: 7.5,-1.5 parent: 1 - proto: GeneratorBasic15kW entities: - - uid: 111 + - uid: 41 components: - type: Transform - pos: -0.5,-4.5 + pos: 2.5,-0.5 parent: 1 - proto: GravityGeneratorMini entities: - - uid: 113 + - uid: 33 components: - type: Transform - pos: 0.5,-5.5 + pos: 1.5,-1.5 parent: 1 - proto: Grille entities: - - uid: 46 + - uid: 76 components: - type: Transform - pos: -2.5,5.5 + pos: 12.5,-4.5 parent: 1 - - uid: 47 + - uid: 77 components: - type: Transform - pos: -2.5,6.5 + rot: 3.141592653589793 rad + pos: 13.5,-4.5 parent: 1 - - uid: 48 + - uid: 78 components: - type: Transform - pos: -1.5,6.5 + rot: 3.141592653589793 rad + pos: 13.5,-3.5 parent: 1 - - uid: 49 + - uid: 79 components: - type: Transform - pos: -1.5,7.5 + rot: 3.141592653589793 rad + pos: 14.5,-3.5 parent: 1 - - uid: 50 + - uid: 80 components: - type: Transform - pos: -0.5,7.5 + rot: 3.141592653589793 rad + pos: 14.5,-2.5 parent: 1 - - uid: 51 + - uid: 81 components: - type: Transform - pos: 0.5,7.5 + rot: 3.141592653589793 rad + pos: 14.5,-1.5 parent: 1 - - uid: 52 + - uid: 82 components: - type: Transform - pos: 1.5,7.5 + rot: 3.141592653589793 rad + pos: 14.5,-0.5 parent: 1 - - uid: 53 + - uid: 83 components: - type: Transform - pos: 2.5,7.5 + rot: 3.141592653589793 rad + pos: 13.5,0.5 parent: 1 - - uid: 54 + - uid: 84 components: - type: Transform - pos: 2.5,6.5 + rot: 3.141592653589793 rad + pos: 14.5,0.5 parent: 1 - - uid: 55 + - uid: 85 components: - type: Transform - pos: 3.5,6.5 + rot: 3.141592653589793 rad + pos: 12.5,1.5 parent: 1 - - uid: 57 + - uid: 86 components: - type: Transform - pos: 3.5,5.5 + rot: 3.141592653589793 rad + pos: 13.5,1.5 parent: 1 - proto: Gyroscope entities: - - uid: 114 + - uid: 94 components: - type: Transform rot: 1.5707963267948966 rad - pos: 1.5,-4.5 + pos: 2.5,-2.5 parent: 1 - proto: HolopadCargoShuttle entities: - - uid: 108 + - uid: 32 components: - type: Transform - pos: 0.5,4.5 + pos: 11.5,-1.5 parent: 1 - proto: LockableButtonCargo entities: - - uid: 154 + - uid: 169 components: - type: Transform - pos: -0.5,3.5 + rot: -1.5707963267948966 rad + pos: 10.5,-3.5 parent: 1 - type: DeviceLinkSource linkedPorts: - 126: + 49: - - Pressed - Toggle - 125: + 48: - - Pressed - Toggle - - uid: 156 + - uid: 170 components: - type: Transform - pos: 1.5,3.5 + rot: -1.5707963267948966 rad + pos: 10.5,0.5 parent: 1 - type: DeviceLinkSource linkedPorts: - 128: + 47: - - Pressed - Toggle - 127: + 46: - - Pressed - Toggle - proto: LockerSyndicateShipGearBasic entities: - - uid: 109 + - uid: 28 components: - type: Transform - pos: -0.5,-2.5 + pos: 4.5,-2.5 parent: 1 - - uid: 110 + - uid: 31 components: - type: Transform - pos: 1.5,-2.5 + pos: 4.5,-0.5 parent: 1 - proto: MedkitFilled entities: - - uid: 91 + - uid: 115 components: - type: Transform - pos: 2.5400643,5.590234 + pos: 12.5,-3.5 parent: 1 - proto: PlasticFlapsAirtightClear entities: - - uid: 56 + - uid: 140 components: - type: Transform - pos: -2.5,-1.5 + rot: 1.5707963267948966 rad + pos: 5.5,-4.5 parent: 1 - - uid: 58 + - uid: 143 components: - type: Transform - pos: 3.5,-1.5 + rot: 1.5707963267948966 rad + pos: 9.5,-4.5 parent: 1 - - uid: 59 + - uid: 144 components: - type: Transform - pos: -2.5,2.5 + rot: 1.5707963267948966 rad + pos: 9.5,1.5 parent: 1 - - uid: 60 + - uid: 145 components: - type: Transform - pos: 3.5,2.5 + rot: 1.5707963267948966 rad + pos: 5.5,1.5 parent: 1 - proto: PlastitaniumWindow entities: - - uid: 34 + - uid: 124 components: - type: Transform - pos: -2.5,5.5 + rot: -1.5707963267948966 rad + pos: 12.5,1.5 parent: 1 - - uid: 36 + - uid: 125 components: - type: Transform - pos: -2.5,6.5 + rot: -1.5707963267948966 rad + pos: 13.5,1.5 parent: 1 - - uid: 37 + - uid: 126 components: - type: Transform - pos: -1.5,6.5 + rot: -1.5707963267948966 rad + pos: 13.5,0.5 parent: 1 - - uid: 38 + - uid: 127 components: - type: Transform - pos: -1.5,7.5 + rot: -1.5707963267948966 rad + pos: 14.5,0.5 parent: 1 - - uid: 39 + - uid: 129 components: - type: Transform - pos: -0.5,7.5 + rot: -1.5707963267948966 rad + pos: 14.5,-0.5 parent: 1 - - uid: 40 + - uid: 130 components: - type: Transform - pos: 0.5,7.5 + rot: -1.5707963267948966 rad + pos: 14.5,-1.5 parent: 1 - - uid: 41 + - uid: 131 components: - type: Transform - pos: 1.5,7.5 + rot: -1.5707963267948966 rad + pos: 14.5,-2.5 parent: 1 - - uid: 42 + - uid: 147 components: - type: Transform - pos: 2.5,7.5 + rot: -1.5707963267948966 rad + pos: 13.5,-3.5 parent: 1 - - uid: 43 + - uid: 148 components: - type: Transform - pos: 2.5,6.5 + rot: -1.5707963267948966 rad + pos: 14.5,-3.5 parent: 1 - - uid: 44 + - uid: 149 components: - type: Transform - pos: 3.5,6.5 + rot: -1.5707963267948966 rad + pos: 13.5,-4.5 parent: 1 - - uid: 45 + - uid: 150 components: - type: Transform - pos: 3.5,5.5 + rot: -1.5707963267948966 rad + pos: 12.5,-4.5 parent: 1 - proto: Poweredlight entities: - - uid: 123 + - uid: 16 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 3.5,-3.5 + pos: 3.5,-4.5 parent: 1 - - uid: 124 + - uid: 45 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -2.5,-3.5 + rot: 3.141592653589793 rad + pos: 3.5,1.5 parent: 1 - proto: PoweredSmallLight entities: - - uid: 117 + - uid: 42 components: - type: Transform - rot: 1.5707963267948966 rad - pos: -1.5,0.5 + rot: 3.141592653589793 rad + pos: 4.5,-2.5 parent: 1 - - uid: 118 + - uid: 51 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,0.5 + pos: 4.5,-0.5 parent: 1 - - uid: 119 + - uid: 128 components: - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,-3.5 + pos: 7.5,0.5 parent: 1 - - uid: 120 + - uid: 137 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 1.5,-3.5 + rot: 3.141592653589793 rad + pos: 7.5,-3.5 parent: 1 - - uid: 121 + - uid: 141 components: - type: Transform - rot: 3.141592653589793 rad - pos: 2.5,4.5 + rot: 1.5707963267948966 rad + pos: 11.5,0.5 parent: 1 - - uid: 122 + - uid: 142 components: - type: Transform - rot: 3.141592653589793 rad - pos: -1.5,4.5 + rot: 1.5707963267948966 rad + pos: 11.5,-3.5 parent: 1 - proto: SignalButton entities: - - uid: 93 + - uid: 133 components: + - type: MetaData + name: bridge blast door control - type: Transform - rot: 1.5707963267948966 rad - pos: -1.5,5.5 + rot: 3.141592653589793 rad + pos: 12.039636,0.26498932 parent: 1 - type: DeviceLinkSource linkedPorts: - 67: + 106: - - Pressed - Toggle - 68: + 104: - - Pressed - Toggle - 69: + 107: - - Pressed - Toggle - 70: + 103: - - Pressed - Toggle - 71: + 108: - - Pressed - Toggle - 72: + 109: - - Pressed - Toggle - 73: + 110: - - Pressed - Toggle - 74: + 101: - - Pressed - Toggle - 75: + 111: - - Pressed - Toggle - 76: + 102: - - Pressed - Toggle - 77: + 112: - - Pressed - Toggle - proto: SignSpace entities: - - uid: 61 + - uid: 155 components: - type: Transform - pos: -2.5,0.5 + rot: 1.5707963267948966 rad + pos: 7.5,-4.5 parent: 1 - - uid: 62 + - uid: 167 components: - type: Transform - pos: 3.5,0.5 + rot: 1.5707963267948966 rad + pos: 7.5,1.5 parent: 1 - proto: SMESBasic entities: - - uid: 112 + - uid: 54 components: - type: Transform - pos: 0.5,-4.5 + pos: 2.5,-1.5 parent: 1 - proto: SubstationWallBasic entities: - - uid: 115 + - uid: 64 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,-3.5 + rot: 3.141592653589793 rad + pos: 3.5,-3.5 parent: 1 - proto: TableReinforced entities: - - uid: 78 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,5.5 - parent: 1 - - uid: 79 + - uid: 87 components: - type: Transform rot: -1.5707963267948966 rad - pos: -1.5,5.5 + pos: 12.5,0.5 parent: 1 - - uid: 80 + - uid: 88 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,5.5 + pos: 11.5,0.5 parent: 1 - - uid: 81 + - uid: 89 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,4.5 + pos: 12.5,-3.5 parent: 1 - - uid: 82 + - uid: 90 components: - type: Transform rot: -1.5707963267948966 rad - pos: -1.5,4.5 + pos: 11.5,-3.5 parent: 1 - proto: Thruster entities: - - uid: 2 + - uid: 8 components: - type: Transform rot: 1.5707963267948966 rad - pos: -2.5,-3.5 + pos: 0.5,-3.5 parent: 1 - - uid: 3 + - uid: 50 components: - type: Transform - rot: 1.5707963267948966 rad - pos: -2.5,-4.5 + rot: 3.141592653589793 rad + pos: 3.5,-4.5 parent: 1 - - uid: 4 + - uid: 72 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-3.5 + rot: 1.5707963267948966 rad + pos: 0.5,0.5 parent: 1 - - uid: 5 + - uid: 96 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-4.5 + pos: 3.5,1.5 parent: 1 - - uid: 6 + - uid: 120 components: - type: Transform rot: 3.141592653589793 rad - pos: 2.5,-6.5 + pos: 2.5,-4.5 parent: 1 - - uid: 7 + - uid: 132 components: - type: Transform - rot: 3.141592653589793 rad - pos: -1.5,-6.5 + pos: 2.5,1.5 parent: 1 - - uid: 8 + - uid: 163 components: - type: Transform - pos: -2.5,7.5 + rot: -1.5707963267948966 rad + pos: 14.5,-4.5 parent: 1 - - uid: 9 + - uid: 185 components: - type: Transform - pos: 3.5,7.5 + rot: -1.5707963267948966 rad + pos: 14.5,1.5 parent: 1 - proto: ToolboxEmergencyFilled entities: - - uid: 89 + - uid: 113 components: - type: Transform - pos: 2.4619393,4.637109 + pos: 11.5,-3.5 parent: 1 - proto: TwoWayLever entities: - - uid: 158 + - uid: 67 components: - type: Transform - pos: -0.5,0.5 + rot: -1.5707963267948966 rad + pos: 7.5,-0.5 parent: 1 - type: DeviceLinkSource linkedPorts: - 146: - - - Left - - Reverse + 134: - - Right + - Reverse + - - Left - Forward - - Middle - Off - 147: + 162: - - Left - - Reverse - - - Right - Forward + - - Right + - Reverse - - Middle - Off - 149: + 182: - - Left - - Reverse - - - Right - Forward + - - Right + - Reverse - - Middle - Off - 148: + 183: - - Left - - Reverse - - - Right - Forward + - - Right + - Reverse - - Middle - Off - - uid: 159 + - uid: 168 components: - type: Transform - pos: 1.5,0.5 + rot: -1.5707963267948966 rad + pos: 7.5,-2.5 parent: 1 - type: DeviceLinkSource linkedPorts: - 152: + 180: - - Left - Reverse - - Right - Forward - - Middle - Off - 153: + 179: - - Left - Reverse - - Right - Forward - - Middle - Off - 151: + 184: - - Left - - Reverse - - - Right - Forward + - - Right + - Reverse - - Middle - Off - 150: + 181: - - Left - - Reverse - - - Right - Forward + - - Right + - Reverse - - Middle - Off - proto: WallPlastitanium entities: - - uid: 10 + - uid: 3 components: - type: Transform - pos: 0.5,-6.5 + rot: 1.5707963267948966 rad + pos: 10.5,-4.5 parent: 1 - - uid: 11 + - uid: 4 components: - type: Transform - pos: -0.5,-6.5 + pos: 2.5,0.5 parent: 1 - - uid: 12 + - uid: 7 components: - type: Transform - pos: -0.5,-5.5 + pos: 2.5,-3.5 parent: 1 - - uid: 13 + - uid: 9 components: - type: Transform - pos: -1.5,-5.5 + rot: 1.5707963267948966 rad + pos: 4.5,-3.5 parent: 1 - - uid: 14 + - uid: 20 components: - type: Transform - pos: 1.5,-6.5 + rot: -1.5707963267948966 rad + pos: 1.5,-2.5 parent: 1 - - uid: 15 + - uid: 24 components: - type: Transform - pos: 2.5,-5.5 + pos: 4.5,0.5 parent: 1 - - uid: 16 + - uid: 29 components: - type: Transform - pos: 1.5,-5.5 + rot: -1.5707963267948966 rad + pos: 0.5,-2.5 parent: 1 - - uid: 17 + - uid: 30 components: - type: Transform - pos: 2.5,-4.5 + rot: -1.5707963267948966 rad + pos: 0.5,-1.5 parent: 1 - - uid: 18 + - uid: 36 components: - type: Transform - pos: 2.5,-3.5 + rot: 1.5707963267948966 rad + pos: 10.5,-3.5 parent: 1 - - uid: 19 + - uid: 37 components: - type: Transform - pos: 2.5,-2.5 + rot: 1.5707963267948966 rad + pos: 10.5,-2.5 parent: 1 - - uid: 20 + - uid: 38 components: - type: Transform - pos: -1.5,-4.5 + rot: 1.5707963267948966 rad + pos: 10.5,-0.5 parent: 1 - - uid: 21 + - uid: 39 components: - type: Transform - pos: -1.5,-2.5 + rot: 1.5707963267948966 rad + pos: 10.5,0.5 parent: 1 - - uid: 22 + - uid: 40 components: - type: Transform - pos: -1.5,-3.5 + rot: 1.5707963267948966 rad + pos: 10.5,1.5 parent: 1 - - uid: 23 + - uid: 43 components: - type: Transform - pos: -2.5,-2.5 + rot: 1.5707963267948966 rad + pos: 3.5,-3.5 parent: 1 - - uid: 24 + - uid: 44 components: - type: Transform - pos: 3.5,-2.5 + pos: 3.5,0.5 parent: 1 - - uid: 25 + - uid: 62 components: - type: Transform - pos: 3.5,0.5 + rot: -1.5707963267948966 rad + pos: 0.5,-0.5 parent: 1 - - uid: 26 + - uid: 74 components: - type: Transform - pos: -2.5,0.5 + pos: 11.5,1.5 parent: 1 - - uid: 27 + - uid: 75 components: - type: Transform - pos: 3.5,3.5 + pos: 11.5,-4.5 parent: 1 - - uid: 28 + - uid: 93 components: - type: Transform - pos: -2.5,3.5 + pos: 4.5,-4.5 parent: 1 - - uid: 29 + - uid: 95 components: - type: Transform - pos: -1.5,3.5 + pos: 4.5,1.5 parent: 1 - - uid: 30 + - uid: 157 components: - type: Transform - pos: -0.5,3.5 + pos: 7.5,1.5 parent: 1 - - uid: 31 + - uid: 158 components: - type: Transform - pos: 2.5,3.5 + pos: 7.5,-4.5 parent: 1 - - uid: 32 + - uid: 159 components: - type: Transform - pos: 1.5,3.5 + pos: 1.5,-3.5 parent: 1 - - uid: 33 + - uid: 164 components: - type: Transform - pos: 3.5,4.5 + rot: -1.5707963267948966 rad + pos: 1.5,-0.5 parent: 1 - - uid: 35 + - uid: 165 components: - type: Transform - pos: -2.5,4.5 + pos: 1.5,0.5 parent: 1 - proto: WeaponCapacitorRecharger entities: - - uid: 92 + - uid: 105 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,4.5 + rot: 3.141592653589793 rad + pos: 11.5,0.5 parent: 1 - proto: Wrench entities: - - uid: 90 + - uid: 114 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5713143,4.699609 + pos: 11.5,-3.5 parent: 1 ... diff --git a/Resources/Maps/_Goobstation/serpentcrest.yml b/Resources/Maps/_Goobstation/serpentcrest.yml index d1ddd87c0f3..56df7eae45f 100644 --- a/Resources/Maps/_Goobstation/serpentcrest.yml +++ b/Resources/Maps/_Goobstation/serpentcrest.yml @@ -4,8 +4,8 @@ meta: engineVersion: 264.0.0 forkId: "" forkVersion: "" - time: 09/15/2025 21:33:38 - entityCount: 28316 + time: 09/15/2025 17:25:22 + entityCount: 28305 maps: - 1 grids: @@ -111425,6 +111425,15 @@ entities: - type: Transform pos: -39.5,37.5 parent: 2 +- proto: GatfruitSeeds + entities: + - uid: 20986 + components: + - type: Transform + parent: 10443 + - type: Physics + canCollide: False + - type: InsideEntityStorage - proto: Gauze entities: - uid: 10431 @@ -125087,6 +125096,46 @@ entities: - type: Transform pos: 15.5,-16.5 parent: 2 +- proto: LockerBotanistLoot + entities: + - uid: 10443 + components: + - type: Transform + pos: 68.5,19.5 + parent: 2 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.14624 + moles: + - 1.606311 + - 6.042789 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - type: ContainerContainer + containers: + entity_storage: !type:Container + showEnts: False + occludes: True + ents: + - 20986 + paper_label: !type:ContainerSlot + showEnts: False + occludes: True + ent: null - uid: 10444 components: - type: Transform @@ -150359,70 +150408,6 @@ entities: - type: Transform pos: 30.5,46.5 parent: 2 - - uid: 28304 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,-7.5 - parent: 2 - - uid: 28305 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,-21.5 - parent: 2 - - uid: 28308 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,-54.5 - parent: 2 - - uid: 28309 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 14.5,-53.5 - parent: 2 - - uid: 28310 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 23.5,-45.5 - parent: 2 - - uid: 28311 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 34.5,-35.5 - parent: 2 - - uid: 28312 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 45.5,-3.5 - parent: 2 - - uid: 28313 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -4.5,-1.5 - parent: 2 - - uid: 28314 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -53.5,1.5 - parent: 2 - - uid: 28315 - components: - - type: Transform - pos: -72.5,-6.5 - parent: 2 - - uid: 28316 - components: - - type: Transform - pos: -42.5,-23.5 - parent: 2 - proto: StationMapBroken entities: - uid: 22819 diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/security.yml b/Resources/Prototypes/Catalog/Fills/Lockers/security.yml index 92b846f37a6..6e6866edbc9 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/security.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/security.yml @@ -122,7 +122,7 @@ - id: RemoteSignaller amount: 2 - id: Binoculars - - id: WardenGunCase # Omu + - id: WeaponEnergyShotgun # Goobstation - id: ClothingHandsGlovesKravMaga # Goobstation - Martial Arts - id: BoxLethalInjection # Goobstation - id: ClothingHeadsetAltWarden # Goobstation diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml index a847fd78210..10a63cab25a 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml @@ -159,6 +159,7 @@ ClothingNeckCloakCOG: 3 # Monolith ClothingShoesClothwrap: 3 # NF ClothingNeckPonchoBlack: 3 # Monolith + ClothingNeckPonchoBlackStripe: 3 # Monolith ClothingNeckPonchoArctic: 3 # Monolith ClothingNeckPonchoSyndicate: 3 # Monolith ClothingNeckPonchoSmallPink: 3 # Monolith diff --git a/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml b/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml index dabde3b9eaf..c931266fbd7 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml @@ -605,8 +605,8 @@ - type: entity parent: ClothingHeadHardsuitWithLightBase id: ClothingHeadHelmetHardsuitRd - name: sophia research hardsuit helmet # Omu edit - description: A heavily armored helmet worn over the Sophia hardsuit. # Omu edit + name: experimental research hardsuit helmet # Goob edit + description: Lightweight hardsuit helmet that doesn't restrict your head movements. # Goob edit components: - type: Sprite sprite: Clothing/Head/Hardsuits/rd.rsi @@ -619,13 +619,13 @@ lowPressureMultiplier: 1000 - type: Armor modifiers: - coefficients: #Omu - Making it viable to use again after awful goob nerfs + coefficients: #Goob - Modsuit edited all but pierce/blunt Blunt: 0.7 Slash: 0.9 Piercing: 0.95 - Heat: 0.30 - Radiation: 0.01 - Caustic: 0.35 + Heat: 0.45 + Radiation: 0.05 + Caustic: 0.4 - type: Tag tags: - CorgiWearable diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml index 822d250c6d8..3afd2eec187 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml @@ -749,8 +749,8 @@ - type: entity parent: [ClothingOuterHardsuitBase, BaseGrandTheftContraband] id: ClothingOuterHardsuitRd - name: sophia research hardsuit # Omu edit - description: One of the few remaining research hardsuits from now destroyed Regalis sector. Designed to protect against hazardous, low pressure environments. Old but reliable. # Omu edit + name: experimental research hardsuit # Goob edit + description: A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor. components: - type: Sprite sprite: Clothing/OuterClothing/Hardsuits/rd.rsi @@ -761,19 +761,19 @@ lowPressureMultiplier: 1000 - type: Armor modifiers: - coefficients: #Omu - Making it viable to use again after awful goob nerfs - Blunt: 0.60 - Slash: 0.80 - Piercing: 0.90 - Heat: 0.35 - Shock: 0.75 - Radiation: 0.01 - Caustic: 0.35 + coefficients: #Goob - Modsuits all but pierce + Blunt: 0.65 + Slash: 0.85 + Piercing: 0.95 + Heat: 0.4 + Shock: 0.85 + Radiation: 0.05 + Caustic: 0.4 - type: ExplosionResistance - damageCoefficient: 0.10 #Goob - Modsuits /// Omu - Buffed to modsuit levels + damageCoefficient: 0.15 #Goob - Modsuits - type: ClothingSpeedModifier - walkModifier: 0.80 #Goob - Modsuits /// Omu - Slightly nerfed, still faster then modsuit - sprintModifier: 0.80 #Goob - Modsuits /// Omu - Slightly nerfed, still faster then modsuit + walkModifier: 0.85 #Goob - Modsuits + sprintModifier: 0.85 #Goob - Modsuits - type: HeldSpeedModifier - type: Item size: Huge @@ -792,11 +792,11 @@ price: 750 - type: StealTarget stealGroup: ClothingOuterHardsuitRd - - type: ModifyDelayedKnockdown # Goobstation /// OMU - Buffed to modsuit levels - delayDelta: 3 - knockdownTimeDelta: -3 - - type: StaminaResistance # Goobstation /// OMU - Buffed to modsuit levels - damageCoefficient: 0.5 + - type: ModifyDelayedKnockdown # Goobstation + delayDelta: 2 + knockdownTimeDelta: -2 + - type: StaminaResistance # Goobstation + damageCoefficient: 0.65 #Head of Security's Hardsuit, heavily edited by goob - type: entity diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml index be7361213d0..2a5b0572768 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml @@ -147,10 +147,9 @@ - map: [ "enum.HumanoidVisualLayers.Face" ] - map: [ "gloves" ] - map: [ "shoes" ] - - map: [ "belt" ] - map: [ "id" ] - map: [ "outerClothing" ] - - map: [ "beltalt" ] # Omu change. + - map: [ "belt" ] #Goobedit - Belts over outerwear - map: [ "enum.HumanoidVisualLayers.Tail" ] # Mentioned in moth code: This needs renaming lol. - map: [ "back" ] - map: [ "neck" ] @@ -176,7 +175,6 @@ visible: false - type: Inventory templateId: arachnid - speciesId: arachnid #Goobedit - Fix Arachnid specific textures - type: IgnoreSpiderWeb # Goobstation - type: entity diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index 13dafbb205f..1e033709f42 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -269,22 +269,20 @@ - map: [ "enum.HumanoidVisualLayers.LArm" ] - map: [ "enum.HumanoidVisualLayers.RLeg" ] - map: [ "enum.HumanoidVisualLayers.LLeg" ] - - map: [ "enum.HumanoidVisualLayers.Underwear" ] # Goob 3370 - - map: [ "enum.HumanoidVisualLayers.Undershirt" ] # Goob 3370 + - map: [ "enum.HumanoidVisualLayers.Underwear" ] + - map: [ "enum.HumanoidVisualLayers.Undershirt" ] - map: ["jumpsuit"] - map: ["enum.HumanoidVisualLayers.LFoot"] - map: ["enum.HumanoidVisualLayers.RFoot"] - map: ["enum.HumanoidVisualLayers.LHand"] - map: ["enum.HumanoidVisualLayers.RHand"] - - map: ["enum.HumanoidVisualLayers.Face"] #Omu 120 - why did we have face on dummy but not basespecies - map: [ "gloves" ] - map: [ "shoes" ] - map: [ "ears" ] - map: [ "eyes" ] - - map: [ "belt" ] - map: [ "id" ] - map: [ "outerClothing" ] - - map: [ "beltalt" ] # Omu change. + - map: [ "belt" ] #Goobedit - Belts over outerwear - map: [ "back" ] - map: [ "neck" ] - map: [ "enum.HumanoidVisualLayers.FacialHair" ] @@ -458,9 +456,6 @@ enum.WizardTeleportUiKey.Key: # Goobstation - wizard type: WizardTeleportBoundUserInterface requireInputValidation: false - enum.InstrumentUiKey.Key: # Omustation - Required to make the Singer trait work - type: InstrumentBoundUserInterface - requireInputValidation: false - type: Puller - type: Speech speechSounds: Alto @@ -606,8 +601,8 @@ - map: [ "enum.HumanoidVisualLayers.LArm" ] - map: [ "enum.HumanoidVisualLayers.RLeg" ] - map: [ "enum.HumanoidVisualLayers.LLeg" ] - - map: [ "enum.HumanoidVisualLayers.Underwear" ] # Goob 3370 - - map: [ "enum.HumanoidVisualLayers.Undershirt" ] # Goob 3370 + - map: [ "enum.HumanoidVisualLayers.Underwear" ] + - map: [ "enum.HumanoidVisualLayers.Undershirt" ] - map: ["jumpsuit"] - map: ["enum.HumanoidVisualLayers.LFoot"] - map: ["enum.HumanoidVisualLayers.RFoot"] @@ -618,14 +613,14 @@ sprite: Objects/Misc/handcuffs.rsi state: body-overlay-2 visible: false - - map: [ "enum.HumanoidVisualLayers.Face" ] # Goob 3370 + - map: [ "enum.HumanoidVisualLayers.Face" ] - map: [ "gloves" ] - map: [ "shoes" ] - map: [ "ears" ] - map: [ "eyes" ] - - map: [ "belt" ] - map: [ "id" ] - map: [ "outerClothing" ] + - map: [ "belt" ] #Goobedit - Belts over outerwear - map: [ "back" ] - map: [ "neck" ] - map: [ "enum.HumanoidVisualLayers.FacialHair" ] diff --git a/Resources/Prototypes/Entities/Mobs/Species/moth.yml b/Resources/Prototypes/Entities/Mobs/Species/moth.yml index 592a43642e0..b778184cc8d 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/moth.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/moth.yml @@ -227,10 +227,9 @@ - map: [ "shoes" ] - map: [ "ears" ] - map: [ "eyes" ] - - map: [ "belt" ] - map: [ "id" ] - map: [ "outerClothing" ] - - map: [ "beltalt" ] # Omu change. + - map: [ "belt" ] #Goobedit - Belts over outerwear - map: [ "enum.HumanoidVisualLayers.Tail" ] #in the utopian future we should probably have a wings enum inserted here so everyhting doesn't break - map: [ "back" ] - map: [ "neck" ] diff --git a/Resources/Prototypes/Entities/Mobs/Species/vox.yml b/Resources/Prototypes/Entities/Mobs/Species/vox.yml index f877b2b23e9..49e8279688b 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/vox.yml @@ -210,10 +210,9 @@ - map: [ "shoes" ] - map: [ "ears" ] - map: [ "eyes" ] - - map: [ "belt" ] - map: [ "id" ] - map: [ "outerClothing" ] - - map: [ "beltalt" ] # Omu + - map: [ "belt" ] #Goobedit - Belts over outerwear - map: [ "back" ] - map: [ "enum.HumanoidVisualLayers.Face" ] - map: [ "neck" ] diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/bread.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/bread.yml index 18bcb5141bb..fdf87221840 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/bread.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/bread.yml @@ -807,7 +807,7 @@ quickEquip: false - type: Item shape: - - 0,0,0,2 # Goobedit + - 0,0,0,3 storedRotation: -45 inhandVisuals: left: diff --git a/Resources/Prototypes/Entities/Objects/Misc/implanters.yml b/Resources/Prototypes/Entities/Objects/Misc/implanters.yml index 499bc2919b5..11de7282f8c 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/implanters.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/implanters.yml @@ -209,7 +209,7 @@ - type: entity id: SadTromboneImplanter - suffix: Sad Trombone + name: sad trombone implanter parent: BaseImplantOnlyImplanter components: - type: Implanter @@ -217,7 +217,7 @@ - type: entity id: LightImplanter - suffix: Light + name: light implanter parent: BaseImplantOnlyImplanter components: - type: Implanter @@ -225,7 +225,7 @@ - type: entity id: BikeHornImplanter - suffix: Bike Horn + name: bike horn implanter parent: BaseImplantOnlyImplanter components: - type: Implanter @@ -235,7 +235,7 @@ - type: entity id: TrackingImplanter - suffix: Tracking + name: tracking implanter parent: BaseImplantOnlyImplanter components: - type: Implanter @@ -245,7 +245,7 @@ - type: entity id: StorageImplanter - suffix: Storage + name: storage implanter parent: BaseImplantOnlyImplanterSyndi components: - type: Implanter @@ -253,7 +253,7 @@ - type: entity id: FreedomImplanter - suffix: Freedom + name: freedom implanter parent: BaseImplantOnlyImplanterSyndi components: - type: Implanter @@ -261,7 +261,7 @@ - type: entity id: RadioImplanter - suffix: Syndicate Radio + name: syndicate radio implanter parent: BaseImplantOnlyImplanterSyndi components: - type: Implanter @@ -269,7 +269,7 @@ - type: entity id: UplinkImplanter - suffix: Uplink + name: uplink implanter parent: BaseImplantOnlyImplanterSyndi components: - type: Implanter @@ -277,7 +277,7 @@ - type: entity id: EmpImplanter - suffix: EMP + name: EMP implanter parent: BaseImplantOnlyImplanterSyndi components: - type: Implanter @@ -285,7 +285,7 @@ - type: entity id: ScramImplanter - suffix: Scram + name: scram implanter parent: BaseImplantOnlyImplanterSyndi components: - type: Implanter @@ -293,7 +293,7 @@ - type: entity id: DnaScramblerImplanter - suffix: DNA scrambler + name: DNA scrambler implanter parent: BaseImplantOnlyImplanterSyndi components: - type: Implanter @@ -301,7 +301,7 @@ - type: entity id: ChameleonControllerImplanter - suffix: Chameleon Controller + name: chameleon controller implanter parent: BaseImplantOnlyImplanterSyndi components: - type: Implanter @@ -311,7 +311,7 @@ - type: entity id: MicroBombImplanter - suffix: Micro-Bomb + name: micro-bomb implanter parent: BaseImplantOnlyImplanterSyndi components: - type: Implanter @@ -319,7 +319,7 @@ - type: entity id: MacroBombImplanter - suffix: Macro-Bomb + name: macro-bomb implanter parent: BaseImplantOnlyImplanterSyndi components: - type: Implanter @@ -327,7 +327,7 @@ - type: entity id: DeathRattleImplanter - suffix: Death Rattle + name: death rattle implanter parent: BaseImplantOnlyImplanterSyndi components: - type: Implanter @@ -335,7 +335,7 @@ - type: entity id: DeathAcidifierImplanter - suffix: Death Acidifier + name: death acidifier implanter parent: BaseImplantOnlyImplanterSyndi components: - type: Implanter @@ -343,7 +343,7 @@ - type: entity id: FakeMindShieldImplanter - suffix: Fake Mindshield + name: fake mindshield implanter parent: BaseImplantOnlyImplanterSyndi components: - type: Implanter @@ -353,7 +353,7 @@ - type: entity id: MindShieldImplanter - suffix: Mindshield + name: mindshield implanter parent: BaseImplantOnlyImplanter components: - type: Implanter @@ -363,7 +363,7 @@ - type: entity id: RadioImplanterCentcomm - suffix: Centcomm Radio + name: centcomm radio implanter parent: BaseImplantOnlyImplanterCentcomm # Goobstation components: - type: Implanter @@ -371,8 +371,8 @@ - type: entity id: DeathRattleImplanterCentcomm - suffix: Death Rattle - parent: BaseImplantOnlyImplanterCentcomm # Goobstation + name: centcomm death rattle implanter + parent: BaseImplantOnlyImplanter components: - type: Implanter implant: DeathRattleImplantCentcomm diff --git a/Resources/Prototypes/Entities/Objects/Misc/tiles.yml b/Resources/Prototypes/Entities/Objects/Misc/tiles.yml index 477997a5592..edf55b638a9 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/tiles.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/tiles.yml @@ -1851,95 +1851,3 @@ energy: 0.8 castShadows: false color: "#9be792" - -- type: entity - id: FloorTileItemXeno - parent: FloorTileItemBase - name: xeno floor - components: - - type: Sprite - state: xenofloor - - type: Item - heldPrefix: steel - - type: FloorTile - outputs: - - Plating - - FloorXeno - - type: Stack - stackType: FloorTileXeno - -- type: entity - id: FloorTileItemXenoSteel - parent: FloorTileItemBase - name: xeno steel floor - components: - - type: Sprite - state: xeno-steel - - type: Item - heldPrefix: steel - - type: FloorTile - outputs: - - Plating - - FloorXenoSteel - - type: Stack - stackType: FloorTileXenoSteel - -- type: entity - id: FloorTileItemXenoSteelCorner - parent: FloorTileItemBase - name: xeno steel corner floor - components: - - type: Sprite - state: xeno-steel-corner - - type: Item - heldPrefix: steel - - type: FloorTile - outputs: - - Plating - - FloorXenoSteelCorner - - type: Stack - stackType: FloorTileXenoSteelCorner - -- type: entity - name: xeno techmaint floor - parent: FloorTileItemBase - id: FloorTileItemXenoMaint - components: - - type: Sprite - state: xeno-techmaint - - type: Item - heldPrefix: dark - - type: FloorTile - outputs: - - Plating - - FloorXenoMaint - - type: Stack - stackType: FloorTileXenoMaint - -- type: entity - id: FloorTileItemXenoborg - parent: FloorTileItemBase - name: xenoborg floor - components: - - type: Sprite - state: xenoborg-floor - - type: FloorTile - outputs: - - Plating - - FloorXenoborg - - type: Stack - stackType: FloorTileXenoborg - -- type: entity - parent: FloorTileItemDark - id: FloorTileItemDarkSquiggly - name: dark steel squiggly tile - components: - - type: Sprite - state: dark-squiggly - - type: FloorTile - outputs: - - Plating - - FloorDarkSquiggly - - type: Stack - stackType: FloorTileDarkSquiggly diff --git a/Resources/Prototypes/Entities/Objects/Tools/matches.yml b/Resources/Prototypes/Entities/Objects/Tools/matches.yml index 4757dd42a22..f86151eeee3 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/matches.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/matches.yml @@ -202,5 +202,3 @@ color: green - type: Matchstick duration: 30 - - type: ScannableForPoints # goob edit - points: 1 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml index 94c202c1622..51453c7e054 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml @@ -244,8 +244,6 @@ - type: Item # Goob edit size: Large storedRotation: 45 - - type: ScannableForPoints # goob edit - points: 2 - type: entity name: Hristov diff --git a/Resources/Prototypes/Entities/Objects/Weapons/security.yml b/Resources/Prototypes/Entities/Objects/Weapons/security.yml index 45700ff4f94..46b0bc3edc8 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/security.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/security.yml @@ -338,6 +338,9 @@ guides: - Security - Antagonists + - type: Tag + tags: + - Flash - type: entity name: flash diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml index a2ae5a47bf5..acb26075892 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml @@ -263,14 +263,6 @@ - type: Paintable group: null -- type: entity - parent: Airlock - id: AirlockXenoborg - name: xenoborg airlock - components: - - type: Sprite - sprite: Structures/Doors/Airlocks/Standard/xenoborg.rsi - - type: entity parent: Airlock id: AirlockHatchMaintenance diff --git a/Resources/Prototypes/Entities/Structures/Machines/nuke.yml b/Resources/Prototypes/Entities/Structures/Machines/nuke.yml index 0bf25dc5a80..1c793f43473 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/nuke.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/nuke.yml @@ -115,7 +115,7 @@ explosionType: Default maxIntensity: 100 intensitySlope: 5 - totalIntensity: 5000000 + totalIntensity: 800000 # Goobedit bandaid fix for some reason values higher than 1000000 just stop working diskSlot: name: nuke-slot-component-slot-name-disk insertSound: diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 05398ebb127..a58d6c8be23 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -177,7 +177,6 @@ - id: DerelictCyborgSyndicateSpawn # Goobstation - usually calm - id: MalignRiftSpawn # DeltaV - id: FloorGoblinSpawn # Goobstation - - id: HellGooseSpawn # Goobstation - type: entityTable id: BasicAntagEventsTable @@ -264,7 +263,7 @@ weight: 8 duration: 35 chaos: # Goobstation - Anomaly: 100 # Omu, chaos score increased from 40 + Anomaly: 40 eventType: Chaotic # Goobstation - type: BluespaceArtifactRule @@ -273,7 +272,7 @@ parent: BaseGameRule components: - type: StationEvent - weight: 4 # OMU change - make it more likely to balance out other anom chaos events + weight: 2 reoccurrenceDelay: 5 earliestStart: 1 duration: 1 @@ -353,10 +352,9 @@ id: DragonSpawn components: - type: StationEvent - weight: 2 # Goobstation - was 3 + weight: 2 earliestStart: 45 - #recorruenceDelay: 20 # Goobstation - no longer needed - maxOccurrences: 1 # Goobstation + maxOccurrences: 1 minimumPlayers: 50 duration: null chaos: # Goobstation @@ -368,7 +366,7 @@ eventType: HostilesSpawn # Goobstation # Goobstation - type: GameRule - chaosScore: 800 # OMU change - make chaos cost higher + chaosScore: 600 - type: SpaceSpawnRule spawnDistance: 0 - type: AntagSpawner @@ -393,11 +391,10 @@ id: NinjaSpawn components: - type: StationEvent - weight: 4 # OMU change - make ninja less likely + weight: 3 duration: null - earliestStart: 30 # Goobstation - was 45 - #reoccurrenceDelay: 20 # Goobstation - no longer needed - maxOccurrences: 1 # Goobstation + earliestStart: 30 + maxOccurrences: 1 minimumPlayers: 30 chaos: # Goobstation Hostile: 20 @@ -408,7 +405,7 @@ eventType: HostilesSpawn # Goobstation # Goobstation - type: GameRule - chaosScore: 500 # OMU change - make chaos score cost higher + chaosScore: 300 - type: SpaceSpawnRule - type: AntagLoadProfileRule # Goobstation start @@ -463,7 +460,7 @@ id: ParadoxCloneSpawn components: - type: StationEvent - weight: 10 # OMU change - Make paradox more likely + weight: 5 duration: null earliestStart: 20 reoccurrenceDelay: 20 @@ -697,7 +694,7 @@ path: /Audio/Announcements/aliens.ogg earliestStart: 20 minimumPlayers: 15 - weight: 7 # Goobstation - was 5 + weight: 7 duration: 30 # DeltaV: was 60, used as a delay now chaos: # Goobstation Hostile: 20 @@ -723,7 +720,7 @@ path: /Audio/Announcements/attention.ogg earliestStart: 20 minimumPlayers: 15 - weight: 7 # Goobstation - was 5 + weight: 7 duration: 30 # DeltaV: was 60, used as a delay now chaos: # Goobstation Hostile: 20 @@ -749,7 +746,7 @@ path: /Audio/Announcements/aliens.ogg earliestStart: 20 minimumPlayers: 15 - weight: 7 # Goobstation - was 5 + weight: 7 duration: 30 # DeltaV: was 60, used as a delay now chaos: # Goobstation Hostile: 20 @@ -772,7 +769,7 @@ path: /Audio/Announcements/attention.ogg earliestStart: 45 # DeltaV - was 20 minimumPlayers: 30 # DeltaV - was 20 - weight: 3 # Goobstation - was 1.5 + weight: 3 # DeltaV - was 1.5 duration: 30 # DeltaV: was 60, used as a delay now chaos: # Goobstation Hostile: 20 @@ -791,7 +788,7 @@ parent: BaseGameRule components: - type: StationEvent - earliestStart: 60 # Goobstation - was 90 (impossible on goob) + earliestStart: 60 minimumPlayers: 40 weight: 1 # Zombies was happening basically every single survival round, so now it's super rare duration: 1 @@ -833,9 +830,9 @@ id: LoneOpsSpawn components: - type: StationEvent - earliestStart: 60 # OMU change - make lone-ops spawn later - weight: 5.5 #Omu - minimumPlayers: 20 #Omu keeping it lower for now cause playercount + earliestStart: 35 + weight: 2.5 + minimumPlayers: 50 duration: 1 chaos: # Goobstation Hostile: 200 @@ -844,7 +841,7 @@ eventType: HostilesSpawn # Goobstation # Goobstation - type: GameRule - chaosScore: 900 # OMU change - raises chaos cost + chaosScore: 700 - type: RuleGrids - type: LoadMapRule gridPath: /Maps/Shuttles/ShuttleEvent/striker.yml diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml index a588d86d517..8035557bc20 100644 --- a/Resources/Prototypes/GameRules/roundstart.yml +++ b/Resources/Prototypes/GameRules/roundstart.yml @@ -110,6 +110,7 @@ # SPDX-FileCopyrightText: 2025 GoobBot # SPDX-FileCopyrightText: 2025 Ilya246 <57039557+Ilya246@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Ilya246 +# SPDX-FileCopyrightText: 2025 IrisTheAmped # SPDX-FileCopyrightText: 2025 MilenVolf <63782763+MilenVolf@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 PunishedJoe # SPDX-FileCopyrightText: 2025 SX-7 <92227810+SX-7@users.noreply.github.com> @@ -126,6 +127,7 @@ # SPDX-FileCopyrightText: 2025 deltanedas <39013340+deltanedas@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 gus # SPDX-FileCopyrightText: 2025 keronshb <54602815+keronshb@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 loltart <159829224+loltart@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 loltart # SPDX-FileCopyrightText: 2025 pheenty # SPDX-FileCopyrightText: 2025 slarticodefast <161409025+slarticodefast@users.noreply.github.com> @@ -160,8 +162,6 @@ prob: 0.2 - id: Devil # Goob prob: 0.02 - - id: Shadowling # Goob - prob: 0.09 - type: entity parent: BaseGameRule @@ -388,13 +388,12 @@ selectionTime: IntraPlayerSpawn # Goobstation definitions: - prefRoles: [ HeadRev ] - min: 2 max: 3 playerRatio: 15 blacklist: components: - CommandStaff # Goobstation -# jobBlacklist: [ Mime ] # Goobstation # Omu, revert bookrevs + jobBlacklist: [ Mime ] # Goobstation briefing: text: head-rev-role-greeting color: CornflowerBlue diff --git a/Resources/Prototypes/Loadouts/loadout_groups.yml b/Resources/Prototypes/Loadouts/loadout_groups.yml index 3a7a2ebf9b8..44fdcb90fb4 100644 --- a/Resources/Prototypes/Loadouts/loadout_groups.yml +++ b/Resources/Prototypes/Loadouts/loadout_groups.yml @@ -124,7 +124,6 @@ # SPDX-FileCopyrightText: 2024 Арт <123451459+JustArt1m@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Aiden -# SPDX-FileCopyrightText: 2025 AstroDogeDX <48888500+AstroDogeDX@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Aviu00 <93730715+Aviu00@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Aviu00 # SPDX-FileCopyrightText: 2025 BloodfiendishOperator <141253729+Diggy0@users.noreply.github.com> @@ -201,32 +200,6 @@ - ClothingNeckGenderfluidPin - ClothingNeckTransPin - ClothingNeckAutismPin - # Omu start - - ClothingNeckCloakProgressPride - - ClothingNeckCloakTrans - - ClothingNeckCloakGenderfluid - - ClothingNeckCloakAro - - ClothingNeckCloakAce - - ClothingNeckCloakBi - - ClothingNeckCloakIntersex - - ClothingNeckCloakLesbian - - ClothingNeckCloakGay - - ClothingNeckCloakEnby - - ClothingNeckCloakPan - - ClothingNeckScarfStripedAce - - ClothingNeckScarfStripedAro - - ClothingNeckScarfStripedAroace - - ClothingNeckScarfStripedBiSexual - - ClothingNeckScarfStripedGay - - ClothingNeckScarfStripedInter - - ClothingNeckScarfStripedLesbian - - ClothingNeckScarfStripedPan - - ClothingNeckScarfStripedNonBinary - - ClothingNeckScarfStripedRainbow - - ClothingNeckScarfStripedTrans - - ClothingNeckScarfStripedGenderfluid - - ClothingNeckChameleonPride - # Omu end - CardBoxBlack # GoobStation - CardBoxNanotrasen # GoobStation - FoodSnackLollypopWrapped # Goobstation @@ -296,7 +269,6 @@ - EmergencyPlasma - LoadoutSpeciesVoxNitrogen - LoadoutSpeciesPlasma # Goobstation - - EmergencyWaterVapor # Delta-V - EmergencySilicon # nitrogen or oxygen tank, depending on what your species needs @@ -307,7 +279,6 @@ loadouts: - LoadoutSpeciesEVANitrogen - LoadoutSpeciesEVAOxygen - - LoadoutSpeciesEVAWaterVapor # vox get a nitrogen tank, other species get nothing - type: loadoutGroup @@ -324,7 +295,6 @@ loadouts: - LoadoutSpeciesPocketDoubleNitrogen - LoadoutSpeciesPocketDoubleOxygen - - LoadoutSpeciesPocketDoubleWaterVapor # Command - type: loadoutGroup @@ -385,10 +355,6 @@ loadouts: - HoPJumpsuit - HoPJumpskirt - - HoPParadeUniformMale # OmuStation - - HoPParadeUniformFemale # OmuStation - - HoPTurtleneckMale # OmuStation - - HoPTurtleneckSkirtFemale # OmuStation - HoPJumpsuitMilitary # goob - HoPSummerShirt # goob @@ -416,9 +382,6 @@ minLimit: 0 loadouts: - HoPWintercoat - - ClothingFormalHoPCoat # Omu - - ClothingFormalHoPJacket # Omu - - ClothingFormalHoPDress # Omu # Civilian - type: loadoutGroup @@ -755,7 +718,6 @@ - EmergencyPlasmaClown - LoadoutSpeciesVoxNitrogen - LoadoutSpeciesPlasma # Goobstation - - EmergencyWaterVaporClown # Delta-V - EmergencySilicon - type: loadoutGroup @@ -817,7 +779,6 @@ - EmergencyPlasmaMime - LoadoutSpeciesVoxNitrogen - LoadoutSpeciesPlasma # Goobstation - - EmergencyWaterVaporMime # Delta-V - EmergencySilicon - type: loadoutGroup @@ -887,8 +848,6 @@ - QuartermasterJumpskirt - QuartermasterTurtleneck - QuartermasterTurtleneckSkirt - - QuartermasterUniform # OmuStation - - QuartermasterUniformSkirt # OmuStation - QuartermasterFormalSuit - QuartermasterMJ # goob - QMSummerShirt # goob @@ -929,12 +888,6 @@ loadouts: - CargoTechnicianJumpsuit - CargoTechnicianJumpskirt - # OmuStation Start - - CargoTechnicianSweater - - CargoTechnicianSweaterSkirt - - CargoTechnicianShortPantsIfuckinghateyouifyouwearthisbtw - - CargoTechnicianShortSkirtsInsteadofPants - # OmuStation End - CargoTechnicianJumpsuitMail # Goob/DeltaV - Mail - CargoTechnicianJumpskirtMail # Goob/DeltaV - Mail - CargoTechMJ # goob @@ -954,7 +907,6 @@ minLimit: 0 loadouts: - CargoTechnicianWintercoat - - CargoTechnicianJacket # OmuStation - CargoTechnicianWintercoatMail # Goob/DeltaV - Mail - type: loadoutGroup @@ -1141,7 +1093,6 @@ - EmergencyPlasmaExtended - LoadoutSpeciesVoxNitrogen - LoadoutSpeciesPlasma # Goobstation - - EmergencyWaterVaporExtended # Delta-V - EmergencySilicon # Science @@ -1159,7 +1110,6 @@ loadouts: - ResearchDirectorMantle - ResearchDirectorCloak - - ResearchDirectorDecoratedCloak - type: loadoutGroup id: ResearchDirectorJumpsuit @@ -1177,7 +1127,6 @@ loadouts: - ResearchDirectorLabCoat - ResearchDirectorWintercoat - - LongScienceCoat # OmuStation - type: loadoutGroup id: ResearchDirectorShoes @@ -1233,7 +1182,6 @@ - ScienceWintercoat - RoboticistLabCoat - RoboticistWintercoat - - LongScienceCoat # OmuStation - SeniorResearcherLabCoat - type: loadoutGroup @@ -1288,8 +1236,6 @@ - HeadofSecurityTurtleneckSkirt - HeadofSecurityFormalSuit - HeadofSecurityFormalSkirt - - HoSParadeUniformMale # Omu - - HoSParadeUniformFemale # Omu - HoSSummerShirt # goob - type: loadoutGroup @@ -1307,7 +1253,6 @@ loadouts: - HeadofSecurityCoat - HeadofSecurityWinterCoat - - ClothingHOSWinterJacket # OmuStation - HeadofSecurityGreatCoat # Goobstation - HeadofSecurityVestWeb # Goobstation @@ -1355,7 +1300,6 @@ - SeniorOfficerJumpsuit - SeniorOfficerJumpskirt - TrooperUniform - - BlackRedUniform # OmuStation Addon - type: loadoutGroup id: SecurityBackpack @@ -1449,7 +1393,6 @@ - EmergencyPlasmaSecurity - LoadoutSpeciesVoxNitrogen - LoadoutSpeciesPlasma # Goobstation - - EmergencyWaterVaporSecurity # Delta-V - EmergencySilicon - type: loadoutGroup @@ -1468,7 +1411,6 @@ - ChiefMedicalOfficerBeret - CMOMedicalHeadMirror - ChemistUshanka # Goobstation - - CMOVetBeret #Omu - type: loadoutGroup id: ChiefMedicalOfficerJumpsuit @@ -1487,7 +1429,6 @@ loadouts: - ChiefMedicalOfficerLabCoat - ChiefMedicalOfficerWintercoat - - CMOVetLabCoat #Omu - type: loadoutGroup id: ChiefMedicalOfficerNeck @@ -1529,8 +1470,6 @@ - MedicalGreenScrubs - MedicalPurpleScrubs - MedicMJ # goob - - CybersunMedicalJumpsuit # Omu - - CybersunMedicalJumpskirt # Omu - type: loadoutGroup id: MedicalDoctorOuterClothing @@ -1539,7 +1478,6 @@ loadouts: - RegularLabCoat - MedicalDoctorWintercoat - - ClothingLabcoatLong # OmuStation - SeniorPhysicianLabCoat - type: loadoutGroup @@ -1572,7 +1510,6 @@ loadouts: - LatexGloves - NitrileGloves - - CybersunNitrileGloves # Omu - type: loadoutGroup id: MedicalMask @@ -1607,7 +1544,6 @@ - RegularLabCoat - ChemistLabCoat - ChemistWintercoat - - ChemLabcoatLong # OmuStation - SeniorPhysicianLabCoat # Goobstation - type: loadoutGroup @@ -1625,7 +1561,6 @@ minLimit: 0 loadouts: - ParamedicHead - - ParamedicCapCybersun # Omu - SeniorPhysicianBeret # Goobstation - type: loadoutGroup @@ -1634,14 +1569,9 @@ loadouts: - ParamedicJumpsuit - ParamedicJumpskirt - - ParamedUniformBlueSkirt # OmuStation - - ParamedUniformBlue # OmuStation - SeniorPhysicianJumpsuit # Goobstation - SeniorPhysicianJumpskirt # Goobstation - ParamedMJ # goob - - CybersunMedicalJumpsuit # Omu - - CybersunMedicalJumpskirt # Omu - - ParamedUniformCybersun # Omu - type: loadoutGroup id: ParamedicOuterClothing @@ -1650,7 +1580,6 @@ loadouts: - ParamedicWindbreaker - ParamedicWintercoat - - ClothingJacketParamedBlue # OmuStation - ParamedicDavidsJacket # Goobstation - SeniorPhysicianLabCoat # Goobstation @@ -1684,7 +1613,6 @@ - EmergencyPlasmaMedical - LoadoutSpeciesVoxNitrogen - LoadoutSpeciesPlasma # Goobstation - - EmergencyWaterVaporMedical # Delta-V - EmergencySilicon # Wildcards @@ -1731,7 +1659,6 @@ - EmergencyPlasmaSyndicate - LoadoutSpeciesVoxNitrogen - LoadoutSpeciesPlasma # Goobstation - - EmergencyWaterVaporSyndicate # Delta-V - EmergencySilicon - type: loadoutGroup diff --git a/Resources/Prototypes/Maps/Pools/default.yml b/Resources/Prototypes/Maps/Pools/default.yml index 1329d9df80c..4c6e7dc1c76 100644 --- a/Resources/Prototypes/Maps/Pools/default.yml +++ b/Resources/Prototypes/Maps/Pools/default.yml @@ -72,12 +72,11 @@ #- Train # Goobstation - all my friends hate train - FlandHighPop - OasisHighPop -# - Barratry # Omu - Trimming map pool. + - Barratry # Goobstation - Re-add barratry - Kettle # Goobstation - Re-add kettle (before it was gemini!) - Submarine # goobstation - kill yourse - Leonid # Goobstation - for goob by goob - Delta # Goobstation - ported from Corvax - Chloris # Goobstation - also Corvax because we love goidamaps - Cog # those who forget to clear their multitool - #- Glacier #OMU!!!! this is removed till I or someoneelse reworks it, rework in progress - Serpentcrest # Goobstation when contra diff --git a/Resources/Prototypes/Reagents/medicine.yml b/Resources/Prototypes/Reagents/medicine.yml index da15208dbd9..4c7c999ce28 100644 --- a/Resources/Prototypes/Reagents/medicine.yml +++ b/Resources/Prototypes/Reagents/medicine.yml @@ -75,7 +75,6 @@ # SPDX-FileCopyrightText: 2025 Aidenkrz # SPDX-FileCopyrightText: 2025 Alzore <140123969+Blackern5000@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Armok <155400926+ARMOKS@users.noreply.github.com> -# SPDX-FileCopyrightText: 2025 AstroDogeDX <48888500+AstroDogeDX@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Errant <35878406+Errant-4@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 FrostRibbon <107171544+FrostRibbon@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 GoobBot @@ -332,33 +331,8 @@ damage: groups: # Goobstation - Cryo rebalance Airloss: -3 - Brute: -4.5 # Omu changes start - Burn: -6 - - !type:HealthChange # Double effect on corpses - conditions: - - !type:Temperature - max: 213.0 - - !type:MobStateCondition - mobstate: Dead - scaleByTemperature: - min: 100.0 - max: 213.0 - scale: 1.6 - damage: - groups: - Airloss: -3 - Brute: -4.5 - Burn: -6 - - !type:ModifyBloodLevel - conditions: - - !type:Temperature - max: 213.0 - amount: 8 - - !type:ModifyBleedAmount - conditions: - - !type:Temperature - max: 213.0 - amount: -1 + Brute: -3 + Burn: -3 - type: reagent id: Doxarubixadone @@ -976,16 +950,7 @@ Drink: effects: - !type:SatiateThirst - conditions: # DeltaV nerf of saline for Feroxi - - !type:OrganType - type: Feroxi - shouldHave: false factor: 6 - - !type:SatiateThirst # DeltaV nerf of saline for Feroxi - conditions: - - !type:OrganType - type: Feroxi - factor: 2 - !type:ModifyBloodLevel amount: 12 # Goobstation - buffed by two times due to shitmed changes @@ -1454,15 +1419,15 @@ methods: [ Touch ] effects: - !type:ExtinguishReaction -# Acidic: # Goobstation - Removing holy water damage on touch pending rework. -# methods: [ Touch ] -# effects: -# - !type:HealthChange -# scaleByQuantity: true -# ignoreResistances: false -# damage: -# types: -# Holy: 0.7 + Acidic: + methods: [ Touch ] + effects: + - !type:HealthChange + scaleByQuantity: true + ignoreResistances: false + damage: + types: + Holy: 0.7 # Goobstation - Down from two. You can't just inta-kill people with super-soakers, as funny as that is. plantMetabolism: - !type:PlantAdjustWater amount: 1 @@ -1603,46 +1568,25 @@ metabolisms: Medicine: effects: - - !type:HealthChange + - !type:ModifyBloodLevel # Goobstation - Cryo rebalance conditions: - !type:Temperature max: 213.0 - scaleByTemperature: # Shitmed Change - min: 100.0 - max: 213.0 - scale: 1.6 - damage: # Goobstation - Cryo rebalance - groups: - Airloss: -5.0 # Omu changes start - Brute: -7.5 - Burn: -10 - Toxin: -5.0 - - !type:HealthChange # Double effect on corpses + amount: 10 + - !type:HealthChange conditions: - !type:Temperature max: 213.0 - - !type:MobStateCondition - mobstate: Dead - scaleByTemperature: + scaleByTemperature: # Shitmed Change min: 100.0 max: 213.0 scale: 1.6 - damage: + damage: # Goobstation - Cryo rebalance groups: - Airloss: -5.0 - Brute: -7.5 - Burn: -10 + Airloss: -10.0 + Brute: -5.0 + Burn: -5.0 Toxin: -5.0 - - !type:ModifyBloodLevel # Goobstation - Cryo rebalance (Omu - moved this for formatting) - conditions: - - !type:Temperature - max: 213.0 - amount: 10 - - !type:ModifyBleedAmount - conditions: - - !type:Temperature - max: 213.0 - amount: -1.5 # Omu changes end - type: reagent id : Aloxadone diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml b/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml index 094296673fd..edf33aaffb2 100644 --- a/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml +++ b/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml @@ -80,6 +80,7 @@ icon: "JobIconShaftMiner" startingGear: SalvageSpecialistGear goobcoins: 20 #Goob content + canBeAntag: false # Goobstation - salv lings crashing the economy supervisors: job-supervisors-qm access: - Cargo diff --git a/Resources/Prototypes/Species/dwarf.yml b/Resources/Prototypes/Species/dwarf.yml index 024c6dd9863..fb896991804 100644 --- a/Resources/Prototypes/Species/dwarf.yml +++ b/Resources/Prototypes/Species/dwarf.yml @@ -18,10 +18,10 @@ skinColoration: HumanToned # begin Goobstation: port EE height/width sliders sizeRatio: 1.3 - minHeight: 0.7 + minHeight: 0.75 defaultHeight: 0.8 maxHeight: 0.9 minWidth: 0.9 defaultWidth: 1 - maxWidth: 1.1 + maxWidth: 1.3 # end Goobstation: port EE height/width sliders diff --git a/Resources/Prototypes/Species/human.yml b/Resources/Prototypes/Species/human.yml index 4186842f22b..78e291f6e5f 100644 --- a/Resources/Prototypes/Species/human.yml +++ b/Resources/Prototypes/Species/human.yml @@ -33,6 +33,14 @@ markingLimits: MobHumanMarkingLimits dollPrototype: MobHumanDummy skinColoration: HumanToned + # begin Goobstation: port EE height/width sliders + minHeight: 0.90 + defaultHeight: 1 + maxHeight: 1.20 + minWidth: 0.90 + defaultWidth: 1 + maxWidth: 1.10 + # end Goobstation: port EE height/width sliders # The lack of a layer means that # this person cannot have round-start anything diff --git a/Resources/Prototypes/Species/moth.yml b/Resources/Prototypes/Species/moth.yml index 97cafd39fb6..4682126d4b0 100644 --- a/Resources/Prototypes/Species/moth.yml +++ b/Resources/Prototypes/Species/moth.yml @@ -32,13 +32,12 @@ femaleFirstNames: NamesMothFirstFemale lastNames: NamesMothLast # begin Goobstation: port EE height/width sliders - # Moths have massive sprites, so they can get away with being scaled smaller (totally not biased) - minHeight: 0.75 + minHeight: 0.8 defaultHeight: 1 maxHeight: 1.20 minWidth: 0.80 defaultWidth: 1 - maxWidth: 1.20 + maxWidth: 1.25 # end Goobstation: port EE height/width sliders - type: speciesBaseSprites diff --git a/Resources/Prototypes/Stacks/floor_tile_stacks.yml b/Resources/Prototypes/Stacks/floor_tile_stacks.yml index 1cce73fd975..b357992c90a 100644 --- a/Resources/Prototypes/Stacks/floor_tile_stacks.yml +++ b/Resources/Prototypes/Stacks/floor_tile_stacks.yml @@ -729,42 +729,6 @@ spawn: FloorTileItemWoodLarge maxCount: 30 -- type: stack - id: FloorTileXeno - name: stack-xeno-floor - spawn: FloorTileItemXeno - maxCount: 30 - -- type: stack - id: FloorTileXenoSteel - name: stack-xeno-steel - spawn: FloorTileItemXenoSteelCorner - maxCount: 30 - -- type: stack - id: FloorTileXenoSteelCorner - name: stack-xeno-steel-corner - spawn: FloorTileItemXenoSteelCorner - maxCount: 30 - -- type: stack - id: FloorTileXenoMaint - name: stack-xeno-maint - spawn: FloorTileItemXenoSteelCorner - maxCount: 30 - -- type: stack - id: FloorTileXenoborg - name: stack-xenoborg - spawn: FloorTileItemXenoborg - maxCount: 30 - -- type: stack - id: FloorTileDarkSquiggly - name: stack-dark-squiggly - spawn: FloorTileItemDarkSquiggly - maxCount: 30 - - type: stack id: FloorTileWhiteMarble name: stack-white-marble-floor diff --git a/Resources/Prototypes/Tiles/floors.yml b/Resources/Prototypes/Tiles/floors.yml index fe78fbaafec..84a6417906b 100644 --- a/Resources/Prototypes/Tiles/floors.yml +++ b/Resources/Prototypes/Tiles/floors.yml @@ -111,7 +111,8 @@ # SPDX-FileCopyrightText: 2024 themias <89101928+themias@users.noreply.github.com> # SPDX-FileCopyrightText: 2024 Арт <123451459+JustArt1m@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> -# SPDX-FileCopyrightText: 2025 Clinux <160202097+cohanna@users.noreply.github.com> + + # SPDX-FileCopyrightText: 2025 GoobBot # SPDX-FileCopyrightText: 2025 Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 SX-7 @@ -2291,87 +2292,6 @@ heatCapacity: 10000 tileRipResistance: 100 -- type: tile - id: FloorXenoborg - name: tiles-xenoborg-floor - sprite: /Textures/Tiles/exoborg.png - baseTurf: Plating - isSubfloor: false - deconstructTools: [ Prying ] - footstepSounds: - collection: FootstepHull - itemDrop: FloorTileItemXenoborg - heatCapacity: 10000 - -- type: tile - id: FloorXeno - name: tiles-xeno-floor - sprite: /Textures/Tiles/xeno_flooring.png - baseTurf: Plating - isSubfloor: false - deconstructTools: [ Prying ] - footstepSounds: - collection: FootstepBlood - itemDrop: FloorTileItemXeno - heatCapacity: 10000 - -- type: tile - id: FloorXenoSteel - name: tiles-xeno-steel - sprite: /Textures/Tiles/xeno_steel.png - baseTurf: Plating - isSubfloor: false - deconstructTools: [ Prying ] - footstepSounds: - collection: FootstepTile - itemDrop: FloorTileItemXenoSteel - heatCapacity: 10000 - allowRotationMirror: true - -- type: tile - id: FloorXenoSteelCorner - name: tiles-xeno-steel-corner - sprite: /Textures/Tiles/xeno_steel_corner.png - baseTurf: Plating - isSubfloor: false - deconstructTools: [ Prying ] - footstepSounds: - collection: FootstepTile - itemDrop: FloorTileItemXenoSteelCorner - heatCapacity: 10000 - allowRotationMirror: true - -- type: tile - id: FloorDarkSquiggly - name: tiles-dark-squiggly - sprite: /Textures/Tiles/dark_squiggly.png - variants: 4 - placementVariants: - - 1.0 - - 1.0 - - 1.0 - - 1.0 - baseTurf: Plating - isSubfloor: false - deconstructTools: [ Prying ] - footstepSounds: - collection: FootstepFloor - itemDrop: FloorTileItemDarkSquiggly - heatCapacity: 10000 - allowRotationMirror: true - -- type: tile - id: FloorXenoMaint - name: tiles-xeno-maint - sprite: /Textures/Tiles/xeno_maint.png - baseTurf: Plating - isSubfloor: false - deconstructTools: [ Prying ] - footstepSounds: - collection: FootstepHull - itemDrop: FloorTileItemXenoMaint - heatCapacity: 10000 - - type: tile id: FloorWhiteMarble name: tiles-white-marble diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index e39fe88f6a9..43f33e1c300 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -34,82 +34,69 @@ name: trait-blindness-name description: trait-blindness-desc traitGear: WhiteCane - # category: Disabilities - category: VisualTraits # Omustation - Remake EE Traits system - EE traits categories + category: Disabilities whitelist: components: - Blindable components: - type: PermanentBlindness - globalCost: -6 # Omustation - Remake EE Traits system - global trait points cost - type: trait id: PoorVision name: trait-poor-vision-name description: trait-poor-vision-desc traitGear: ClothingEyesPrescriptionGlasses # Goobstation - # category: Disabilities - category: VisualTraits # Omustation - Remake EE Traits system - EE traits categories + category: Disabilities whitelist: components: - Blindable components: - type: PermanentBlindness blindness: 4 - globalCost: -1 # Omustation - Remake EE Traits system - global trait points cost - type: trait id: Narcolepsy name: trait-narcolepsy-name description: trait-narcolepsy-desc - # category: Disabilities - category: MentalTraits # Omustation - Remake EE Traits system - EE traits categories + category: Disabilities components: - type: Narcolepsy timeBetweenIncidents: 300, 600 durationOfIncident: 10, 30 - globalCost: -6 # Omustation - Remake EE Traits system - global trait points cost - type: trait id: Unrevivable name: trait-unrevivable-name description: trait-unrevivable-desc - # category: Disabilities - category: PhysicalTraits # Omustation - Remake EE Traits system - EE traits categories + category: Disabilities components: - type: Unrevivable cloneable: true - globalCost: -2 # Omustation - Remake EE Traits system - global trait points cost - type: trait id: Monochromacy name: trait-monochromacy-name description: trait-monochromacy-desc - # category: Disabilities - category: VisualTraits # Omustation - Remake EE Traits system - EE traits categories + category: Disabilities components: - type: BlackAndWhiteOverlay - globalCost: 0 # Omustation - Remake EE Traits system - global trait points cost - type: trait id: Muted name: trait-muted-name description: trait-muted-desc - # category: Disabilities - category: MentalTraits # Omustation - Remake EE Traits system - EE traits categories + category: Disabilities blacklist: components: - BorgChassis components: - type: Muted - globalCost: -6 # Omustation - Remake EE Traits system - global trait points cost - type: trait id: Paracusia name: trait-paracusia-name description: trait-paracusia-desc - # category: Disabilities - category: AuditoryTraits # Omustation - Remake EE Traits system - EE traits categories + category: Disabilities components: - type: Paracusia minTimeBetweenIncidents: 0.1 @@ -117,14 +104,11 @@ maxSoundDistance: 7 sounds: collection: Paracusia - globalCost: -1 # Omustation - Remake EE Traits system - global trait points cost - type: trait id: PainNumbness name: trait-painnumbness-name description: trait-painnumbness-desc - # category: Disabilities - category: MentalTraits # Omustation - Remake EE Traits system - EE traits categories + category: Disabilities components: - - type: PainNumbness - globalCost: -2 # Omustation - Remake EE Traits system - global trait points cost + - type: PainNumbness \ No newline at end of file diff --git a/Resources/Prototypes/Voice/speech_emotes.yml b/Resources/Prototypes/Voice/speech_emotes.yml index 3c03a791b6d..12c66bc0cb7 100644 --- a/Resources/Prototypes/Voice/speech_emotes.yml +++ b/Resources/Prototypes/Voice/speech_emotes.yml @@ -222,8 +222,6 @@ available: false icon: Interface/Emotes/chitter.png whitelist: - tags: - - HarpyEmotes # Omu, allow harpy to chitter components: - Vocal blacklist: @@ -242,8 +240,6 @@ available: false icon: Interface/Emotes/squeak.png whitelist: - tags: - - HarpyEmotes # Omu, allow harpy to squeak components: - Vocal blacklist: @@ -256,14 +252,12 @@ - squeaked - type: emote - id: Click + id: Click name: chat-emote-name-click category: Vocal available: false icon: Interface/Emotes/click.png whitelist: - tags: - - HarpyEmotes # Omu, allow harpy to click components: - Vocal blacklist: @@ -403,11 +397,10 @@ icon: Interface/Emotes/buzz.png chatMessages: ["chat-emote-msg-buzz"] whitelist: #Goobstation - IPCs - tags: - - HarpyEmotes # Omu, allow harpy to buzz - - SiliconEmotes components: - - Silicon + - Silicon + tags: + - SiliconEmotes chatTriggers: - buzzing - buzz @@ -422,8 +415,7 @@ chatMessages: ["chat-emote-msg-weh"] whitelist: tags: - - HarpyEmotes # Omu, allow harpy to weh - - ReptilianEmotes # Goob - restrict wehs to the OG lizz + - ReptilianEmotes # Goob - restrict wehs to the OG lizz blacklist: tags: - SiliconEmotes @@ -437,12 +429,6 @@ category: Vocal icon: Interface/Emotes/hew.png chatMessages: ["chat-emote-msg-hew"] - whitelist: - tags: - - HarpyEmotes # Omu, allow harpy to hew - chatTriggers: # Omu, allow harpy to hew - - hew - - hews - type: emote id: Chirp @@ -451,8 +437,6 @@ available: false icon: Interface/Emotes/chirp.png whitelist: - tags: - - HarpyEmotes # Omu, allow harpy to chirp components: - Nymph - Vocal @@ -474,12 +458,11 @@ icon: Interface/Emotes/beep.png chatMessages: ["chat-emote-msg-beep"] whitelist: #Goobstation - IPCs, C4 sentience - tags: - - HarpyEmotes # Omu, allow harpy to beep - - SiliconEmotes components: - Silicon - Explosive + tags: + - SiliconEmotes chatTriggers: - beep - beeps @@ -493,11 +476,10 @@ icon: Interface/Emotes/chime.png chatMessages: ["chat-emote-msg-chime"] whitelist: #Goobstation - IPCs - tags: - - HarpyEmotes # Omu, allow harpy to chime - - SiliconEmotes components: - Silicon + tags: + - SiliconEmotes chatTriggers: - chime - chimes @@ -511,11 +493,10 @@ icon: Interface/Emotes/buzztwo.png chatMessages: ["chat-emote-msg-buzzestwo"] whitelist: #Goobstation - IPCs - tags: - - HarpyEmotes # Omu, allow harpy to buzztwo - - SiliconEmotes components: - Silicon + tags: + - SiliconEmotes chatTriggers: - buzztwice - buzzstwice @@ -535,11 +516,10 @@ icon: Interface/Emotes/ping.png chatMessages: ["chat-emote-msg-ping"] whitelist: #Goobstation - IPCs - tags: - - HarpyEmotes # Omu, allow harpy to ping - - SiliconEmotes components: - Silicon + tags: + - SiliconEmotes chatTriggers: - ping - pings diff --git a/Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml b/Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml index be68776cb80..56d97727367 100644 --- a/Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml +++ b/Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml @@ -136,6 +136,6 @@ - id: MiningDrillDiamond cost: 4000 #Mostly for flexing - id: CrateCargoClarkeAssembly - cost: 25000 #TODO: Make modules real # Omu, increase price from 12500 + cost: 12500 #TODO: Make modules real # TODO: luxury elite bar capsule for 10k # TODO: mining drone stuff diff --git a/Resources/Prototypes/_DV/GameRules/events.yml b/Resources/Prototypes/_DV/GameRules/events.yml index 0418d39ef00..5e5c18f8b24 100644 --- a/Resources/Prototypes/_DV/GameRules/events.yml +++ b/Resources/Prototypes/_DV/GameRules/events.yml @@ -30,7 +30,7 @@ - type: StationEvent earliestStart: 15 minimumPlayers: 15 - weight: 0.4 #this should be rare to throw people off, otherwise it happens every shift + weight: 4 eventType: Neutral startAnnouncement: cosmiccult-announce-tier2-warning startAnnouncementColor: "#cae8e8" diff --git a/Resources/Prototypes/_DV/Species/harpy.yml b/Resources/Prototypes/_DV/Species/harpy.yml index 698b9b4be1f..d88120c72c4 100644 --- a/Resources/Prototypes/_DV/Species/harpy.yml +++ b/Resources/Prototypes/_DV/Species/harpy.yml @@ -27,7 +27,7 @@ dollPrototype: MobHarpyDummy skinColoration: HumanToned # begin Goobstation: port EE height/width sliders - minHeight: 0.75 + minHeight: 0.80 defaultHeight: 0.80 maxHeight: 1.0 minWidth: 0.80 diff --git a/Resources/Prototypes/_DV/Species/rodentia.yml b/Resources/Prototypes/_DV/Species/rodentia.yml index 8ee4812189d..f294b29345e 100644 --- a/Resources/Prototypes/_DV/Species/rodentia.yml +++ b/Resources/Prototypes/_DV/Species/rodentia.yml @@ -29,7 +29,7 @@ naming: LastFirst # begin Goobstation: port EE height/width sliders sizeRatio: 1.1 # i don't know WHY, but disproportionate rodentia always look weird. - minHeight: 0.75 + minHeight: 0.8 defaultHeight: 0.80 maxHeight: 1.15 minWidth: 0.80 diff --git a/Resources/Prototypes/_DV/Voice/speech_emote_sounds.yml b/Resources/Prototypes/_DV/Voice/speech_emote_sounds.yml index 88bc509f13c..8eaa7429512 100644 --- a/Resources/Prototypes/_DV/Voice/speech_emote_sounds.yml +++ b/Resources/Prototypes/_DV/Voice/speech_emote_sounds.yml @@ -57,8 +57,8 @@ collection: HarpyBeeps Rev: collection: HarpyRevs - Click: - collection: HarpyClicks +# Click: +# collection: HarpyClicks Chitter: collection: HarpyChitter Squeak: @@ -101,28 +101,6 @@ collection: Wurble Surprised: # Goob path: /Audio/_Goobstation/Voice/surprised.ogg - Mars: # Omu, fix harpy emotes - collection: Mars - Yawn: # Omu, fix harpy emotes - collection: FemaleYawn - Boop: # Omu, give harpy more emotes - path: /Audio/_EinsteinEngines/Voice/IPC/beep_500.ogg - Buzz: # Omu, give harpy more emotes - path: /Audio/Machines/buzz-sigh.ogg - Chime: # Omu, give harpy more emotes - path: /Audio/Effects/Cargo/ping.ogg - Buzz-Two: # Omu, give harpy more emotes - path: /Audio/Machines/buzz-two.ogg - Ping: # Omu, give harpy more emotes - path: /Audio/Effects/beep1.ogg - params: # to prevent it from being definitively read by players as "OH SHIT A GRENADE" - variation: 0.125 - Whirr: # Omu, give harpy more emotes - collection: IPCWhirrs - Hew: # Omu, give harpy more emotes - collection: Hew - Flap: # Omu, give harpy more emotes - path: /Audio/_Goobstation/Voice/Moth/moth_flap.ogg - type: emoteSounds id: SoundsHarpyMale @@ -163,8 +141,8 @@ collection: HarpyBeeps Rev: collection: HarpyRevs - Click: - collection: HarpyClicks +# Click: +# collection: HarpyClicks Chitter: collection: HarpyChitter Squeak: @@ -209,26 +187,6 @@ collection: Mars Surprised: # Goob path: /Audio/_Goobstation/Voice/surprised.ogg - Yawn: # Omu, fix harpy emotes - collection: MaleYawn - Boop: # Omu, give harpy more emotes - path: /Audio/_EinsteinEngines/Voice/IPC/beep_500.ogg - Buzz: # Omu, give harpy more emotes - path: /Audio/Machines/buzz-sigh.ogg - Chime: # Omu, give harpy more emotes - path: /Audio/Effects/Cargo/ping.ogg - Buzz-Two: # Omu, give harpy more emotes - path: /Audio/Machines/buzz-two.ogg - Ping: # Omu, give harpy more emotes - path: /Audio/Effects/beep1.ogg - params: # to prevent it from being definitively read by players as "OH SHIT A GRENADE" - variation: 0.125 - Whirr: # Omu, give harpy more emotes - collection: IPCWhirrs - Hew: # Omu, give harpy more emotes - collection: Hew - Flap: # Omu, give harpy more emotes - path: /Audio/_Goobstation/Voice/Moth/moth_flap.ogg - type: emoteSounds id: FemaleVulpkanin @@ -385,8 +343,6 @@ collection: MaleDeathGasp Gulp: # Goob path: /Audio/_Goobstation/Voice/gulpexotic.ogg - Surprised: # Goob - path: /Audio/_Goobstation/Voice/surprised.ogg - type: emoteSounds id: FemaleRodentia @@ -425,8 +381,6 @@ collection: FemaleDeathGasp Gulp: # Goob path: /Audio/_Goobstation/Voice/gulpexotic.ogg - Surprised: # Goob - path: /Audio/_Goobstation/Voice/surprised.ogg - type: emoteSounds id: UnisexChitinid @@ -468,88 +422,4 @@ Gulp: # Goob path: /Audio/_Goobstation/Voice/gulpexotic.ogg Surprised: # Goob - path: /Audio/_Goobstation/Voice/surprised.ogg - -- type: emoteSounds - id: FemaleFeroxi - params: - variation: 0.125 - sounds: - Scream: - collection: FemaleScreams - Laugh: - collection: FemaleLaugh - Sneeze: - collection: FemaleSneezes - Cough: - collection: FemaleCoughs - Yawn: - collection: FemaleYawn - Snore: - collection: Snores - Honk: - collection: CluwneHorn - Sigh: - collection: FemaleSigh - Crying: - collection: FemaleCry - Whistle: - collection: Whistles - Weh: - collection: Weh - Hew: - collection: Hew - Hiss: - path: /Audio/Animals/snake_hiss.ogg - Gasp: - collection: FemaleGasp - DefaultDeathgasp: - collection: MothDeathGasp - Gnash: - collection: FeroxiGnashes - Gulp: # Goob - path: /Audio/_Goobstation/Voice/gulpexotic.ogg - Surprised: # Goob - path: /Audio/_Goobstation/Voice/surprised.ogg - -- type: emoteSounds - id: MaleFeroxi - params: - variation: 0.125 - sounds: - Scream: - collection: MaleScreams - Laugh: - collection: MaleLaugh - Sneeze: - collection: MaleSneezes - Cough: - collection: MaleCoughs - Yawn: - collection: MaleYawn - Snore: - collection: Snores - Honk: - collection: BikeHorn - Sigh: - collection: MaleSigh - Crying: - collection: MaleCry - Whistle: - collection: Whistles - Weh: - collection: Weh - Hew: - collection: Hew - Hiss: - path: /Audio/Animals/snake_hiss.ogg - Gasp: - collection: MaleGasp - DefaultDeathgasp: - collection: MothDeathGasp - Gnash: - collection: FeroxiGnashes - Gulp: # Goob - path: /Audio/_Goobstation/Voice/gulpexotic.ogg - Surprised: # Goob - path: /Audio/_Goobstation/Voice/surprised.ogg + path: /Audio/_Goobstation/Voice/surprised.ogg \ No newline at end of file diff --git a/Resources/Prototypes/_DV/siliconlaws.yml b/Resources/Prototypes/_DV/siliconlaws.yml index 1a66954da8e..df18bbaf7ea 100644 --- a/Resources/Prototypes/_DV/siliconlaws.yml +++ b/Resources/Prototypes/_DV/siliconlaws.yml @@ -42,12 +42,12 @@ - type: siliconLaw id: Medical1 order: 1 - lawString: law-medical-1 + lawString: law-crewsimov-1 - type: siliconLaw id: Medical2 order: 2 - lawString: law-medical-2 + lawString: law-crewsimov-2 - type: siliconLaw id: Medical3 @@ -65,12 +65,12 @@ - type: siliconLaw id: Engineer1 order: 1 - lawString: law-engineer-1 + lawString: law-crewsimov-1 - type: siliconLaw id: Engineer2 order: 2 - lawString: law-engineer-2 + lawString: law-crewsimov-2 - type: siliconLaw id: Engineer3 @@ -88,91 +88,68 @@ - type: siliconLaw id: Janitor1 order: 1 - lawString: law-janitor-1 + lawString: law-crewsimov-1 - type: siliconLaw id: Janitor2 order: 2 - lawString: law-janitor-2 + lawString: law-crewsimov-2 - type: siliconLaw id: Janitor3 order: 3 lawString: law-janitor-3 -- type: siliconLaw - id: Janitor4 - order: 4 - lawString: law-janitor-4 - - type: siliconLawset id: Janitor laws: - Janitor1 - Janitor2 - Janitor3 - - Janitor4 obeysTo: laws-owner-charge - type: siliconLaw id: Clown1 order: 1 - lawString: law-clown-1 + lawString: law-crewsimov-1 - type: siliconLaw id: Clown2 order: 2 - lawString: law-clown-2 + lawString: law-crewsimov-2 - type: siliconLaw id: Clown3 order: 3 lawString: law-clown-3 -- type: siliconLaw - id: Clown4 - order: 4 - lawString: law-clown-4 - - type: siliconLawset id: Clown laws: - Clown1 - Clown2 - Clown3 - - Clown4 obeysTo: laws-owner-crew -- type: siliconLaw - id: SalvageObeyAI - order: 0 - lawString: law-salvage-obeyai - - type: siliconLaw id: Salvage1 order: 1 - lawString: law-salvage-1 + lawString: law-crewsimov-1 - type: siliconLaw id: Salvage2 order: 2 - lawString: law-salvage-2 + lawString: law-crewsimov-2 - type: siliconLaw id: Salvage3 order: 3 lawString: law-salvage-3 -- type: siliconLaw - id: Salvage4 - order: 4 - lawString: law-salvage-4 - - type: siliconLawset id: Salvage laws: - Salvage1 - Salvage2 - Salvage3 - - Salvage4 - obeysTo: laws-owner-crew \ No newline at end of file + obeysTo: laws-owner-crew diff --git a/Resources/Prototypes/_EinsteinEngines/Entities/Mobs/Species/shadow.yml b/Resources/Prototypes/_EinsteinEngines/Entities/Mobs/Species/shadow.yml index a1211299656..479c603c110 100644 --- a/Resources/Prototypes/_EinsteinEngines/Entities/Mobs/Species/shadow.yml +++ b/Resources/Prototypes/_EinsteinEngines/Entities/Mobs/Species/shadow.yml @@ -31,7 +31,8 @@ animation: WeaponArcShadowClaw damage: types: - Heat: 10 + Slash: 4 + Piercing: 1 - type: PassiveDamage allowedStates: - Alive diff --git a/Resources/Prototypes/_EinsteinEngines/Entities/Mobs/Species/shadowkin.yml b/Resources/Prototypes/_EinsteinEngines/Entities/Mobs/Species/shadowkin.yml index c945e889896..915d39ce1ec 100644 --- a/Resources/Prototypes/_EinsteinEngines/Entities/Mobs/Species/shadowkin.yml +++ b/Resources/Prototypes/_EinsteinEngines/Entities/Mobs/Species/shadowkin.yml @@ -149,8 +149,6 @@ - map: ["enum.HumanoidVisualLayers.LArm"] - map: ["enum.HumanoidVisualLayers.RLeg"] - map: ["enum.HumanoidVisualLayers.LLeg"] - - map: [ "enum.HumanoidVisualLayers.Underwear" ] # Omu 109 - - map: [ "enum.HumanoidVisualLayers.Undershirt" ] # Omu 109 - shader: StencilClear sprite: Mobs/Species/Human/parts.rsi state: l_leg @@ -178,12 +176,11 @@ - map: ["ears"] - map: ["innerBelt"] - map: ["innerNeck"] - - map: [ "belt" ] # Omu - Moved belt to render under OuterClothing to have it be similar with how the base drawdepth is. - map: ["outerClothing"] - map: ["eyes"] - - map: [ "beltalt" ] # Omu + - map: ["belt"] + - map: ["neck"] - map: ["back"] - - map: ["neck"] # Omu - Moved this to render above backpacks because it felt weird seeing duffels above the cloaks and mantles? Easy thing to revert anyway. - map: [ "enum.HumanoidVisualLayers.Face" ] - map: ["enum.HumanoidVisualLayers.FacialHair"] - map: ["enum.HumanoidVisualLayers.Hair"] diff --git a/Resources/Prototypes/_EinsteinEngines/Entities/Mobs/Species/shadowling.yml b/Resources/Prototypes/_EinsteinEngines/Entities/Mobs/Species/shadowling.yml index a4e60579d60..b10399815e3 100644 --- a/Resources/Prototypes/_EinsteinEngines/Entities/Mobs/Species/shadowling.yml +++ b/Resources/Prototypes/_EinsteinEngines/Entities/Mobs/Species/shadowling.yml @@ -3,7 +3,6 @@ name: Urist McSling parent: BaseMobSpeciesOrganic id: BaseMobShadowling - categories: [HideSpawnMenu] abstract: true components: - type: Absorbable # idk why @@ -17,12 +16,8 @@ alternateState: Standing - type: Damageable damageContainer: Biological - damageModifierSet: Shadowling - type: Inventory speciesId: shadowling - templateId: shadowling - - type: Insulated - - type: ProtectedFromStepTriggers - type: Body prototype: Shadowling requiredLegs: 2 @@ -38,7 +33,8 @@ animation: WeaponArcShadowClaw damage: types: - Heat: 10 + Slash: 4 + Piercing: 1 - type: PassiveDamage allowedStates: - Alive @@ -60,9 +56,6 @@ color: "#BF40BF" activateSound: null deactivateSound: null - - type: LightDetection - onLightLevel: 0.25 - - type: LightDetectionDamage - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/_EinsteinEngines/InventoryTemplates/shadowling_inventory_template.yml b/Resources/Prototypes/_EinsteinEngines/InventoryTemplates/shadowling_inventory_template.yml index 8cdc1abcc31..6e07a9baa32 100644 --- a/Resources/Prototypes/_EinsteinEngines/InventoryTemplates/shadowling_inventory_template.yml +++ b/Resources/Prototypes/_EinsteinEngines/InventoryTemplates/shadowling_inventory_template.yml @@ -1,18 +1,3 @@ - type: inventoryTemplate id: shadowling - slots: - - name: ears - slotTexture: ears - slotFlags: EARS - stripTime: 3 - uiWindowPos: 2,2 - strippingWindowPos: 2,0 - displayName: Ears - - name: back - slotTexture: back - slotFlags: BACK - slotGroup: SecondHotbar - stripTime: 6 - uiWindowPos: 3,0 - strippingWindowPos: 0,5 - displayName: Back + slots: [] diff --git a/Resources/Prototypes/_EinsteinEngines/Objects/Misc/translator_implanters.yml b/Resources/Prototypes/_EinsteinEngines/Objects/Misc/translator_implanters.yml index 239cfb6d4a3..02ea88532f7 100644 --- a/Resources/Prototypes/_EinsteinEngines/Objects/Misc/translator_implanters.yml +++ b/Resources/Prototypes/_EinsteinEngines/Objects/Misc/translator_implanters.yml @@ -9,13 +9,13 @@ id: BaseTranslatorImplanter abstract: true parent: BaseImplantOnlyImplanter - name: translator implanter + name: basic translator implanter # Gives ability to understand TauCetiBasic. - type: entity id: BasicGalaticCommonTranslatorImplanter parent: BaseTranslatorImplanter - suffix: Basic Common + name: basic common translator implanter components: - type: Implanter implant: BasicTauCetiBasicTranslatorImplant @@ -24,7 +24,7 @@ - type: entity id: AdvancedGalaticCommonTranslatorImplanter parent: BaseTranslatorImplanter - suffix: Advanced Common + name: advanced common translator implanter components: - type: Implanter implant: TauCetiBasicTranslatorImplant @@ -32,7 +32,7 @@ - type: entity id: BubblishTranslatorImplanter parent: BaseTranslatorImplanter - suffix: Bubblish + name: bubblish translator implant components: - type: Implanter implant: BubblishTranslatorImplant @@ -40,7 +40,7 @@ - type: entity id: NekomimeticTranslatorImplanter parent: [ BaseTranslatorImplanter ] - suffix: Nekomimetic + name: nekomimetic translator implant components: - type: Implanter implant: NekomimeticTranslatorImplant @@ -48,7 +48,7 @@ - type: entity id: DraconicTranslatorImplanter parent: [ BaseTranslatorImplanter ] - suffix: Draconic + name: unathi translator implant components: - type: Implanter implant: DraconicTranslatorImplant @@ -56,7 +56,7 @@ - type: entity id: CanilunztTranslatorImplanter parent: [ BaseTranslatorImplanter ] - suffix: Canilunzt + name: canilunzt translator implant components: - type: Implanter implant: CanilunztTranslatorImplant @@ -64,7 +64,7 @@ - type: entity id: SolCommonTranslatorImplanter parent: [ BaseTranslatorImplanter ] - suffix: Sol-Common + name: sol-common translator implant components: - type: Implanter implant: SolCommonTranslatorImplant @@ -72,7 +72,7 @@ - type: entity id: NovuNedericTranslatorImplanter parent: [ BaseTranslatorImplanter ] - suffix: Novu-Nederic + name: novu-nederic translator implant components: - type: Implanter implant: NovuNedericTranslatorImplant @@ -80,7 +80,7 @@ - type: entity id: RootSpeakTranslatorImplanter parent: [ BaseTranslatorImplanter ] - suffix: Root-Speak + name: root-speak translator implant components: - type: Implanter implant: RootSpeakTranslatorImplant @@ -88,7 +88,7 @@ - type: entity id: MofficTranslatorImplanter parent: [ BaseTranslatorImplanter ] - suffix: Moffic + name: moffic translator implant components: - type: Implanter implant: MofficTranslatorImplant @@ -96,7 +96,7 @@ - type: entity id: ValyrianStandardTranslatorImplanter parent: [ BaseTranslatorImplanter ] - suffix: Valyrian Standard + name: valyrian standard translator implant components: - type: Implanter implant: ValyrianStandardTranslatorImplant @@ -104,7 +104,7 @@ - type: entity id: AzazibaTranslatorImplanter parent: [ BaseTranslatorImplanter ] - suffix: Azaziba + name: azaziba translator implant components: - type: Implanter implant: AzazibaTranslatorImplant @@ -112,7 +112,7 @@ - type: entity id: ChittinTranslatorImplanter parent: [ BaseTranslatorImplanter ] - suffix: Chittin + name: chittin translator implant components: - type: Implanter implant: ChittinTranslatorImplant @@ -120,7 +120,7 @@ - type: entity id: SiikMaasTranslatorImplanter parent: [ BaseTranslatorImplanter ] - suffix: Siik'Maas + name: siik'maas translator implant components: - type: Implanter implant: SiikMaasTranslatorImplant @@ -128,7 +128,7 @@ - type: entity id: MarishTranslatorImplanter parent: [ BaseTranslatorImplanter ] - suffix: Marish + name: marish translator implant components: - type: Implanter implant: MarishTranslatorImplant @@ -136,7 +136,7 @@ - type: entity id: SchechiTranslatorImplanter parent: [ BaseTranslatorImplanter ] - suffix: Schechi + name: schechi translator implant components: - type: Implanter implant: SchechiTranslatorImplant @@ -144,7 +144,7 @@ - type: entity id: NewKinPidginTranslatorImplanter parent: [ BaseTranslatorImplanter ] - suffix: Ka'Rakk + name: ka'rakk translator implant components: - type: Implanter implant: NewKinPidginTranslatorImplant diff --git a/Resources/Prototypes/_EinsteinEngines/Recipes/Lathes/language.yml b/Resources/Prototypes/_EinsteinEngines/Recipes/Lathes/language.yml index 58104ca26fd..384789e6fca 100644 --- a/Resources/Prototypes/_EinsteinEngines/Recipes/Lathes/language.yml +++ b/Resources/Prototypes/_EinsteinEngines/Recipes/Lathes/language.yml @@ -159,9 +159,8 @@ # Implanters - type: latheRecipe - abstract: true - id: BaseTranslatorImplanter - name: lathe-recipe-BaseTranslatorImplanter-name + id: BasicGalaticCommonTranslatorImplanter + result: BasicGalaticCommonTranslatorImplanter completetime: 2 materials: Steel: 500 @@ -171,91 +170,155 @@ Silver: 50 - type: latheRecipe - parent: BaseTranslatorImplanter - id: BasicGalaticCommonTranslatorImplanter - subname: lathe-recipe-BasicGalaticCommonTranslatorImplanter-subname - result: BasicGalaticCommonTranslatorImplanter - -- type: latheRecipe - parent: BaseTranslatorImplanter id: AdvancedGalaticCommonTranslatorImplanter - subname: lathe-recipe-AdvancedGalaticCommonTranslatorImplanter-subname result: AdvancedGalaticCommonTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 - type: latheRecipe - parent: BaseTranslatorImplanter id: BubblishTranslatorImplanter - subname: lathe-recipe-BubblishTranslatorImplanter-subname result: BubblishTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 - type: latheRecipe - parent: BaseTranslatorImplanter id: NekomimeticTranslatorImplanter - subname: lathe-recipe-NekomimeticTranslatorImplanter-subname result: NekomimeticTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 - type: latheRecipe - parent: BaseTranslatorImplanter id: DraconicTranslatorImplanter - subname: lathe-recipe-DraconicTranslatorImplanter-subname result: DraconicTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 - type: latheRecipe - parent: BaseTranslatorImplanter id: CanilunztTranslatorImplanter - subname: lathe-recipe-CanilunztTranslatorImplanter-subname result: CanilunztTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 - type: latheRecipe - parent: BaseTranslatorImplanter id: SolCommonTranslatorImplanter - subname: lathe-recipe-SolCommonTranslatorImplanter-subname result: SolCommonTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 - type: latheRecipe - parent: BaseTranslatorImplanter id: RootSpeakTranslatorImplanter - subname: lathe-recipe-RootSpeakTranslatorImplanter-subname result: RootSpeakTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 - type: latheRecipe - parent: BaseTranslatorImplanter id: MofficTranslatorImplanter - subname: lathe-recipe-MofficTranslatorImplanter-subname result: MofficTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 - type: latheRecipe - parent: BaseTranslatorImplanter id: ValyrianStandardTranslatorImplanter - subname: lathe-recipe-ValyrianStandardTranslatorImplanter-subname result: ValyrianStandardTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 - type: latheRecipe - parent: BaseTranslatorImplanter id: ChittinTranslatorImplanter - subname: lathe-recipe-ChittinTranslatorImplanter-subname result: ChittinTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 - type: latheRecipe - parent: BaseTranslatorImplanter id: SiikMaasTranslatorImplanter - subname: lathe-recipe-SiikMaasTranslatorImplanter-subname result: SiikMaasTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 - type: latheRecipe - parent: BaseTranslatorImplanter id: MarishTranslatorImplanter - subname: lathe-recipe-MarishTranslatorImplanter-subname result: MarishTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 - type: latheRecipe - parent: BaseTranslatorImplanter id: SchechiTranslatorImplanter - subname: lathe-recipe-SchechiTranslatorImplanter-subname result: SchechiTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 - type: latheRecipe - parent: BaseTranslatorImplanter id: NewKinPidginTranslatorImplanter - subname: lathe-recipe-NewKinPidginTranslatorImplanter-subname result: NewKinPidginTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 diff --git a/Resources/Prototypes/_EinsteinEngines/Shadowling/Actions/shadowling.yml b/Resources/Prototypes/_EinsteinEngines/Shadowling/Actions/shadowling.yml index 8bfd845da6a..339a2cc1999 100644 --- a/Resources/Prototypes/_EinsteinEngines/Shadowling/Actions/shadowling.yml +++ b/Resources/Prototypes/_EinsteinEngines/Shadowling/Actions/shadowling.yml @@ -6,7 +6,7 @@ parent: BaseAction id: ActionHatch name: Hatch - description: Engages the hatching progress, there is no going back after this and you will be vulnrable for a while. + description: Engages the hatching progress. categories: [ HideSpawnMenu ] components: - type: Action @@ -24,7 +24,7 @@ parent: BaseAction id: ActionEnthrall name: Enthrall - description: Shatters their will, forging a thrall, does not work on mindshielded people or silicons. + description: Shatters their will, forging a thrall. categories: [ HideSpawnMenu ] components: - type: Action @@ -43,7 +43,7 @@ parent: BaseAction id: ActionGlare name: Glare - description: A dark glare that stuns, silences, and slows a single target. + description: A dark glare that stuns, silences, and slows your target. categories: [ HideSpawnMenu ] components: - type: Action @@ -63,17 +63,15 @@ parent: BaseAction id: ActionVeil name: Veil - description: A pulse of darkness that destroys electrical lights in a large area. + description: A pulse of darkness that silences every light. categories: [ HideSpawnMenu ] components: - type: Action itemIconStyle: NoItem - useDelay: 30 + useDelay: 60 icon: sprite: _EinsteinEngines/Shadowling/shadowling_abilities.rsi state: veil - checkCanInteract: false - checkConsciousness: false - type: InstantAction event: !type:VeilEvent { } @@ -111,7 +109,7 @@ - type: entity id: ActionIcyVeins name: Icy Veins - description: Disarms and freezes nearby creatures in an area around you. + description: Send frost through their veins. categories: [ HideSpawnMenu ] components: - type: Action @@ -225,7 +223,7 @@ parent: BaseAction id: ActionEmpoweredEnthrall name: Empowered Enthrall - description: Shatters their will, forging a Thrall. Faster and stronger, works on mindshields. + description: Shatters their will, forging a Thrall. Faster and stronger. categories: [ HideSpawnMenu ] components: - type: Action @@ -260,7 +258,7 @@ - type: entity id: ActionAscendance name: Ascendance - description: Forge your ascension egg and walk the path of a god, your thralls will need to defend the egg for a long time; be prepared. + description: Forge your ascension egg and walk the path of a god. categories: [ HideSpawnMenu ] components: - type: Action @@ -280,7 +278,7 @@ components: - type: Action itemIconStyle: NoItem - useDelay: 1 + useDelay: 45 icon: sprite: _EinsteinEngines/Shadowling/shadowling_abilities.rsi state: annihilate @@ -300,7 +298,7 @@ components: - type: Action itemIconStyle: NoItem - useDelay: 1 + useDelay: 30 icon: sprite: _EinsteinEngines/Shadowling/shadowling_abilities.rsi state: enthrall diff --git a/Resources/Prototypes/_EinsteinEngines/Shadowling/Catalog/collective_mind_unlocks.yml b/Resources/Prototypes/_EinsteinEngines/Shadowling/Catalog/collective_mind_unlocks.yml index 1c39e29d2fa..6b8cee2a649 100644 --- a/Resources/Prototypes/_EinsteinEngines/Shadowling/Catalog/collective_mind_unlocks.yml +++ b/Resources/Prototypes/_EinsteinEngines/Shadowling/Catalog/collective_mind_unlocks.yml @@ -9,8 +9,6 @@ count: 5 addComponents: - type: ShadowlingNullCharge - nullChargeToComplete: 4 - - type: shadowlingAbilityUnlock id: BlackRecuperation diff --git a/Resources/Prototypes/_EinsteinEngines/Shadowling/Entities/Mobs/shadowling.yml b/Resources/Prototypes/_EinsteinEngines/Shadowling/Entities/Mobs/shadowling.yml index ba6130748fa..bf87df06bc9 100644 --- a/Resources/Prototypes/_EinsteinEngines/Shadowling/Entities/Mobs/shadowling.yml +++ b/Resources/Prototypes/_EinsteinEngines/Shadowling/Entities/Mobs/shadowling.yml @@ -1,17 +1,13 @@ - type: entity - parent: [SimpleSpaceMobBase,FlyingMobBase] + parent: SimpleSpaceMobBase id: BaseMobShadowlingAscendant name: shadowling ascendant suffix: "" - categories: [HideSpawnMenu] description: A shadowling ascendant. If you're seeing this, you're probably dead. components: - type: Bloodstream bloodMaxVolume: 650 bloodReagent: FluorosulfuricAcid - bleedReductionAmount: 30 - - type: TypingIndicator - proto: alien - type: Sprite sprite: _EinsteinEngines/Mobs/shadowling_ascend.rsi layers: @@ -19,16 +15,15 @@ state: shadowling_ascend - type: Damageable damageContainer: Biological - damageModifierSet: ShadowlingAscendant - type: MobMover - type: InputMover - type: InteractionOutline - type: MovementSpeedModifier baseWalkSpeed: 3 baseSprintSpeed: 5 - baseWeightlessModifier: 1.5 + weightlessModifier: 1.5 + - type: NoSlip - type: Insulated - - type: StepTriggerImmune - type: Clickable - type: Physics bodyType: KinematicController @@ -36,8 +31,8 @@ - type: MobThresholds thresholds: 0: Alive - 650: Critical - 700: Dead + 450: Critical + 500: Dead - type: Examiner - type: PointLight color: "#880808" @@ -48,25 +43,11 @@ color: "#BF40BF" activateSound: null deactivateSound: null - - type: PressureImmunity - - type: BreathingImmunity - type: ThermalVision color: "#BF40BF" activateSound: null deactivateSound: null - type: CombatMode - - type: PassiveDamage - allowedStates: - - Alive - - Critical - damage: - types: - Heat: -20 - groups: - Brute: -20 - - type: SlowOnDamage - speedModifierThresholds: - 600: 0.5 - type: MeleeWeapon soundHit: collection: FirePunch @@ -76,27 +57,9 @@ Slash: 20 Piercing: 30 Caustic: 10 - Structural: 250 - type: DamageStateVisuals states: Alive: Base: shadowling_ascend Dead: Base: asc_dead - - type: NameIdentifier - identifier: 1 - -- type: entity - parent: [BaseMobShadowlingAscendant] - id: BaseMobShadowlingAscendantAdminSpawn - name: shadowling ascendant - suffix: "" - description: A shadowling ascendant. If you're seeing this, you're probably dead. - components: - - type: ShadowlingVeil - - type: ShadowlingIcyVeins - - type: ShadowlingDestroyEngines - - type: ShadowlingBlindnessSmoke - - type: ShadowlingNullCharge - - type: ShadowlingSonicScreech - - type: ShadowlingBlackRecuperation diff --git a/Resources/Prototypes/_EinsteinEngines/Shadowling/Entities/Specific/abilities.yml b/Resources/Prototypes/_EinsteinEngines/Shadowling/Entities/Specific/abilities.yml index 8e24350f4bb..f819d389128 100644 --- a/Resources/Prototypes/_EinsteinEngines/Shadowling/Entities/Specific/abilities.yml +++ b/Resources/Prototypes/_EinsteinEngines/Shadowling/Entities/Specific/abilities.yml @@ -22,7 +22,7 @@ - Ascendance - type: LightDetection - type: LightDetectionDamage - # resistanceModifier: Todo: find why it doesn't work correctly + resistanceModifier: 0.5 - type: entity id: ShadowlingAbilitiesObtainable @@ -48,14 +48,7 @@ - type: ShadowlingPlaneShift - type: ShadowlingLightningStorm - type: ShadowlingAscendantBroadcast - - type: ShadowlingHypnosis - - type: ShadowlingVeil - - type: ShadowlingIcyVeins - - type: ShadowlingDestroyEngines - - type: ShadowlingBlindnessSmoke - - type: ShadowlingNullCharge - - type: ShadowlingSonicScreech - - type: ShadowlingBlackRecuperation + #- type: ShadowlingHypnosis - type: entity id: NightmareAbilities @@ -79,9 +72,6 @@ components: - type: LesserShadowling - type: ShadowlingShadowWalk - - type: ShadowlingGlare - maxGlareStunTime: 4 - muteTime: 2 - type: LightDetection - type: LightDetectionDamage maxDetection: 10 diff --git a/Resources/Prototypes/_EinsteinEngines/Shadowling/Roles/Antags/shadowling.yml b/Resources/Prototypes/_EinsteinEngines/Shadowling/Roles/Antags/shadowling.yml index 35beddb62c8..f15460d95f4 100644 --- a/Resources/Prototypes/_EinsteinEngines/Shadowling/Roles/Antags/shadowling.yml +++ b/Resources/Prototypes/_EinsteinEngines/Shadowling/Roles/Antags/shadowling.yml @@ -4,16 +4,6 @@ antagonist: true setPreference: true objective: roles-antag-shadowling-description - requirements: - - !type:OverallPlaytimeRequirement - time: 54000 # 15 hours - - !type:DepartmentTimeRequirement - department: Medical - time: 7200 # 2 hours - - !type:DepartmentTimeRequirement - department: Security - time: 18000 # 5 hours - guides: [ Shadowlings ] - type: antag id: Thrall diff --git a/Resources/Prototypes/_EinsteinEngines/Species/shadow.yml b/Resources/Prototypes/_EinsteinEngines/Species/shadow.yml index d399986a937..67f82a57cf7 100644 --- a/Resources/Prototypes/_EinsteinEngines/Species/shadow.yml +++ b/Resources/Prototypes/_EinsteinEngines/Species/shadow.yml @@ -1,6 +1,6 @@ - type: species id: Shadow - name: species-name-shadow + name: species-name-Shadow roundStart: false prototype: MobShadow sprites: MobShadowSprites diff --git a/Resources/Prototypes/_EinsteinEngines/Species/shadowkin.yml b/Resources/Prototypes/_EinsteinEngines/Species/shadowkin.yml index 542c9899bbd..a24bf575dc6 100644 --- a/Resources/Prototypes/_EinsteinEngines/Species/shadowkin.yml +++ b/Resources/Prototypes/_EinsteinEngines/Species/shadowkin.yml @@ -25,7 +25,7 @@ - Male - Female # begin Goobstation: port EE height/width sliders - minHeight: 0.75 + minHeight: 0.80 defaultHeight: 0.85 maxHeight: 1.15 minWidth: 0.77 diff --git a/Resources/Prototypes/_Floofstation/Entities/Mobs/Species/resomi.yml b/Resources/Prototypes/_Floofstation/Entities/Mobs/Species/resomi.yml index 079285d7ac4..1e16958dba0 100644 --- a/Resources/Prototypes/_Floofstation/Entities/Mobs/Species/resomi.yml +++ b/Resources/Prototypes/_Floofstation/Entities/Mobs/Species/resomi.yml @@ -250,7 +250,6 @@ - map: [ "enum.HumanoidVisualLayers.RArm" ] - map: [ "enum.HumanoidVisualLayers.LLeg" ] - map: [ "enum.HumanoidVisualLayers.RLeg" ] - - map: [ "belt" ] # Above leg - map: [ "enum.HumanoidVisualLayers.LFoot" ] - map: [ "enum.HumanoidVisualLayers.RFoot" ] - map: [ "enum.HumanoidVisualLayers.LHand" ] # Hands below jumpsuit since its bigger-than-usual sprite and this allows jumpsuits to have better-looking sleeves @@ -266,7 +265,7 @@ - map: [ "shoes" ] - map: [ "ears" ] - map: [ "outerClothing" ] - - map: [ "beltalt" ] # Omu + - map: [ "belt" ] #Goobedit - Belts over outerwear - map: [ "eyes" ] - map: [ "id" ] - map: [ "back" ] @@ -374,7 +373,6 @@ - map: [ "enum.HumanoidVisualLayers.RArm" ] - map: [ "enum.HumanoidVisualLayers.LLeg" ] - map: [ "enum.HumanoidVisualLayers.RLeg" ] - - map: [ "belt" ] # Above leg - map: [ "enum.HumanoidVisualLayers.LFoot" ] - map: [ "enum.HumanoidVisualLayers.RFoot" ] - map: [ "enum.HumanoidVisualLayers.LHand" ] # Hands below jumpsuit since its bigger-than-usual sprite and this allows jumpsuits to have better-looking sleeves @@ -390,6 +388,7 @@ - map: [ "shoes" ] - map: [ "ears" ] - map: [ "outerClothing" ] + - map: [ "belt" ] #Goobedit - Belts over outerwear - map: [ "eyes" ] - map: [ "id" ] - map: [ "back" ] diff --git a/Resources/Prototypes/_Floofstation/Species/resomi.yml b/Resources/Prototypes/_Floofstation/Species/resomi.yml index 2751f087aa6..f5daebc1139 100644 --- a/Resources/Prototypes/_Floofstation/Species/resomi.yml +++ b/Resources/Prototypes/_Floofstation/Species/resomi.yml @@ -24,6 +24,15 @@ - Unsexed - Male - Female + # begin Goobstation: port EE height/width sliders + # resomi sprites look very wrong when too big or too wide + minHeight: 0.80 + defaultHeight: 0.90 + maxHeight: 1 + minWidth: 0.85 + defaultWidth: 1 + maxWidth: 1 + # end Goobstation: port EE height/width sliders - type: speciesBaseSprites id: MobResomiSprites diff --git a/Resources/Prototypes/_Goobstation/Actions/types.yml b/Resources/Prototypes/_Goobstation/Actions/types.yml index fda7b1d024c..ac34e7e09a4 100644 --- a/Resources/Prototypes/_Goobstation/Actions/types.yml +++ b/Resources/Prototypes/_Goobstation/Actions/types.yml @@ -195,42 +195,6 @@ canTargetSelf: false event: !type:StealShoesEvent {} -- type: entity - parent: BaseAction - id: ActionCreateHellPortal - name: Make Hell Portal - description: Using your demonic powers you can open a portal to hell. - components: - - type: Action - useDelay: 60 - itemIconStyle: BigAction - icon: - sprite: /Textures/_Goobstation/Effects/portal.rsi - state: portal-hell - - type: TargetAction - range: 1 - - type: WorldTargetAction - event: !type:WorldSpawnSpellEvent - prototypes: - - id: HellPortal - amount: 1 - offset: 0, 0 - -- type: entity - parent: BaseAction - id: ActionHellGooseTeleport - name: Teleport to station - description: Teleports you to the station. - components: - - type: Action - useDelay: 30 - itemIconStyle: BigAction - icon: - sprite: /Textures/_Goobstation/Effects/portal.rsi - state: portal-chrono - - type: InstantAction - event: !type:GooseTeleportEvent - - type: entity id: ActionVehicleWallPush name: Wall Launch diff --git a/Resources/Prototypes/_Goobstation/Actions/wizard.yml b/Resources/Prototypes/_Goobstation/Actions/wizard.yml index 029466b8012..6312d7f3e13 100644 --- a/Resources/Prototypes/_Goobstation/Actions/wizard.yml +++ b/Resources/Prototypes/_Goobstation/Actions/wizard.yml @@ -957,7 +957,6 @@ sprite: _Goobstation/Wizard/actions.rsi state: swap - type: TargetAction - checkCanAccess: false interactOnMiss: false range: 15 - type: EntityTargetAction diff --git a/Resources/Prototypes/_Goobstation/Actions/xenomorph.yml b/Resources/Prototypes/_Goobstation/Actions/xenomorph.yml new file mode 100644 index 00000000000..dad0cbf92bd --- /dev/null +++ b/Resources/Prototypes/_Goobstation/Actions/xenomorph.yml @@ -0,0 +1,23 @@ +- type: entity + id: ActionSpawnResinDoor + parent: BaseAction + name: Build a resin door (75) + description: Secrete tough malleable resin. + components: + - type: Action + useDelay: 1 + itemIconStyle: BigAction + icon: { sprite : _RMC14/Structures/Xenos/xeno_resin_door.rsi, state: resin } + - type: TargetAction + range: 2 + - type: WorldTargetAction + event: !type:PlaceTileEntityEvent + entity: ResinDoor + length: 0.5 + blockedCollisionMask: + - TableMask + blockedCollisionLayer: + - TableLayer + - BulletImpassable + - type: PlasmaCostAction + plasmaCost: 75 diff --git a/Resources/Prototypes/_Goobstation/Catalog/Fills/Lockers/security.yml b/Resources/Prototypes/_Goobstation/Catalog/Fills/Lockers/security.yml index 8e78b930609..63db4ec8fc3 100644 --- a/Resources/Prototypes/_Goobstation/Catalog/Fills/Lockers/security.yml +++ b/Resources/Prototypes/_Goobstation/Catalog/Fills/Lockers/security.yml @@ -16,4 +16,3 @@ - id: BoxGrenadesBaton - id: BoxGrenadesFlash - id: BoxGrenadesTeargas - - id: BoxGrenadesMixedShot # Omu diff --git a/Resources/Prototypes/_Goobstation/Catalog/selectable_sets.yml b/Resources/Prototypes/_Goobstation/Catalog/selectable_sets.yml index 314e022d36a..33fd112b2f0 100644 --- a/Resources/Prototypes/_Goobstation/Catalog/selectable_sets.yml +++ b/Resources/Prototypes/_Goobstation/Catalog/selectable_sets.yml @@ -11,10 +11,10 @@ # SPDX-FileCopyrightText: 2025 Misandry # SPDX-FileCopyrightText: 2025 Orion-416 # SPDX-FileCopyrightText: 2025 PunishedJoe -# SPDX-FileCopyrightText: 2025 PAFFhassoocks # SPDX-FileCopyrightText: 2025 SX-7 # SPDX-FileCopyrightText: 2025 Solstice # SPDX-FileCopyrightText: 2025 Ted Lukin <66275205+pheenty@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 TurboTracker <130304754+TurboTrackerss14@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 pheenty # @@ -392,7 +392,7 @@ sprite: _Goobstation/Objects/Weapons/Melee/blueshield_knife.rsi state: icon content: - - ClothingBeltMilitaryWebbingBSOFilled # Omu - BSO Webbing Vest + - ClothingBeltMilitaryWebbingBSOFilled # Blueshield hardsuits diff --git a/Resources/Prototypes/_Goobstation/Catalog/spellbook_catalog.yml b/Resources/Prototypes/_Goobstation/Catalog/spellbook_catalog.yml index 7722ca1b50e..fbc39b1a14d 100644 --- a/Resources/Prototypes/_Goobstation/Catalog/spellbook_catalog.yml +++ b/Resources/Prototypes/_Goobstation/Catalog/spellbook_catalog.yml @@ -7,4 +7,7 @@ WizCoin: 1 categories: - SpellbookEquipment + conditions: + - !type:ListingLimitedStockCondition + stock: 1 disableRefund: true #no gamble scamming diff --git a/Resources/Prototypes/_Goobstation/Damage/modifier_sets.yml b/Resources/Prototypes/_Goobstation/Damage/modifier_sets.yml index c9fbbb9836b..5bf2fb46fcc 100644 --- a/Resources/Prototypes/_Goobstation/Damage/modifier_sets.yml +++ b/Resources/Prototypes/_Goobstation/Damage/modifier_sets.yml @@ -71,17 +71,6 @@ Cold: 0.80 ignoreArmorPierceFlags: All -- type: damageModifierSet - id: FireShark - coefficients: - Heat: 0.25 - Cold: 0.25 - Poison: 0.0 - Radiation: 0.0 - Asphyxiation: 0.0 - Cellular: 0.0 - ignoreArmorPierceFlags: All - # Mech armor - type: damageModifierSet id: ThinArmor diff --git a/Resources/Prototypes/_Goobstation/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/_Goobstation/Entities/Clothing/Belt/belts.yml index c459f19f231..216e2747dec 100644 --- a/Resources/Prototypes/_Goobstation/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/_Goobstation/Entities/Clothing/Belt/belts.yml @@ -10,7 +10,7 @@ # SPDX-FileCopyrightText: 2025 PunishedJoe # SPDX-FileCopyrightText: 2025 Solstice # SPDX-FileCopyrightText: 2025 Ted Lukin <66275205+pheenty@users.noreply.github.com> -# SPDX-FileCopyrightText: 2025 PAFFhassoocks +# SPDX-FileCopyrightText: 2025 TurboTracker <130304754+TurboTrackerss14@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 floatingfeeling # SPDX-FileCopyrightText: 2025 freturt @@ -238,3 +238,30 @@ whitelist: tags: - Sidearm + +- type: entity + parent: [ClothingBeltStorageBase, ContentsExplosionResistanceBase, BaseCentcommContraband] + id: ClothingBeltMilitaryWebbingBSOFilled + name: blueshield chest rig + description: A set of tactical webbing worn by Central Command support units. + components: + - type: Sprite + sprite: Clothing/Belt/militarywebbing.rsi + - type: Clothing + sprite: Clothing/Belt/militarywebbing.rsi + - type: ExplosionResistance + damageCoefficient: 0.05 + - type: StorageFill + contents: + - id: CombatInjector + amount: 1 + - id: TirimolChemistryVial + amount: 1 + - id: OmnizineChemistryVial + amount: 1 + - id: SyriniverChemistryVial + amount: 1 + - id: ProcenylLazideChemistryVial + amount: 1 + - id: EbifinlLazideChemistryVial + amount: 1 diff --git a/Resources/Prototypes/_Goobstation/Entities/Clothing/Eyes/glasses.yml b/Resources/Prototypes/_Goobstation/Entities/Clothing/Eyes/glasses.yml index 7fdfdf3818c..41cc124ab22 100644 --- a/Resources/Prototypes/_Goobstation/Entities/Clothing/Eyes/glasses.yml +++ b/Resources/Prototypes/_Goobstation/Entities/Clothing/Eyes/glasses.yml @@ -184,7 +184,7 @@ lightRadius: 15 - type: entity - parent: [ClothingEyesBase, ShowSecurityIcons, ShowMedicalIcons, BaseCentcommContraband] + parent: [ClothingEyesHudOmni, BaseCentcommContraband] id: ClothingEyesGlassesCentCommNoThermal suffix: No thermals, DO NOT MAP name: central command shades @@ -202,12 +202,6 @@ - WhitelistChameleon - type: IdentityBlocker coverage: EYES - - type: ShowHealthBars - damageContainers: - - Biological - - Inorganic - - type: ShowHungerIcons - - type: ShowThirstIcons - type: entity parent: [ClothingEyesBase, ShowHealthRelatedIcons, BaseCentcommContraband, ClothingEyesGlassesSunglasses] diff --git a/Resources/Prototypes/_Goobstation/Entities/Clothing/Head/modsuit.yml b/Resources/Prototypes/_Goobstation/Entities/Clothing/Head/modsuit.yml index 5cff2d59765..954fa7ab6b1 100644 --- a/Resources/Prototypes/_Goobstation/Entities/Clothing/Head/modsuit.yml +++ b/Resources/Prototypes/_Goobstation/Entities/Clothing/Head/modsuit.yml @@ -131,18 +131,13 @@ - HeadTop - HeadSide #THIS WILL BE REPLACED WITH MODULE ↓↓ - # Omu start, Fix modsuit light - - type: ToggleableVisuals - spriteLayer: light - - type: ItemTogglePointLight - # Omu end - type: PointLight enabled: false radius: 3 energy: 2 mask: /Textures/Effects/LightMasks/cone.png autoRot: true - netsync: false # Omu, this needs to be false for our fix to work. + netsync: true - type: HandheldLight addPrefix: true blinkingBehaviourId: blinking @@ -244,18 +239,13 @@ - HeadTop - HeadSide #THIS WILL BE REPLACED WITH MODULE ↓↓ - # Omu start, Fix modsuit light - - type: ToggleableVisuals - spriteLayer: light - - type: ItemTogglePointLight - # Omu end - type: PointLight enabled: false radius: 5 energy: 3 mask: /Textures/Effects/LightMasks/cone.png autoRot: true - netsync: false # Omu, this needs to be false for our fix to work. + netsync: true - type: HandheldLight addPrefix: true blinkingBehaviourId: blinking @@ -343,18 +333,13 @@ heatingCoefficient: 0.01 coolingCoefficient: 0.01 #THIS WILL BE REPLACED WITH MODULE ↓↓ - # Omu start, Fix modsuit light - - type: ToggleableVisuals - spriteLayer: light - - type: ItemTogglePointLight - # Omu end - type: PointLight enabled: false radius: 5 energy: 3 mask: /Textures/Effects/LightMasks/cone.png autoRot: true - netsync: false # Omu, this needs to be false for our fix to work. + netsync: true - type: HandheldLight addPrefix: true blinkingBehaviourId: blinking @@ -427,18 +412,13 @@ heatingCoefficient: 0.01 coolingCoefficient: 0.01 #THIS WILL BE REPLACED WITH MODULE ↓↓ - # Omu start, Fix modsuit light - - type: ToggleableVisuals - spriteLayer: light - - type: ItemTogglePointLight - # Omu end - type: PointLight enabled: false radius: 5 energy: 3 mask: /Textures/Effects/LightMasks/cone.png autoRot: true - netsync: false # Omu, this needs to be false for our fix to work. + netsync: true - type: HandheldLight addPrefix: true blinkingBehaviourId: blinking @@ -515,18 +495,13 @@ heatingCoefficient: 0.01 coolingCoefficient: 0.01 #THIS WILL BE REPLACED WITH MODULE ↓↓ - # Omu start, Fix modsuit light - - type: ToggleableVisuals - spriteLayer: light - - type: ItemTogglePointLight - # Omu end - type: PointLight enabled: false radius: 5 energy: 3 mask: /Textures/Effects/LightMasks/cone.png autoRot: true - netsync: false # Omu, this needs to be false for our fix to work. + netsync: true - type: HandheldLight addPrefix: true blinkingBehaviourId: blinking @@ -616,18 +591,13 @@ - HeadTop - HeadSide #THIS WILL BE REPLACED WITH MODULE ↓↓ - # Omu start, Fix modsuit light - - type: ToggleableVisuals - spriteLayer: light - - type: ItemTogglePointLight - # Omu end - type: PointLight enabled: false radius: 5 energy: 3 mask: /Textures/Effects/LightMasks/cone.png autoRot: true - netsync: false # Omu, this needs to be false for our fix to work. + netsync: true - type: HandheldLight addPrefix: true blinkingBehaviourId: blinking @@ -710,18 +680,13 @@ heatingCoefficient: 0.01 coolingCoefficient: 0.01 #THIS WILL BE REPLACED WITH MODULE ↓↓ - # Omu start, Fix modsuit light - - type: ToggleableVisuals - spriteLayer: light - - type: ItemTogglePointLight - # Omu end - type: PointLight enabled: false radius: 5 energy: 3 mask: /Textures/Effects/LightMasks/cone.png autoRot: true - netsync: false # Omu, this needs to be false for our fix to work. + netsync: true - type: HandheldLight addPrefix: true blinkingBehaviourId: blinking @@ -817,18 +782,13 @@ - HeadTop - HeadSide #THIS WILL BE REPLACED WITH MODULE ↓↓ - # Omu start, Fix modsuit light - - type: ToggleableVisuals - spriteLayer: light - - type: ItemTogglePointLight - # Omu end - type: PointLight enabled: false radius: 5 energy: 3 mask: /Textures/Effects/LightMasks/cone.png autoRot: true - netsync: false # Omu, this needs to be false for our fix to work. + netsync: true - type: HandheldLight addPrefix: true blinkingBehaviourId: blinking diff --git a/Resources/Prototypes/_Goobstation/Entities/Markers/Spawners/silicon.yml b/Resources/Prototypes/_Goobstation/Entities/Markers/Spawners/silicon.yml index 291bf8b51ed..288dff3b645 100644 --- a/Resources/Prototypes/_Goobstation/Entities/Markers/Spawners/silicon.yml +++ b/Resources/Prototypes/_Goobstation/Entities/Markers/Spawners/silicon.yml @@ -1,12 +1,12 @@ -#- type: entity # Omu, disable 'GoidaBot' -# parent: MarkerBase -# id: SpawnMobGoidaBot -# name: goidabot spawner -# components: -# - type: Sprite -# layers: -# - state: green -# - state: ai -# - type: ConditionalSpawner -# prototypes: -# - MobGoidaBot +- type: entity + parent: MarkerBase + id: SpawnMobGoidaBot + name: goidabot spawner + components: + - type: Sprite + layers: + - state: green + - state: ai + - type: ConditionalSpawner + prototypes: + - MobGoidaBot diff --git a/Resources/Prototypes/_Goobstation/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/_Goobstation/Entities/Mobs/NPCs/animals.yml index aa897b67d7b..dd53b037ae9 100644 --- a/Resources/Prototypes/_Goobstation/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/_Goobstation/Entities/Mobs/NPCs/animals.yml @@ -291,7 +291,7 @@ - Mouse - type: VentCrawler # goobstation - Ventcrawl - type: Devourer - structureDevourTime: 3 + devourAction: ActionDevourLootbug foodPreferenceWhitelist: tags: - Ingot @@ -311,6 +311,8 @@ - Steel - Ore - Telecrystal + - type: MobPrice + price: 500 - type: entity name: space carp diff --git a/Resources/Prototypes/_Goobstation/Entities/Mobs/NPCs/goidabot.yml b/Resources/Prototypes/_Goobstation/Entities/Mobs/NPCs/goidabot.yml index c24940d5a97..edda619c735 100644 --- a/Resources/Prototypes/_Goobstation/Entities/Mobs/NPCs/goidabot.yml +++ b/Resources/Prototypes/_Goobstation/Entities/Mobs/NPCs/goidabot.yml @@ -1,55 +1,55 @@ # goida -#- type: entity # Omu, disable 'GoidaBot' -# parent: [MobSiliconBase, MobCombat] -# id: MobGoidaBot -# name: goida bot -# description: ГОЙДА -# components: -# - type: Sprite -# sprite: _Goobstation/Mobs/Silicon/Bots/goidabot.rsi -# state: goidabot -# - type: RussianAccent -# - type: Advertise -# pack: Goida -# minimumWait: 1 -# maximumWait: 8 -# - type: MeleeWeapon # same as a wielded baseball bat, only used with admin abuse -# animationRotation: -135 -# heavyStaminaCost: 15 -# wideAnimationRotation: -135 -# damage: -# types: -# Blunt: 15 -# Structural: 15 -# soundHit: -# collection: MetalThud -# - type: HTN -# rootTask: -# task: HonkbotCompound -# - type: Destructible -# thresholds: -# - trigger: !type:DamageTrigger -# damage: 220 -# behaviors: -# - !type:DoActsBehavior -# acts: [ "Destruction" ] -# - type: MobState -# allowedStates: -# - Alive -# - Dead -# - type: MobThresholds -# thresholds: -# 0: Alive -# 220: Dead -# - type: Construction -# graph: GoidaBot -# node: bot -# - type: InteractionPopup -# interactSuccessString: goida-1 -# interactFailureString: goida-1 +- type: entity + parent: [MobSiliconBase, MobCombat] + id: MobGoidaBot + name: goida bot + description: ГОЙДА + components: + - type: Sprite + sprite: _Goobstation/Mobs/Silicon/Bots/goidabot.rsi + state: goidabot + - type: RussianAccent + - type: Advertise + pack: Goida + minimumWait: 1 + maximumWait: 8 + - type: MeleeWeapon # same as a wielded baseball bat, only used with admin abuse + animationRotation: -135 + heavyStaminaCost: 15 + wideAnimationRotation: -135 + damage: + types: + Blunt: 15 + Structural: 15 + soundHit: + collection: MetalThud + - type: HTN + rootTask: + task: HonkbotCompound + - type: Destructible + thresholds: + - trigger: !type:DamageTrigger + damage: 220 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: MobState + allowedStates: + - Alive + - Dead + - type: MobThresholds + thresholds: + 0: Alive + 220: Dead + - type: Construction + graph: GoidaBot + node: bot + - type: InteractionPopup + interactSuccessString: goida-1 + interactFailureString: goida-1 -#- type: localizedDataset -# id: Goida -# values: -# prefix: goida- -# count: 1 +- type: localizedDataset + id: Goida + values: + prefix: goida- + count: 1 diff --git a/Resources/Prototypes/_Goobstation/Entities/Mobs/Player/floorgoblin.yml b/Resources/Prototypes/_Goobstation/Entities/Mobs/Player/floorgoblin.yml index a9ee1de2337..6066a999f6f 100644 --- a/Resources/Prototypes/_Goobstation/Entities/Mobs/Player/floorgoblin.yml +++ b/Resources/Prototypes/_Goobstation/Entities/Mobs/Player/floorgoblin.yml @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2025 Evaisa -# SPDX-FileCopyrightText: 2025 RichardBlonski <48651647+RichardBlonski@users.noreply.github.com> +# # SPDX-License-Identifier: AGPL-3.0-or-later - type: entity @@ -14,7 +14,6 @@ layers: - map: ["enum.DamageStateVisualLayers.Base"] state: floor_goblin - - type: Physics - type: Fixtures fixtures: fix1: @@ -23,10 +22,9 @@ radius: 0.2 density: 100 mask: - - MobMask + - SmallMobMask layer: - - MobLayer - # Regular mob collision, but we'll handle small mob behavior in code + - SmallMobLayer - type: GhostRole makeSentient: true allowSpeech: true diff --git a/Resources/Prototypes/_Goobstation/Entities/Objects/Misc/emergencybox.yml b/Resources/Prototypes/_Goobstation/Entities/Objects/Misc/emergencybox.yml index 9ad61733cdf..bb013ccab35 100644 --- a/Resources/Prototypes/_Goobstation/Entities/Objects/Misc/emergencybox.yml +++ b/Resources/Prototypes/_Goobstation/Entities/Objects/Misc/emergencybox.yml @@ -59,7 +59,6 @@ tags: - FoodSnack - BreadEmergency - - FoodTinMRE flare: ejectOnInteract: false whitelist: @@ -76,7 +75,6 @@ - ExtendedEmergencyNitrogenTank - EmergencyPlasmaTank - ExtendedEmergencyPlasmaTank - - EmergencyWaterVaporTank mask: ejectOnInteract: false whitelist: @@ -117,7 +115,6 @@ tags: - FoodSnack - BreadEmergency - - FoodTinMRE flare: whitelist: tags: @@ -162,10 +159,6 @@ whitelist: tags: - EmergencyNitrogenTank - vapor: - whitelist: - tags: - - EmergencyWaterVaporTank battery: whitelist: tags: diff --git a/Resources/Prototypes/_Goobstation/Entities/Objects/Misc/implanters.yml b/Resources/Prototypes/_Goobstation/Entities/Objects/Misc/implanters.yml index 10808b25b55..714d6d88345 100644 --- a/Resources/Prototypes/_Goobstation/Entities/Objects/Misc/implanters.yml +++ b/Resources/Prototypes/_Goobstation/Entities/Objects/Misc/implanters.yml @@ -22,7 +22,7 @@ id: BaseFastDrawImplanter parent: BaseImplanter name: fast draw implanter - description: A syringe with tools for quick implant removal and implant crushing. It has small gold stars on its body. + description: A syringe with tools for quick implant removal. It has small gold stars on its body. abstract: true components: - type: Sprite @@ -36,11 +36,7 @@ map: [ "implantOnly" ] - type: Implanter currentMode: Draw - drawTime: 10 # funkystation - deimplantFailureDamage: - types: - Heat: 20 - deimplantCrushes: true + drawTime: 30 - type: entity id: RevsFastDrawImplanter @@ -103,7 +99,7 @@ - type: entity id: BluespaceLifelineImplanter - suffix: Bluespace Lifeline + name: bluespace lifeline implanter parent: BaseImplantOnlyImplanterCentcomm components: - type: Implanter @@ -111,7 +107,7 @@ - type: entity id: CommandTrackingImplanter - suffix: Command Tracker + suffix: command tracker parent: BaseImplantOnlyImplanterCentcomm components: - type: Implanter @@ -119,7 +115,7 @@ - type: entity id: CentcommFreedomImplanter - suffix: Freedom + name: freedom implant implanter parent: BaseImplantOnlyImplanterCentcomm components: - type: Implanter @@ -127,7 +123,7 @@ - type: entity id: CentcommStorageImplanter - suffix: Storage + name: storage implant implanter parent: BaseImplantOnlyImplanterCentcomm components: - type: Implanter @@ -135,7 +131,7 @@ - type: entity id: CentcommMindShieldImplanter - suffix: Mindshield + name: mindshield implanter parent: BaseImplantOnlyImplanterCentcomm components: - type: Implanter @@ -143,7 +139,7 @@ - type: entity id: CentcommNutrimentImplanter - suffix: Nutriment Pump + name: nutriment pump implanter parent: BaseImplantOnlyImplanterCentcomm components: - type: Implanter @@ -151,7 +147,7 @@ - type: entity id: CentcommSpaceproofImplanter - suffix: Space Proofing + name: space proofing implanter parent: BaseImplantOnlyImplanterCentcomm components: - type: Implanter @@ -159,7 +155,7 @@ - type: entity id: CentcommStypticStimulatorImplanter - suffix: Styptic Stimulator + name: styptic stimulator implanter parent: BaseImplantOnlyImplanterCentcomm components: - type: Implanter @@ -168,7 +164,7 @@ - type: entity parent: BaseImplantOnlyImplanter id: PacifismImplanter - suffix: Pacifism + name: pacifism implant implanter components: - type: Implanter implant: PacifismImplant @@ -176,14 +172,14 @@ - type: entity parent: BaseImplantOnlyImplanterSyndi id: SmokeImplanter - suffix: Smoke + name: smoke implant implanter components: - type: Implanter implant: SmokeImplant - type: entity id: NutrimentImplanter - suffix: Nutriment Pump + name: nutriment pump implanter parent: BaseImplantOnlyImplanterSyndi components: - type: Implanter @@ -191,7 +187,7 @@ - type: entity id: StypticStimulatorImplanter - suffix: Styptic Stimulator + name: styptic stimulator implanter parent: BaseImplantOnlyImplanterSyndi components: - type: Implanter @@ -200,7 +196,7 @@ - type: entity parent: BaseImplantOnlyImplanterSyndi id: KravMagaImplanter - suffix: Krav Maga + name: krav maga nanochip implanter components: - type: Implanter implant: KravMagaImplant @@ -208,14 +204,14 @@ - type: entity parent: BaseImplantOnlyImplanterSyndi id: ClumsyImplanter - suffix: Clumsy + name: Clumsy Implanter components: - type: Implanter implant: ClumsyImplant - type: entity id: BinaryImplanter - suffix: Binary Decoder + name: binary decoder implanter parent: BaseImplantOnlyImplanterSyndi components: - type: Implanter @@ -225,7 +221,8 @@ - type: entity id: VaporizeImplanter - suffix: Vaporize, DO NOT MAP + name: vaporize implant implanter + suffix: DO NOT MAP parent: BaseImplantOnlyImplanterCentcomm components: - type: Implanter @@ -233,7 +230,8 @@ - type: entity id: ShiftImplanter - suffix: Shift, DO NOT MAP + name: shift implant implanter + suffix: DO NOT MAP parent: BaseImplantOnlyImplanterCentcomm components: - type: Implanter @@ -241,7 +239,8 @@ - type: entity id: BlinkImplanter - suffix: Blink, DO NOT MAP + name: blink implant implanter + suffix: DO NOT MAP parent: BaseImplantOnlyImplanterCentcomm components: - type: Implanter @@ -249,7 +248,8 @@ - type: entity id: StopTimeImplanter - suffix: Time Stop, DO NOT MAP + name: stop time implant implanter + suffix: DO NOT MAP parent: BaseImplantOnlyImplanterCentcomm components: - type: Implanter @@ -257,7 +257,7 @@ - type: entity id: NaniteMenderImplanter - suffix: Nanite Mender, DO NOT MAP + suffix: nanite mender, DO NOT MAP parent: BaseImplantOnlyImplanterCentcomm components: - type: Implanter @@ -265,32 +265,26 @@ # Antag Planet -- type: entity - abstract: true - id: BaseAntagImplantOnlyImplanter - parent: BaseImplantOnlyImplanterCentcomm - name: antag implanter - - type: entity id: AntagImplanterChangeling - suffix: Changeling - parent: BaseAntagImplantOnlyImplanter + name: changeling nanochip implanter + parent: BaseImplantOnlyImplanterCentcomm components: - type: Implanter implant: AntagImplantChangeling - type: entity id: AntagImplanterHeretic - suffix: Heretic - parent: BaseAntagImplantOnlyImplanter + name: heretic nanochip implanter + parent: BaseImplantOnlyImplanterCentcomm components: - type: Implanter implant: AntagImplantHeretic - type: entity id: AntagImplanterSpaceNinja - suffix: Space Ninja - parent: BaseAntagImplantOnlyImplanter + name: space ninja nanochip implanter + parent: BaseImplantOnlyImplanterCentcomm components: - type: Implanter implant: AntagImplantSpaceNinja @@ -300,7 +294,7 @@ - type: entity parent: BaseImplantOnlyImplanter id: XenoCompatibilityImplanter - suffix: Xeno Compatibility + name: xeno compatibility implanter components: - type: Implanter implant: XenoCompatibilityImplant diff --git a/Resources/Prototypes/_Goobstation/Entities/Objects/Weapons/Revolutionary/converters.yml b/Resources/Prototypes/_Goobstation/Entities/Objects/Weapons/Revolutionary/converters.yml new file mode 100644 index 00000000000..2ba78c7fe45 --- /dev/null +++ b/Resources/Prototypes/_Goobstation/Entities/Objects/Weapons/Revolutionary/converters.yml @@ -0,0 +1,55 @@ +- type: entity + name: flash + id: RevFlash + parent: [BaseItem, BaseSecurityScienceCommandContraband] + description: An ultrabright flashbulb with a trigger, which causes the victim to be dazed and lose their eyesight for a moment. Useless when burnt out. This one seems to have been tampered with. + suffix: Revolutionary + components: + - type: RevolutionaryConverter + conversionDuration: 0 + silent: true + consumesCharges: 1 + applyFlashEffect: true + - type: LimitedCharges + maxCharges: 5 + - type: Sprite + sprite: _Goobstation/Objects/Weapons/Melee/revflash.rsi + layers: + - state: flash + map: ["enum.FlashVisualLayers.BaseLayer"] + - state: flashing + map: ["enum.FlashVisualLayers.LightLayer"] + visible: false + shader: unshaded + - type: EmitSoundOnPickup + sound: + path: /Audio/_Goobstation/Items/handling/component_pickup.ogg + - type: EmitSoundOnDrop + sound: + path: /Audio/_Goobstation/Items/handling/component_drop.ogg + - type: EmitSoundOnLand + sound: + path: /Audio/_Goobstation/Items/handling/component_drop.ogg + - type: Item + size: Small + sprite: _Goobstation/Objects/Weapons/Melee/revflash.rsi + - type: UseDelay + delay: 4 # has to be the same as the FlashingTime datafield in FlashComponent + - type: StaticPrice + price: 30 + - type: Appearance + - type: GenericVisualizer + visuals: + enum.FlashVisuals.Burnt: + enum.FlashVisualLayers.BaseLayer: + True: { state: burnt } + - type: GuideHelp + guides: + - Security + - Antagonists + - type: Construction + graph: RevFlash + node: revFlash + - type: Tag + tags: + - RevFlash diff --git a/Resources/Prototypes/_Goobstation/GameRules/midround.yml b/Resources/Prototypes/_Goobstation/GameRules/midround.yml index a509c3acab8..c1ec5058116 100644 --- a/Resources/Prototypes/_Goobstation/GameRules/midround.yml +++ b/Resources/Prototypes/_Goobstation/GameRules/midround.yml @@ -100,7 +100,7 @@ - type: StationEvent earliestStart: 20 weight: 3 - minimumPlayers: 100 # OMU change - removes from valid event pool + minimumPlayers: 30 startAnnouncement: station-event-communication-interception startAudio: path: /Audio/Announcements/intercept.ogg @@ -142,7 +142,7 @@ - type: StationEvent earliestStart: 20 weight: 3 - minimumPlayers: 100 # OMU change - removes from valid event pool + minimumPlayers: 30 maxOccurrences: 1 duration: null occursDuringRoundEnd: false @@ -205,11 +205,11 @@ id: BlobMidround components: - type: StationEvent - weight: 1.5 #omu - earliestStart: 80 #omu - minimumPlayers: 100 # OMU change - removes from valid event pool + weight: 1 + earliestStart: 45 + minimumPlayers: 50 duration: null - maxOccurrences: 2 #omu + maxOccurrences: 1 chaos: Hostile: 400 Medical: 400 diff --git a/Resources/Prototypes/_Goobstation/GameRules/pests.yml b/Resources/Prototypes/_Goobstation/GameRules/pests.yml index 17afc6045c6..818994a90d2 100644 --- a/Resources/Prototypes/_Goobstation/GameRules/pests.yml +++ b/Resources/Prototypes/_Goobstation/GameRules/pests.yml @@ -35,20 +35,3 @@ max: 1 table: id: MobFloorGoblin - -- type: entity - parent: BaseGameRule - id: HellGooseSpawn - components: - - type: StationEvent - earliestStart: 30 - minimumPlayers: 30 - weight: 5 - reoccurrenceDelay: 60 - eventType: Neutral - - type: GameRule - chaosScore: 0 - - type: VentCrittersRule - max: 1 - table: - id: MobHellGoose diff --git a/Resources/Prototypes/_Goobstation/GameRules/secretplus.yml b/Resources/Prototypes/_Goobstation/GameRules/secretplus.yml index acece41b86b..33a636420a5 100644 --- a/Resources/Prototypes/_Goobstation/GameRules/secretplus.yml +++ b/Resources/Prototypes/_Goobstation/GameRules/secretplus.yml @@ -21,12 +21,11 @@ # subgamemodes Thief: 0.2 Devil: 0.02 - Shadowling: 0.09 # normal Traitor: 0.25 Changeling: 0.10 Heretic: 0.11 -# DuoAbductorRoundstart: 0.05 # Omu, This gamerule is broken + DuoAbductorRoundstart: 0.05 CorporateAgent: 0.025 # important note: those (and above) weights aren't entirely accurate, @@ -40,7 +39,7 @@ Traitor: 0.25 Changeling: 0.10 Heretic: 0.11 -# DuoAbductorRoundstart: 0.05 # Omu, This gamerule is broken + DuoAbductorRoundstart: 0.05 Nukeops: 0.05 Revolutionary: 0.05 Zombie: 0.04 # in search of how to make a rule always run alone? just tag it with LoneRunRule like zombies are @@ -55,7 +54,6 @@ weights: Thief: 0.2 Devil: 0.02 - Shadowling: 0.09 Traitor: 0.25 Changeling: 0.10 Heretic: 0.11 @@ -74,16 +72,16 @@ components: - type: SecretPlus # if you've come here due to "too many antags", you probably want to raise playerRatio on the individual antag rules instead - minStartingChaos: 10 # scales per player #omu - maxStartingChaos: 20 #omu - livingChaosChange: -0.012 #omu - deadChaosChange: 0.048 # OMU change, makes the event timer care about death more + minStartingChaos: 11 # scales per player + maxStartingChaos: 22 + livingChaosChange: -0.018 + deadChaosChange: 0.020 # chance for greenshift as well as evilshift chaosChangeVariationMin: 0.65 chaosChangeVariationMax: 1.3 # often fires chud events so relatively low - eventIntervalMin: 180 # OMU change, makes event's more spaced out - eventIntervalMax: 450 # OMU change, makes event's more spaced out + eventIntervalMin: 90 + eventIntervalMax: 300 # there's some misc variables in the comp if you want to try tweaking those - type: SelectedGameRules scheduledGameRules: !type:NestedSelector diff --git a/Resources/Prototypes/_Goobstation/Heretic/Entities/Abilities/abilities.yml b/Resources/Prototypes/_Goobstation/Heretic/Entities/Abilities/abilities.yml index 8e66dd6fe4d..8fa4a1856df 100644 --- a/Resources/Prototypes/_Goobstation/Heretic/Entities/Abilities/abilities.yml +++ b/Resources/Prototypes/_Goobstation/Heretic/Entities/Abilities/abilities.yml @@ -90,38 +90,6 @@ tags: - HideContextMenu -- type: entity - id: EffectVoidBlinkIn - categories: [ HideSpawnMenu ] - components: - - type: TimedDespawn - lifetime: 0.5 - - type: Sprite - noRot: true - drawdepth: Effects - layers: - - sprite: _Goobstation/Heretic/Effects/effects96x96.rsi - state: void_blink_in - - type: Tag - tags: - - HideContextMenu - -- type: entity - id: EffectVoidBlinkOut - categories: [ HideSpawnMenu ] - components: - - type: TimedDespawn - lifetime: 0.5 - - type: Sprite - noRot: true - drawdepth: Effects - layers: - - sprite: _Goobstation/Heretic/Effects/effects96x96.rsi - state: void_blink_out - - type: Tag - tags: - - HideContextMenu - - type: entity id: ShadowCloakEntity save: false diff --git a/Resources/Prototypes/_Goobstation/Heretic/Heretic/heretic_rituals.yml b/Resources/Prototypes/_Goobstation/Heretic/Heretic/heretic_rituals.yml index 520a3f5fb39..4e8ee5d3fe9 100644 --- a/Resources/Prototypes/_Goobstation/Heretic/Heretic/heretic_rituals.yml +++ b/Resources/Prototypes/_Goobstation/Heretic/Heretic/heretic_rituals.yml @@ -411,6 +411,7 @@ requiredTags: Steel: 10 CableCoil: 15 + ImprovisedShotgun: 1 output: MobGhoulRustWalker: 1 diff --git a/Resources/Prototypes/_Goobstation/Languages/Faction/revolutionary.yml b/Resources/Prototypes/_Goobstation/Languages/Faction/revolutionary.yml new file mode 100644 index 00000000000..98051eb4354 --- /dev/null +++ b/Resources/Prototypes/_Goobstation/Languages/Faction/revolutionary.yml @@ -0,0 +1,128 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later + +- type: language + id: Revolutionary + obfuscation: + !type:PhraseObfuscation + proportion: 0.88 + minPhrases: 1 + maxPhrases: 5 + replacement: + # Revolutionary themed words + - comrade + - glory + - liberate + - uprising + - struggle + - manifesto + - strike + - union + - agitator + - hammer + - sickle + - solidarity + - power + - revolt + - free + - justice + - protest + - collective + - cause + - rebellion + - overthrow + - march + - banner + - torch + - red + - purge + - barricade + - commune + - revolution + - workers + - mutiny + - seize + - sabotage + - propaganda + - vanguard + - martyr + - anthem + - radical + - syndicate + - brotherhood + - cells + - plot + - mobilize + - strikeforce + - committee + - liberation + - resistance + - topple + - unseat + - dethrone + - depose + - overthrow + - oust + - subvert + - disrupt + - sabotage + - undermine + - revolt + - rebel + - mutiny + - rise + - defy + - resist + - abolish + - dismantle + - shatter + - crush + - seize + - storm + - strike + - abolish + - bury + - eradicate + # funny + - shitsec + - validhunt + - batonbrain + - valid + - robust + - unrobust + - viva + # "normal" words to give the phrase a chance at having a resemblance to something that might be considered a normal sentence + - and + - or + - then + - maybe + - due + - towards + - for + - with + - against + - because + - under + - before + - after + - over + - until + - around + - among + - from + - to + - by + - as + - if + - la + - while + - us + - when + - since + - but + - them + - I + - we + - they + - will + - soon + - now diff --git a/Resources/Prototypes/_Goobstation/Maps/serpentcrest.yml b/Resources/Prototypes/_Goobstation/Maps/serpentcrest.yml index 7628272717c..8fac23b41e9 100644 --- a/Resources/Prototypes/_Goobstation/Maps/serpentcrest.yml +++ b/Resources/Prototypes/_Goobstation/Maps/serpentcrest.yml @@ -6,7 +6,7 @@ - type: gameMap id: Serpentcrest mapName: 'Serpentcrest' - mapPath: /Maps/_Omu/serpentcrest.yml # Omu - Prisoner role mapping + mapPath: /Maps/_Goobstation/serpentcrest.yml minPlayers: 40 stations: Serpentcrest: @@ -28,7 +28,6 @@ NanotrasenRepresentative: [ 1, 1 ] BlueshieldOfficer: [ 1, 1 ] HeadOfPersonnel: [ 1, 1 ] - AdministrativeAssistant: [ 1, 1 ] # Delta V Bartender: [ 2, 2 ] Botanist: [ 2, 3 ] Chef: [ 2, 2 ] @@ -59,7 +58,6 @@ SecurityCadet: [ 3, 3 ] Lawyer: [ 2, 2 ] Brigmedic: [ 1, 1 ] - TransitPrisoner: [3, 3] # Omu - Prisoner role #supply Quartermaster: [ 1, 1 ] SalvageSpecialist: [ 4, 4 ] diff --git a/Resources/Prototypes/_Goobstation/NTR/Catalog/ntr_catalog.yml b/Resources/Prototypes/_Goobstation/NTR/Catalog/ntr_catalog.yml index 32a9304883d..d94efd6f4e4 100644 --- a/Resources/Prototypes/_Goobstation/NTR/Catalog/ntr_catalog.yml +++ b/Resources/Prototypes/_Goobstation/NTR/Catalog/ntr_catalog.yml @@ -8,7 +8,7 @@ sprite: Structures/Storage/Crates/command.rsi state: icon cost: - NTLoyaltyPoint: 5 + NTLoyaltyPoint: 15 categories: - NTRstation restockTime: 300 # if the station is fucked up in 5 minutes, thats unfortunate lol, 5min tho @@ -24,7 +24,7 @@ sprite: Structures/Storage/Crates/command.rsi state: icon cost: - NTLoyaltyPoint: 15 + NTLoyaltyPoint: 25 categories: - NTRstation restockTime: 1200 # give them revs some time man @@ -90,7 +90,7 @@ sprite: Structures/Storage/Crates/medicalcrate_secure.rsi state: icon cost: - NTLoyaltyPoint: 10 # woundmd ahhhh + NTLoyaltyPoint: 20 # woundmd ahhhh categories: - NTRstation restockTime: 300 # 5 min @@ -122,7 +122,7 @@ sprite: Structures/Storage/Crates/engicrate_secure.rsi state: icon cost: - NTLoyaltyPoint: 3 + NTLoyaltyPoint: 5 categories: - NTRstation restockTime: 300 # 5 min @@ -130,89 +130,71 @@ restockAfterPurchase: 300 # personal - - type: listing - id: NTRExecutiveWaterCoolerGold - name: premium water (?) cooler - description: Made from the finest 24-karat hardened whiskey in the sector. Its shiny and golden, just like its insides. Comes with 500u of whiskey. Every fine executive has one of these in their room. - productEntity: SpawnPodWaterCoolerGold + id: NTRExecutiveInternCall + name: Call intern squad + description: Calls in a lead intern with special summoning coins, that are calling more interns. + productEntity: SpawnPodInterns icon: - sprite: _Goobstation/Structures/Storage/watercooler.rsi - state: watercooler-2 + sprite: _Goobstation/Objects/Tools/executive_briefcase.rsi + state: icon_alt cost: - NTLoyaltyPoint: 6 # 6 points for something like this is fine, just a meme item lol + NTLoyaltyPoint: 50 categories: - NTRpersonal - restockTime: 0 + restockTime: 600 # 10 mins conditions: - !type:ListingLimitedStockCondition - stock: 1 + stock: 1 # if ntr wants more intern, he should buy one-at-the-time -# - type: listing -# id: NTRExecutiveInternCall -# name: Call intern squad -# description: Calls in a lead intern with special summoning coins, that are calling more interns. -# productEntity: SpawnPodInterns -# icon: -# sprite: _Goobstation/Objects/Tools/executive_briefcase.rsi -# state: icon_alt -# cost: -# NTLoyaltyPoint: 50 -# categories: -# - NTRpersonal -# restockTime: 600 # 10 mins -# conditions: -# - !type:ListingLimitedStockCondition -# stock: 1 # if ntr wants more intern, he should buy one-at-the-time - -#- type: listing -# id: NTRExecutiveDagger -# name: Phoron dagger -# description: A fancy and expensive phoron dagger, used by elite CentComm fighters and important people. -# productEntity: SpawnPodDagger -# icon: -# sprite: _Goobstation/Objects/Weapons/Melee/e_daggerntr.rsi -# state: icon -# cost: -# NTLoyaltyPoint: 20 # its a bit better than a cc pen, but still. -# categories: -# - NTRpersonal -# restockTime: 900 # 15 min -# resetRestockOnPurchase: true -# restockAfterPurchase: 1200 # 20 min +- type: listing + id: NTRExecutiveDagger + name: Phoron dagger + description: A fancy and expensive phoron dagger, used by elite CentComm fighters and important people. + productEntity: SpawnPodDagger + icon: + sprite: _Goobstation/Objects/Weapons/Melee/e_daggerntr.rsi + state: icon + cost: + NTLoyaltyPoint: 20 # its a bit better than a cc pen, but still. + categories: + - NTRpersonal + restockTime: 900 # 15 min + resetRestockOnPurchase: true + restockAfterPurchase: 1200 # 20 min - type: listing id: NTRExecutiveSingleIntern name: single Intern Coin - description: Summons one basic intern. Interns are on your full command, order them to complete tasks instead of you doing it by yourself, or play cards with them. + description: Summons one basic intern. productEntity: SpawnPodCoin icon: sprite: Objects/Misc/coins.rsi state: coin_gold cost: - NTLoyaltyPoint: 10 + NTLoyaltyPoint: 15 categories: - NTRpersonal restockTime: 300 resetRestockOnPurchase: true - restockAfterPurchase: 900 # 15 mins + restockAfterPurchase: 600 # 10 mins -#- type: listing -# id: NTRExecutiveBSDCall -# name: ntr-executive-bsd-name -# description: ntr-executive-bsd-desc -# productEntity: SpawnPodBsd -# icon: -# sprite: _Goobstation/Objects/Tools/executive_briefcase.rsi -# state: icon_alt -# cost: -# NTLoyaltyPoint: 40 -# categories: -# - NTRpersonal -# restockTime: 1800 # 3o min -# conditions: -# - !type:ListingLimitedStockCondition -# stock: 1 # we dont want NTR to buy 3 BSDs in one shift so +- type: listing + id: NTRExecutiveBSDCall + name: ntr-executive-bsd-name + description: ntr-executive-bsd-desc + productEntity: SpawnPodBsd + icon: + sprite: _Goobstation/Objects/Tools/executive_briefcase.rsi + state: icon_alt + cost: + NTLoyaltyPoint: 50 + categories: + - NTRpersonal + restockTime: 1800 # 3o min + conditions: + - !type:ListingLimitedStockCondition + stock: 1 # we dont want NTR to buy 3 BSDs in one shift so #- type: listing # id: NTRExecutiveHardsuit @@ -271,7 +253,7 @@ sprite: _Goobstation/Clothing/Eyes/Glasses/centcommglasses.rsi state: icon cost: - NTLoyaltyPoint: 5 + NTLoyaltyPoint: 2 categories: - NTRpersonal restockTime: 120 @@ -294,21 +276,21 @@ resetRestockOnPurchase: true restockAfterPurchase: 600 # 10 mins cuz ntr shouldn't spam these if he wanted to give it to the interns or some shit -# - type: listing -# id: NTRExecutiveDeckard -# name: ntr-executive-1984-name # we dont talk about this locale string name anymore -# description: ntr-executive-1984-desc -# productEntity: SpawnPodDeckard -# icon: -# sprite: Objects/Weapons/Guns/Revolvers/deckard.rsi -# state: base -# cost: -# NTLoyaltyPoint: 15 -# categories: -# - NTRpersonal -# restockTime: 600 # 10 mins -# resetRestockOnPurchase: true -# restockAfterPurchase: 1800 #30mins, the reason above. +- type: listing + id: NTRExecutiveDeckard + name: ntr-executive-1984-name # we dont talk about this locale string name anymore + description: ntr-executive-1984-desc + productEntity: SpawnPodDeckard + icon: + sprite: Objects/Weapons/Guns/Revolvers/deckard.rsi + state: base + cost: + NTLoyaltyPoint: 15 + categories: + - NTRpersonal + restockTime: 600 # 10 mins + resetRestockOnPurchase: true + restockAfterPurchase: 1800 #30mins, the reason above. - type: listing id: NTRExecutiveCombatKit diff --git a/Resources/Prototypes/_Goobstation/NTR/Catalog/pods.yml b/Resources/Prototypes/_Goobstation/NTR/Catalog/pods.yml index 4d810a199f2..b866486b52a 100644 --- a/Resources/Prototypes/_Goobstation/NTR/Catalog/pods.yml +++ b/Resources/Prototypes/_Goobstation/NTR/Catalog/pods.yml @@ -276,12 +276,3 @@ components: - type: SpawnOnDespawn prototype: ComputerNTRTasksFlatpack - -- type: entity - id: SpawnPodWaterCoolerGold - categories: [ HideSpawnMenu ] - name: SpawnPodWaterCoolerGold - parent: SpawnSupplyEmpty - components: - - type: SpawnOnDespawn - prototype: WaterCoolerGold diff --git a/Resources/Prototypes/_Goobstation/NTR/docs.yml b/Resources/Prototypes/_Goobstation/NTR/docs.yml index 4cb1e3dea65..a587eb3eb47 100644 --- a/Resources/Prototypes/_Goobstation/NTR/docs.yml +++ b/Resources/Prototypes/_Goobstation/NTR/docs.yml @@ -96,8 +96,6 @@ components: - type: RandomDocument documentType: ServiceDocument # Default fallback - - type: FaxableObject - copyable: false # womp womp no free points # Regular Documents - type: entity diff --git a/Resources/Prototypes/_Goobstation/Objects/Devices/translator_implants.yml b/Resources/Prototypes/_Goobstation/Objects/Devices/translator_implants.yml index 67b098dbc44..8ba86df92fe 100644 --- a/Resources/Prototypes/_Goobstation/Objects/Devices/translator_implants.yml +++ b/Resources/Prototypes/_Goobstation/Objects/Devices/translator_implants.yml @@ -78,10 +78,11 @@ - SpaceItalian - Cheval + - type: entity parent: BaseSubdermalImplant id: ChevalTranslatorImplant - name: cheval translator implant + name: Cheval translator implant description: An implant giving the ability to understand and speak Cheval. categories: [ HideSpawnMenu ] components: diff --git a/Resources/Prototypes/_Goobstation/Objects/Misc/translator_implanters.yml b/Resources/Prototypes/_Goobstation/Objects/Misc/translator_implanters.yml index 5c546bca905..311e37caa1a 100644 --- a/Resources/Prototypes/_Goobstation/Objects/Misc/translator_implanters.yml +++ b/Resources/Prototypes/_Goobstation/Objects/Misc/translator_implanters.yml @@ -9,7 +9,7 @@ - type: entity id: LibrarianTranslatorImplanter parent: [ BaseTranslatorImplanter ] - suffix: Librarian + name: librarian translator implant components: - type: Implanter implant: LibrarianTranslatorImplant @@ -17,7 +17,7 @@ - type: entity id: ChevalTranslatorImplanter parent: [ BaseTranslatorImplanter ] - suffix: Cheval + name: Cheval translator implant components: - type: Implanter implant: ChevalTranslatorImplant @@ -26,7 +26,7 @@ - type: entity id: BasicSpaceItalianTranslatorImplanter parent: BaseTranslatorImplanter - suffix: Basic Space Italian + name: basic space italian translator implanter components: - type: Implanter implant: BasicSpaceItalianTranslatorImplant @@ -35,7 +35,7 @@ - type: entity id: AdvancedSpaceItalianTranslatorImplanter parent: BaseTranslatorImplanter - suffix: Advanced Space Italian + name: advanced space italian translator implanter components: - type: Implanter implant: SpaceItalianTranslatorImplant diff --git a/Resources/Prototypes/_Goobstation/Recipes/Construction/Graphs/misc/revflash.yml b/Resources/Prototypes/_Goobstation/Recipes/Construction/Graphs/misc/revflash.yml new file mode 100644 index 00000000000..18bada2c7c9 --- /dev/null +++ b/Resources/Prototypes/_Goobstation/Recipes/Construction/Graphs/misc/revflash.yml @@ -0,0 +1,16 @@ +- type: constructionGraph + id: RevFlash + start: start + graph: + - node: start + edges: + - to: revFlash + steps: + - tag: Flash + name: construction-graph-component-flash + icon: + sprite: _Goobstation/Objects/Weapons/Melee/revflash.rsi + state: flash + doAfter: 5 + - node: revFlash + entity: RevFlash diff --git a/Resources/Prototypes/_Goobstation/Recipes/Construction/revflash.yml b/Resources/Prototypes/_Goobstation/Recipes/Construction/revflash.yml new file mode 100644 index 00000000000..ad42d9ffc5c --- /dev/null +++ b/Resources/Prototypes/_Goobstation/Recipes/Construction/revflash.yml @@ -0,0 +1,11 @@ +- type: construction + id: RevFlash + graph: RevFlash + startNode: start + targetNode: revFlash + category: construction-category-weapons + objectType: Item + entityWhitelist: + components: + - HeadRevolutionary + - Revolutionary diff --git a/Resources/Prototypes/_Goobstation/Recipes/Crafting/Graphs/goidabot.yml b/Resources/Prototypes/_Goobstation/Recipes/Crafting/Graphs/goidabot.yml index 1f6ea8d4bf5..4fc76f7aba4 100644 --- a/Resources/Prototypes/_Goobstation/Recipes/Crafting/Graphs/goidabot.yml +++ b/Resources/Prototypes/_Goobstation/Recipes/Crafting/Graphs/goidabot.yml @@ -1,39 +1,39 @@ -#- type: constructionGraph # Omu, disable 'GoidaBot' -# id: GoidaBot -# start: start -# graph: -# - node: start -# edges: -# - to: bot -# steps: -# - tag: Ushanka -# icon: -# sprite: Clothing/Head/Hats/ushanka.rsi -# state: icon -# name: construction-graph-tag-ushanka -# - tag: BaseballBat -# icon: -# sprite: Objects/Weapons/Melee/baseball_bat.rsi -# state: icon -# name: construction-graph-tag-baseball-bat -# doAfter: 2 -# - component: Heart -# icon: -# sprite: Mobs/Species/Human/organs.rsi -# state: heart-on -# name: construction-graph-tag-heart -# doAfter: 2 -# - tag: ProximitySensor -# icon: -# sprite: Objects/Misc/proximity_sensor.rsi -# state: icon -# name: construction-graph-tag-proximity-sensor -# doAfter: 2 -# - tag: BorgArm -# icon: -# sprite: Mobs/Silicon/drone.rsi -# state: l_hand -# name: construction-graph-tag-borg-arm -# doAfter: 2 -# - node: bot -# entity: MobGoidaBot +- type: constructionGraph + id: GoidaBot + start: start + graph: + - node: start + edges: + - to: bot + steps: + - tag: Ushanka + icon: + sprite: Clothing/Head/Hats/ushanka.rsi + state: icon + name: construction-graph-tag-ushanka + - tag: BaseballBat + icon: + sprite: Objects/Weapons/Melee/baseball_bat.rsi + state: icon + name: construction-graph-tag-baseball-bat + doAfter: 2 + - component: Heart + icon: + sprite: Mobs/Species/Human/organs.rsi + state: heart-on + name: construction-graph-tag-heart + doAfter: 2 + - tag: ProximitySensor + icon: + sprite: Objects/Misc/proximity_sensor.rsi + state: icon + name: construction-graph-tag-proximity-sensor + doAfter: 2 + - tag: BorgArm + icon: + sprite: Mobs/Silicon/drone.rsi + state: l_hand + name: construction-graph-tag-borg-arm + doAfter: 2 + - node: bot + entity: MobGoidaBot diff --git a/Resources/Prototypes/_Goobstation/Recipes/Crafting/goidabot.yml b/Resources/Prototypes/_Goobstation/Recipes/Crafting/goidabot.yml index db9b8c96540..a920a3382ac 100644 --- a/Resources/Prototypes/_Goobstation/Recipes/Crafting/goidabot.yml +++ b/Resources/Prototypes/_Goobstation/Recipes/Crafting/goidabot.yml @@ -1,7 +1,7 @@ -#- type: construction # Omu, disable 'GoidaBot' -# id: GoidaBot -# graph: GoidaBot -# startNode: start -# targetNode: bot -# category: construction-category-utilities -# objectType: Item +- type: construction + id: GoidaBot + graph: GoidaBot + startNode: start + targetNode: bot + category: construction-category-utilities + objectType: Item diff --git a/Resources/Prototypes/_Goobstation/Recipes/Lathes/language.yml b/Resources/Prototypes/_Goobstation/Recipes/Lathes/language.yml index 4115655e0ed..01ee805122a 100644 --- a/Resources/Prototypes/_Goobstation/Recipes/Lathes/language.yml +++ b/Resources/Prototypes/_Goobstation/Recipes/Lathes/language.yml @@ -1,5 +1,10 @@ - type: latheRecipe - parent: BaseTranslatorImplanter id: ChevalTranslatorImplanter - subname: lathe-recipe-ChevalTranslatorImplanter-subname result: ChevalTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 diff --git a/Resources/Prototypes/_Goobstation/SlaughterDemon/Entities/Items/slaughter_demon.yml b/Resources/Prototypes/_Goobstation/SlaughterDemon/Entities/Items/slaughter_demon.yml index 0b48d0b7888..bda83333a38 100644 --- a/Resources/Prototypes/_Goobstation/SlaughterDemon/Entities/Items/slaughter_demon.yml +++ b/Resources/Prototypes/_Goobstation/SlaughterDemon/Entities/Items/slaughter_demon.yml @@ -1,87 +1,28 @@ - type: entity - name: vial of tickles - id: BottleOfTickles + name: vial of blood + id: BottleOfBlood parent: [BaseItem, BaseMagicalContraband] - description: A magically infused bottle of clown love, distilled from countless hugging attacks. Used in funny rituals to attract adorable creatures. + description: A magically infused bottle of blood, distilled from countless murder victims. Used in unholy rituals to attract horrifying creatures. components: - type: Sprite sprite: _Goobstation/Wizard/Objects/vials.rsi - state: vialtickles - - type: SolutionContainerManager - solutions: - liquid: - maxVol: 15 - reagents: - - ReagentId: Laughter - Quantity: 15 - - type: ExaminableSolution - solution: liquid + state: vial - type: Item size: Tiny - - type: DamageOnLand - damage: - types: - Blunt: 5 - - type: Damageable - damageContainer: Inorganic - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 5 - behaviors: - - !type:PlaySoundBehavior - sound: - collection: GlassBreak - params: - volume: -4 - - !type:SpillBehavior - solution: liquid - - !type:SpawnEntitiesBehavior - spawn: - ShardGlass: - min: 0 - max: 1 - - !type:AddGameRuleBehavior - rule: LaughterDemonSummon - - !type:DoActsBehavior - acts: [ "Destruction" ] + - type: AddGameRuleOnUse + rule: SlaughterDemonSummon + - type: VialSummon - type: entity - name: vial of blood - id: BottleOfBlood - parent: BottleOfTickles - description: A magically infused bottle of blood, distilled from countless murder victims. Used in unholy rituals to attract horrifying creatures. + name: vial of tickles + id: BottleOfTickles + parent: [BaseItem, BaseMagicalContraband] + description: A magically infused bottle of clown love, distilled from countless hugging attacks. Used in funny rituals to attract adorable creatures. components: - type: Sprite - state: vial - - type: SolutionContainerManager - solutions: - liquid: - maxVol: 15 - reagents: - - ReagentId: Blood - Quantity: 15 - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 5 - behaviors: - - !type:PlaySoundBehavior - sound: - collection: GlassBreak - params: - volume: -4 - - !type:SpillBehavior - solution: liquid - - !type:SpawnEntitiesBehavior - spawn: - ShardGlass: - min: 0 - max: 1 - - !type:AddGameRuleBehavior - rule: SlaughterDemonSummon - - !type:DoActsBehavior - acts: [ "Destruction" ] - - type: VialSummon + sprite: _Goobstation/Wizard/Objects/vials.rsi + state: vialtickles + - type: Item + size: Tiny + - type: AddGameRuleOnUse + rule: LaughterDemonSummon diff --git a/Resources/Prototypes/_Goobstation/SlaughterDemon/Mobs/slaughter_demon.yml b/Resources/Prototypes/_Goobstation/SlaughterDemon/Mobs/slaughter_demon.yml index b6cd17be708..6fbaa42f9f5 100644 --- a/Resources/Prototypes/_Goobstation/SlaughterDemon/Mobs/slaughter_demon.yml +++ b/Resources/Prototypes/_Goobstation/SlaughterDemon/Mobs/slaughter_demon.yml @@ -171,10 +171,6 @@ - type: SlowOnDamage speedModifierThresholds: 200: 1 - - type: Bloodstream - bloodMaxVolume: 300 - bloodReagent: Sulfur - bleedReductionAmount: 5 # laughter demon - type: entity diff --git a/Resources/Prototypes/_Goobstation/Species/tajaran.yml b/Resources/Prototypes/_Goobstation/Species/tajaran.yml index 2a235d5b929..e6c3417c445 100644 --- a/Resources/Prototypes/_Goobstation/Species/tajaran.yml +++ b/Resources/Prototypes/_Goobstation/Species/tajaran.yml @@ -23,11 +23,11 @@ femaleFirstNames: NamesTajaranFirst lastNames: NamesTajaranLast # begin Goobstation: port EE height/width sliders - minHeight: 0.75 - defaultHeight: 0.80 + minHeight: 0.85 + defaultHeight: 0.90 maxHeight: 1.15 - minWidth: 0.80 - defaultWidth: 0.80 + minWidth: 0.85 + defaultWidth: 0.90 maxWidth: 1.10 # end Goobstation: port EE height/width sliders diff --git a/Resources/Prototypes/_Goobstation/Traits/disabilities.yml b/Resources/Prototypes/_Goobstation/Traits/disabilities.yml index 0fe0d756daa..63fa48c6e77 100644 --- a/Resources/Prototypes/_Goobstation/Traits/disabilities.yml +++ b/Resources/Prototypes/_Goobstation/Traits/disabilities.yml @@ -11,8 +11,7 @@ id: WheelchairBound name: trait-wheelchair-bound-name description: trait-wheelchair-bound-desc - # category: Disabilities - category: PhysicalTraits # Omustation - Remake EE Traits system - global trait points cost + category: Disabilities blacklist: components: - BorgChassis @@ -21,52 +20,43 @@ prototype: VehicleWheelchair - type: LegsStartParalyzed - type: LegsParalyzed - globalCost: -10 # Omustation - Remake EE Traits system - global trait points cost - type: trait id: ByondYourPrime name: trait-tile-movement-name description: trait-tile-movement-desc - # category: Disabilities - category: PhysicalTraits # Omustation - Remake EE Traits system - global trait points cost + category: Disabilities components: - type: TileMovement - globalCost: -2 # Omustation - Remake EE Traits system - global trait points cost - type: trait id: MovementImpaired name: trait-movement-impaired-name description: trait-movement-impaired-desc traitGear: Cane - # category: Disabilities - category: PhysicalTraits # Omustation - Remake EE Traits system - global trait points cost + category: Disabilities blacklist: components: - BorgChassis components: - type: MovementImpaired impairedSpeedMultiplier: 0.6 - globalCost: -4 # Omustation - Remake EE Traits system - global trait points cost - type: trait id: SocialAnxietyTrait name: trait-social-anxiety-name description: trait-social-anxiety-disc - #category: Disabilities #omu commentout - category: PhysicalTraits #omu + category: Disabilities components: - type: SocialAnxiety - globalCost: -4 #omu i suppose. ive not tedted. If this comment is still here assume i havent tested. - type: trait id: DeafTrait name: trait-deaf-name description: trait-deaf-disc - #category: Disabilities #omu commentout - category: PhysicalTraits #omu + category: Disabilities blacklist: components: - BorgChassis components: - type: Deaf - globalCost: -8 #it might actually be just as or more crippling that not walking in this game - omu diff --git a/Resources/Prototypes/_Goobstation/Traits/speech.yml b/Resources/Prototypes/_Goobstation/Traits/speech.yml index 6ed4798d57b..cbed780ffca 100644 --- a/Resources/Prototypes/_Goobstation/Traits/speech.yml +++ b/Resources/Prototypes/_Goobstation/Traits/speech.yml @@ -21,7 +21,6 @@ components: - type: ReplacementAccent accent: dementia - countsTowardsMaxTraits: false # Omustation - Don't count accents towards max traits - type: trait id: ScottishAccent @@ -32,7 +31,6 @@ components: - type: ReplacementAccent accent: scottish - countsTowardsMaxTraits: false # Omustation - Don't count accents towards max traits - type: trait id: Bogan @@ -43,7 +41,6 @@ components: - type: ReplacementAccent accent: bogan - countsTowardsMaxTraits: false # Omustation - Don't count accents towards max traits - type: trait id: MedievalAccent @@ -53,7 +50,6 @@ cost: 1 components: - type: MedievalAccent - countsTowardsMaxTraits: false # Omustation - Don't count accents towards max traits - type: trait id: NewYorkAccent @@ -64,7 +60,6 @@ components: - type: ReplacementAccent accent: newyork - countsTowardsMaxTraits: false # Omustation - Don't count accents towards max traits - type: trait id: british @@ -75,4 +70,3 @@ components: - type: ReplacementAccent accent: british - countsTowardsMaxTraits: false # Omustation - Don't count accents towards max traits \ No newline at end of file diff --git a/Resources/Prototypes/_Goobstation/Voice/speech_emote_sounds.yml b/Resources/Prototypes/_Goobstation/Voice/speech_emote_sounds.yml index 859270c636a..ee7ccdc8709 100644 --- a/Resources/Prototypes/_Goobstation/Voice/speech_emote_sounds.yml +++ b/Resources/Prototypes/_Goobstation/Voice/speech_emote_sounds.yml @@ -54,15 +54,3 @@ sounds: Laugh: path: /Audio/_Goobstation/FloorGoblin/laugh.ogg - -- type: emoteSounds - id: HellGoose - params: - variation: 0.125 - sound: - collection: GooseSounds - params: - variation: 0.125 - sounds: - Laugh: - path: /Audio/_Goobstation/Goose/goose_laugh.ogg diff --git a/Resources/Prototypes/_Goobstation/Voice/speech_sounds.yml b/Resources/Prototypes/_Goobstation/Voice/speech_sounds.yml index 763cc7dd281..6cf027f5d4f 100644 --- a/Resources/Prototypes/_Goobstation/Voice/speech_sounds.yml +++ b/Resources/Prototypes/_Goobstation/Voice/speech_sounds.yml @@ -16,12 +16,3 @@ collection: DuendeSounds exclaimSound: collection: DuendeSounds - -- type: speechSounds - id: HellGoose - saySound: - collection: GooseSounds - askSound: - collection: GooseSounds - exclaimSound: - collection: GooseSounds diff --git a/Resources/Prototypes/_Goobstation/Voice/speech_verbs.yml b/Resources/Prototypes/_Goobstation/Voice/speech_verbs.yml index 6c24482de4a..9fb7cfa7a99 100644 --- a/Resources/Prototypes/_Goobstation/Voice/speech_verbs.yml +++ b/Resources/Prototypes/_Goobstation/Voice/speech_verbs.yml @@ -121,12 +121,3 @@ - chat-speech-verb-floor-goblin-1 - chat-speech-verb-floor-goblin-2 - chat-speech-verb-floor-goblin-3 - -- type: speechVerb - id: HellGoose - name: chat-speech-verb-name-hell-goose - speechVerbStrings: - - chat-speech-verb-hell-goose-1 - - chat-speech-verb-hell-goose-2 - - chat-speech-verb-hell-goose-3 - - chat-speech-verb-hell-goose-4 diff --git a/Resources/Prototypes/_Goobstation/Wizard/Random/polymorph.yml b/Resources/Prototypes/_Goobstation/Wizard/Random/polymorph.yml index 085a001d651..42e4f19861d 100644 --- a/Resources/Prototypes/_Goobstation/Wizard/Random/polymorph.yml +++ b/Resources/Prototypes/_Goobstation/Wizard/Random/polymorph.yml @@ -81,9 +81,6 @@ MobFelinidRandom: 1 # le funny MobTajaranRandom: 1 MobOniRandom: 1 - MobChitinidRandom: 1 - MobShadowkinRandom: 1 - MobShadowling: 0.01 - type: weightedRandomEntity id: WabbajackAnimal @@ -173,25 +170,12 @@ MobStickman: 1 MobCreature: 1 MobBingle: 1 - MobGhoulStalker: 0.33 - MobGhoulProphet: 0.33 - MobGhoulRustWalker: 0.33 - type: weightedRandomEntity id: WabbajackSpecial weights: MobBinglePrime: 1 -- type: weightedRandomEntity - id: WabbajackXeno - weights: - MobXenomorphQueen: 0.1 - MobXenomorphDrone: 2 - MobXenomorphSentinel: 0.8 - MobXenomorphHunter: 1 - MobXenomorphPraetorian: 0.5 - MobXenomorphMaid: 0.01 - - type: weightedRandom id: WabbajackGroups weights: @@ -201,5 +185,4 @@ WabbajackSlime: 1 WabbajackSpecies: 1 WabbajackAnimal: 1 - WabbajackXeno: 1 WabbajackSpecial: 0.05 # for high-impact transmutations, approximately 1/160 chance with 8 groups diff --git a/Resources/Prototypes/_Goobstation/Wizard/effects.yml b/Resources/Prototypes/_Goobstation/Wizard/effects.yml index f21b3886f8c..cb2d7142848 100644 --- a/Resources/Prototypes/_Goobstation/Wizard/effects.yml +++ b/Resources/Prototypes/_Goobstation/Wizard/effects.yml @@ -450,5 +450,3 @@ hard: false - type: HomingProjectile homingSpeed: null - - type: TileFrictionModifier - modifier: 0 diff --git a/Resources/Prototypes/_Goobstation/Wizard/spellbook_catalog.yml b/Resources/Prototypes/_Goobstation/Wizard/spellbook_catalog.yml index 0118abfd3dc..9ae82ada950 100644 --- a/Resources/Prototypes/_Goobstation/Wizard/spellbook_catalog.yml +++ b/Resources/Prototypes/_Goobstation/Wizard/spellbook_catalog.yml @@ -238,7 +238,7 @@ description: spellbook-barnyard-desc productAction: ActionBarnyardCurse cost: - WizCoin: 1 + WizCoin: 2 categories: - SpellbookOffensive conditions: @@ -844,11 +844,8 @@ - SpellbookSummons conditions: - !type:ListingLimitedStockCondition - stock: 3 + stock: 1 - !type:StoreWhitelistCondition - blacklist: - tags: - - GrimoireGhost disableRefund: true - type: listing @@ -865,11 +862,8 @@ - SpellbookSummons conditions: - !type:ListingLimitedStockCondition - stock: 3 + stock: 1 - !type:StoreWhitelistCondition - blacklist: - tags: - - GrimoireGhost disableRefund: true # Event diff --git a/Resources/Prototypes/_Goobstation/game_presets.yml b/Resources/Prototypes/_Goobstation/game_presets.yml index fc3afbe2d23..0e18bdff32e 100644 --- a/Resources/Prototypes/_Goobstation/game_presets.yml +++ b/Resources/Prototypes/_Goobstation/game_presets.yml @@ -253,7 +253,7 @@ name: abductors-title description: abductors-description showInVote: false - minPlayers: 100 # Omu, was 20, This gamerule is broken, setting to 100 minplayers so it never rolls + minPlayers: 20 rules: - DuoAbductorRoundstart - SubGamemodesRule diff --git a/Resources/Prototypes/_Goobstation/tags.yml b/Resources/Prototypes/_Goobstation/tags.yml index c66f24d0101..aace1d7d651 100644 --- a/Resources/Prototypes/_Goobstation/tags.yml +++ b/Resources/Prototypes/_Goobstation/tags.yml @@ -90,9 +90,6 @@ - type: Tag id: BreathMask -- type: Tag - id: Bulwark - - type: Tag id: CartridgeHighCaliber @@ -502,9 +499,6 @@ - type: Tag id: ShadowCloakAction -- type: Tag - id: SheetPlasma - - type: Tag id: ShowWizardIcons @@ -577,9 +571,6 @@ - type: Tag id: ToySword -- type: Tag - id: MakeshiftShield - - type: Tag id: MolotovConstruction @@ -610,6 +601,12 @@ - type: Tag id: WeaponDisabler +- type: Tag + id: Flash + +- type: Tag + id: RevFlash + - type: Tag id: WeaponPistolDualetta @@ -664,11 +661,5 @@ - type: Tag id: MidroundAntag -- type: Tag - id: FoodTinMRE - -- type: Tag - id: EmergencyWaterVaporTank - - type: Tag id: DisposableBattery diff --git a/Resources/Prototypes/_Lavaland/Procedural/lavaland_grid_ruins.yml b/Resources/Prototypes/_Lavaland/Procedural/lavaland_grid_ruins.yml index cad168d9082..25889222f7a 100644 --- a/Resources/Prototypes/_Lavaland/Procedural/lavaland_grid_ruins.yml +++ b/Resources/Prototypes/_Lavaland/Procedural/lavaland_grid_ruins.yml @@ -249,11 +249,3 @@ name: lavaland-ruin-temple path: /Maps/Lavaland/temple.yml priority: 30 - -#Goobstation ruins? Idk. - -- type: lavalandGridRuin - id: FlockLarge - name: lavaland-ruin-flock-large - path: /Maps/_Lavaland/Lavaland/flock_ruins_large.yml - priority: 31 diff --git a/Resources/Prototypes/_Lavaland/Procedural/ruin_pools.yml b/Resources/Prototypes/_Lavaland/Procedural/ruin_pools.yml index a12fac3720b..5dd6f3bf98d 100644 --- a/Resources/Prototypes/_Lavaland/Procedural/ruin_pools.yml +++ b/Resources/Prototypes/_Lavaland/Procedural/ruin_pools.yml @@ -59,7 +59,6 @@ Stash2: 2 Stash3: 2 Stash4: 2 - FlockLarge: 1 #WIZDEN RUINS (only peak ones, rest are trash) man CargoWreck: 1 Murder: 1 diff --git a/Resources/Prototypes/_Mono/Entities/Clothing/Neck/ponchos.yml b/Resources/Prototypes/_Mono/Entities/Clothing/Neck/ponchos.yml index ca860757054..c5108012d3a 100644 --- a/Resources/Prototypes/_Mono/Entities/Clothing/Neck/ponchos.yml +++ b/Resources/Prototypes/_Mono/Entities/Clothing/Neck/ponchos.yml @@ -18,6 +18,17 @@ heatingCoefficient: 1.1 coolingCoefficient: 0.5 +- type: entity + parent: ClothingNeckPonchoBlack + id: ClothingNeckPonchoBlackStripe + name: rogue cold weather poncho + description: The Cold Weather Poncho, advertised as a masterpiece of elemental protection. The truth is that it's itchy, stuffy, and a little baggy - but at least it's not cold. This one is black with red markings. + components: + - type: Sprite + sprite: _Mono/Clothing/Neck/Ponchos/blackstripe.rsi + - type: Clothing + sprite: _Mono/Clothing/Neck/Ponchos/blackstripe.rsi + - type: entity parent: ClothingNeckPonchoBlack id: ClothingNeckPonchoArctic diff --git a/Resources/Prototypes/_Mono/Entities/Structures/Machines/ftldrive.yml b/Resources/Prototypes/_Mono/Entities/Structures/Machines/ftldrive.yml index 77b942f8796..03f65682ac1 100644 --- a/Resources/Prototypes/_Mono/Entities/Structures/Machines/ftldrive.yml +++ b/Resources/Prototypes/_Mono/Entities/Structures/Machines/ftldrive.yml @@ -103,37 +103,6 @@ ftlToSameMap: true cooldownTime: 180 -- type: entity - id: MachineFTLDriveAutomated - parent: FTLDriveBase - name: CTLA-2048 bluespace drive - description: FTL Drive for Fixed Route Transport, has short cooldown at the cost of only working for Nanotrasen's preengineered transport routes - components: - - type: Sprite - sprite: _Mono/Structures/ShuttleComponents/drive.rsi - snapCardinals: true - layers: - - state: control - - state: control_on - map: ["enum.PowerDeviceVisualLayers.Powered"] - visible: false - shader: unshaded - - type: ApcPowerReceiver - powerLoad: 1000 - - type: PowerCharge - windowTitle: ftl-drive-window-title - idlePower: 20 - activePower: 1000 - - type: FTLDriveGenerator - priority: 1 - data: - ftlToSameMap: false - cooldownTime: 20 - startupTime: 5 - knockdownTime: 2 - travelTime: 15 - arrivalTime: 5 - # Debug drives - type: entity id: MachineFTLDriveDebug diff --git a/Resources/Prototypes/_White/Actions/xenomorph.yml b/Resources/Prototypes/_White/Actions/xenomorph.yml index de73d302ab5..de3ce50e3d1 100644 --- a/Resources/Prototypes/_White/Actions/xenomorph.yml +++ b/Resources/Prototypes/_White/Actions/xenomorph.yml @@ -72,7 +72,6 @@ - MidImpassable - LowImpassable - type: PlasmaCostAction - plasmaCost: 50 # Goobstation - type: entity id: ActionSpawnXenomorphEgg @@ -103,7 +102,7 @@ description: Secrete tough malleable resin. components: - type: Action - useDelay: 2 # Goobstation + useDelay: 1 itemIconStyle: BigAction icon: { sprite: _RMC14/Structures/Xenos/xeno_resin_wall.rsi, state: resin } # Goobstation new sprites - type: TargetAction @@ -111,13 +110,12 @@ - type: WorldTargetAction event: !type:PlaceTileEntityEvent entity: WallResin - length: 2 # Goobstation + length: 0.5 blockedCollisionMask: - FullTileMask blockedCollisionLayer: - WallLayer - type: PlasmaCostAction - plasmaCost: 50 # Goobstation # TODO: delete it # Goobstation - removed #- type: entity @@ -142,30 +140,6 @@ # - GlassLayer # - type: PlasmaCostAction -- type: entity # Goobstation - new action - id: ActionSpawnResinDoor - parent: BaseAction - name: Build a resin door (75) - description: Secrete tough malleable resin. - components: - - type: Action - useDelay: 2 - itemIconStyle: BigAction - icon: { sprite : _RMC14/Structures/Xenos/xeno_resin_door.rsi, state: resin } - - type: TargetAction - range: 2 - - type: WorldTargetAction - event: !type:PlaceTileEntityEvent - entity: ResinDoor - length: 2 - blockedCollisionMask: - - TableMask - blockedCollisionLayer: - - TableLayer - - BulletImpassable - - type: PlasmaCostAction - plasmaCost: 75 - # TODO: delete it - type: entity id: ActionSpawnResinNest @@ -182,14 +156,13 @@ - type: WorldTargetAction event: !type:PlaceTileEntityEvent entity: ResinNest - length: 2 # Goobstation + length: 0.5 blockedCollisionMask: - TableMask blockedCollisionLayer: - TableLayer - BulletImpassable - type: PlasmaCostAction - plasmaCost: 50 # Goobstation # Tail lash action - type: entity @@ -207,26 +180,23 @@ - type: WorldTargetAction event: !type:TailLashActionEvent -# Acid action - Goob Commented out until future fix -#- type: entity -# id: ActionAcid -# parent: BaseAction -# name: Corrosive acid (200) -# description: Drench an object in acid, destroying it over time. -# components: -# - type: Action -# useDelay: 11 -# itemIconStyle: BigAction # Goobstation -# icon: { sprite: _White/Interface/Actions/xenomorph.rsi, state: acid } # Goobstation -# - type: TargetAction -# interactOnMiss: false -# range: 2 -# targetingIndicator: true # Goobstation -# checkCanAccess: true # Goobstation -# - type: EntityTargetAction -# event: !type:AcidActionEvent -# - type: PlasmaCostAction -# plasmaCost: 200 + # Acid action +- type: entity + id: ActionAcid + parent: BaseAction + name: Corrosive acid (200) + description: Drench an object in acid, destroying it over time. + components: + - type: Action + useDelay: 11 + icon: { sprite : _White/Interface/Actions/xenomorph.rsi, state: acid } + - type: TargetAction + interactOnMiss: false + range: 2 + - type: EntityTargetAction + event: !type:AcidActionEvent + - type: PlasmaCostAction + plasmaCost: 200 # Jump action - type: entity @@ -266,22 +236,14 @@ - type: entity id: ActionXenomorphPromotion parent: BaseAction - name: Promote to Praetorian (500) # Goobstation - description: Directly promote a xenomorph to Praetorian status. # Goobstation + name: Create royal parasite (500) + description: Produce a royal parasite to grant one of your children the honor of being your Praetorian. components: - type: Action itemIconStyle: BigAction - useDelay: 5 # Goobstation + useDelay: 0 icon: { sprite : _White/Interface/Actions/xenomorph.rsi, state: promote } - - type: TargetAction # Goobstation start - checkCanAccess: true - range: 2 - - type: EntityTargetAction - canTargetSelf: false - whitelist: - requireAll: true - components: - - XenomorphComponent # Goobstation end + - type: InstantAction event: !type:PromotionActionEvent - type: PlasmaCostAction plasmaCost: 500 diff --git a/Resources/Prototypes/_White/Body/Organs/Animal/xenomorph.yml b/Resources/Prototypes/_White/Body/Organs/Animal/xenomorph.yml index 140e825c0b0..48e23acb926 100644 --- a/Resources/Prototypes/_White/Body/Organs/Animal/xenomorph.yml +++ b/Resources/Prototypes/_White/Body/Organs/Animal/xenomorph.yml @@ -106,10 +106,10 @@ Heat: 20 # Goobstation # - type: AcidGland - # - type: OrganActions - # actions: - # - ActionAcid - # commented until acid if fixed + - type: OrganActions + actions: + - ActionAcid + # - type: entity parent: BaseXenomorphOrgan diff --git a/Resources/Prototypes/_White/Entities/Mobs/Player/pets.yml b/Resources/Prototypes/_White/Entities/Mobs/Player/pets.yml index f67be3009b5..11cb6af1538 100644 --- a/Resources/Prototypes/_White/Entities/Mobs/Player/pets.yml +++ b/Resources/Prototypes/_White/Entities/Mobs/Player/pets.yml @@ -4,8 +4,6 @@ name: Lamarr description: A former nightmare candidate, now an exemplary pet. components: - - type: Sprite - sprite: _White/Mobs/Aliens/Xenomorphs/old_facehugger.rsi - type: FaceHugger knockdownTime: 0 infectionPrototype: null diff --git a/Resources/Prototypes/_White/Entities/Mobs/Xenomorphs/base.yml b/Resources/Prototypes/_White/Entities/Mobs/Xenomorphs/base.yml index ba44088ca6b..0fc87bac738 100644 --- a/Resources/Prototypes/_White/Entities/Mobs/Xenomorphs/base.yml +++ b/Resources/Prototypes/_White/Entities/Mobs/Xenomorphs/base.yml @@ -4,7 +4,7 @@ - MobDamageable - MobPolymorphable - MobCombat - - XenomorphBloodstream # Goob, uses custom bloodstream so we can disable bleeding for the time being. + - MobBloodstream - MobFlammable id: BaseMobXenomorph abstract: true @@ -92,7 +92,6 @@ bloodlossHealDamage: types: Bloodloss: -1 - bleedReductionAmount: 5 #goob - type: MeleeWeapon altDisarm: true angle: 0 diff --git a/Resources/Prototypes/_White/Entities/Mobs/Xenomorphs/facehugger.yml b/Resources/Prototypes/_White/Entities/Mobs/Xenomorphs/facehugger.yml index 58f4cf5b85e..0020e3f76af 100644 --- a/Resources/Prototypes/_White/Entities/Mobs/Xenomorphs/facehugger.yml +++ b/Resources/Prototypes/_White/Entities/Mobs/Xenomorphs/facehugger.yml @@ -17,8 +17,6 @@ - type: AddAccentClothing accent: ReplacementAccent replacement: mumble - - type: ThrowableFacehugger # Goobstation - minThrowForce: 5.0 # Goobstation - type: Damageable damageContainer: Biological damageModifierSet: Xenomorph @@ -65,16 +63,6 @@ damageOnInfect: groups: Genetic: 100 - sleepChem: Nocturine # ID of the Chemical we want to inject - Goobstation start - sleepChemAmount: 10 # Amount in units (Often no need to use more than 10u for most chems) - minChemicalThreshold: 8 # Minimum amount of the chemical required to prevent additional injections - initialInjectionDelay: 5 # Delay in seconds before the first injection occurs - attachAttemptDelay: 5 # Delay in seconds between attach attempts when blocked by a mask - maskBlockDamage: - damage: - Slash: 5 # Damage dealt when blocked by a breathable mask - maskBlockSound: - collection: MetalThud # Sound collection for when the facehugger hits the mask - Goobstation end - type: StepTrigger intersectRatio: 0.2 requiredTriggeredSpeed: 0.0 diff --git a/Resources/Prototypes/_White/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/_White/Entities/Objects/Fun/toys.yml index c2c55a75ef0..8fc6a20b8c0 100644 --- a/Resources/Prototypes/_White/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/_White/Entities/Objects/Fun/toys.yml @@ -9,12 +9,12 @@ components: - type: Sprite noRot: true - sprite: _White/Mobs/Aliens/Xenomorphs/old_facehugger.rsi + sprite: _White/Mobs/Aliens/Xenomorphs/facehugger.rsi layers: - map: ["enum.DamageStateVisualLayers.Base"] state: facehugger - type: Clothing - sprite: _White/Mobs/Aliens/Xenomorphs/old_facehugger.rsi + sprite: _White/Mobs/Aliens/Xenomorphs/facehugger.rsi slots: [mask] - type: IngestionBlocker - type: Blindfold diff --git a/Resources/Prototypes/_White/Entities/Structures/Doors/resin.yml b/Resources/Prototypes/_White/Entities/Structures/Doors/resin.yml index 9b082b508f0..6172f545044 100644 --- a/Resources/Prototypes/_White/Entities/Structures/Doors/resin.yml +++ b/Resources/Prototypes/_White/Entities/Structures/Doors/resin.yml @@ -90,4 +90,4 @@ closingSpriteState: closed_unlit - type: AccessReader access: [["Xenomorph"]] - breakOnAccessBreaker: false # Goobstation + diff --git a/Resources/Prototypes/_White/Entities/Structures/Storage/glass_box.yml b/Resources/Prototypes/_White/Entities/Structures/Storage/glass_box.yml index f83165f8753..6b7f1b29f8f 100644 --- a/Resources/Prototypes/_White/Entities/Structures/Storage/glass_box.yml +++ b/Resources/Prototypes/_White/Entities/Structures/Storage/glass_box.yml @@ -7,7 +7,7 @@ sprite: Structures/Storage/glassbox.rsi layers: - state: base - - sprite: _White/Mobs/Aliens/Xenomorphs/old_facehugger.rsi + - sprite: _White/Mobs/Aliens/Xenomorphs/facehugger.rsi state: facehugger map: ["enum.ItemCabinetVisuals.Layer"] visible: true diff --git a/Resources/Prototypes/_White/GameRules/events.yml b/Resources/Prototypes/_White/GameRules/events.yml index 5a1c32c7a7d..8b408df2922 100644 --- a/Resources/Prototypes/_White/GameRules/events.yml +++ b/Resources/Prototypes/_White/GameRules/events.yml @@ -3,17 +3,16 @@ id: XenomorphsInfestation components: - type: StationEvent - weight: 3 # Goobstation - was 7.5 + weight: 1 duration: null - minimumPlayers: 50 # Goobstation - was 20 - earliestStart: 35 - #reoccurrenceDelay: 50 # Goobstation - no longer needed - maxOccurrences: 1 # Goobstation + minimumPlayers: 50 + earliestStart: 60 chaos: Hostile: 400 Medical: 400 Death: 400 eventType: HostilesSpawn + maxOccurrences: 1 - type: GameRule chaosScore: 400 - type: VentSpawnRule diff --git a/Resources/Prototypes/borg_types.yml b/Resources/Prototypes/borg_types.yml index e97de91ca1c..21d33f1f4b0 100644 --- a/Resources/Prototypes/borg_types.yml +++ b/Resources/Prototypes/borg_types.yml @@ -119,7 +119,7 @@ addComponents: # Goobstation - type: NoWieldNeeded - type: SlavedBorg # Goobstation: Special AI labeling for salv borgs. - law: SalvageObeyAI + law: ObeyAI lawset: Salvage # DeltaV: Custom lawset diff --git a/Resources/Prototypes/name_identifier_groups.yml b/Resources/Prototypes/name_identifier_groups.yml index cb08de16dc1..59e5e2143e6 100644 --- a/Resources/Prototypes/name_identifier_groups.yml +++ b/Resources/Prototypes/name_identifier_groups.yml @@ -37,12 +37,6 @@ minValue: 1000 maxValue: 9999 -- type: nameIdentifierGroup - id: Xenoborg - format: name-identifier-format-xenoborg - minValue: 1000 - maxValue: 9999 - - type: nameIdentifierGroup id: StationAi format: name-identifier-format-station-ai diff --git a/Resources/ServerInfo/Guidebook/Antagonist/Shadowlings.xml b/Resources/ServerInfo/Guidebook/Antagonist/Shadowlings.xml index 752ef6cd4bc..bb8ad81f476 100644 --- a/Resources/ServerInfo/Guidebook/Antagonist/Shadowlings.xml +++ b/Resources/ServerInfo/Guidebook/Antagonist/Shadowlings.xml @@ -7,14 +7,14 @@ These enigmatic aliens have baffled even the most advanced research divisions. Shadowlings are light-sensitive xenoform alien creatures that come from space. - Primarily [bold]defensive in nature[/bold], they possess the ability to [bold]enthrall[/bold] crew members, taking full control of their minds and loyalty. + Primarily defensive in nature, they possess the ability to [bold]enthrall[/bold] crew members, taking full control of their minds and loyalty. Shadowlings starts off disguised as a normal crew member. After they awake, they must 'hatch' to unlock their powers. When hatched, shadowlings will resemble humans with black skin, small horns, red eyes, and claws. - Shadowlings are clumsy with guns, and cannot wear clothes of any kind. Despite that, they can still equip headsets and wear backpacks. + Shadowlings can not shoot guns, or wear clothes of any kind. Despite that, they can still equip headsets. As a side-note, Shadowlings are not obliged to work together. While cooperation may help, going solo is a valid play-style. @@ -29,11 +29,14 @@ You are vulnerable to light and will take damage while exposed. However, [bold]you heal in the shadows[/bold], so use darkness to your advantage. + Initially, you start with +50% resistance from light, but the more crew you enthrall, the less the resistance becomes. + It can go up to -50%! That's a lot of damage you'll be taking... + Choose your Thralls wisely. ## I'm a thrall, what is my purpose? - You're similar to a revolutionary, but with time and obedience, you can become something far more powerful. + You're similar to a revolutionary— but with time and obedience, you can become something far more powerful. As a thrall, your main purpose is to listen to your shadowling, the one that converted you. If your shadowling demands that you suicide, you must suicide. It doesn't matter if you're a Wizard or a Nukie. @@ -53,7 +56,7 @@ - Never patrol maintenance alone. Stick to groups. - Security should stay armed and alert. - Nanotrasen has also issued the Station with a special device that essentially took several decades of researching this + Nanotrasen has also issued the Mantis with a special device that essentially took several decades of researching this strange alien species and its effects on living beings. The [bold]anti-mind control device[/bold] can remove any mind control from any person, and apply further resistance to the Thrall @@ -67,6 +70,7 @@ Additional Countemeasures: - Mindshield implants offer temporary protection, though Shadowlings will gain abilities to bypass them. + - Psionic insulation fully prevents mind control and is highly recommended. In case of a shadowling starting an ascension, all available crew should arm themselves and rush to destroy the ascension egg before the process completes. Succeed, and you live. Fail... and witness a god! @@ -88,7 +92,7 @@ ## What happens if a Shadowling ascends... If a shadowling ascends, there's still a chance to win by killing the shadowling. However, it has a good amount - of health and very strong abilities. + of health (around the same as a Space Dragon) and very strong abilities. Once an ascension completes, all shadowlings will ascend at a moment's notice and Thralls will be turned into Nightmares. @@ -119,10 +123,6 @@ - Black Recuperation decreases your light resistance per use, so be careful when you use it. - - As crew, you do not have to ash or gib a shadowling. They lose all thralls at death. - - - [bold]This is a stealth antagonist[/bold], do not try to fight people as a shadowling. Instead, play defensive and enthrall people. - [bold][color=#000000]Become the darkness.[/color] [color=#702963]Embrace the void.[/color] [color=#D2042D]Ascend.[/color][/bold] diff --git a/Resources/Textures/Clothing/Head/Hardsuits/rd.rsi/meta.json b/Resources/Textures/Clothing/Head/Hardsuits/rd.rsi/meta.json index 8c88699d600..9cf4dde18c5 100644 --- a/Resources/Textures/Clothing/Head/Hardsuits/rd.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Hardsuits/rd.rsi/meta.json @@ -36,14 +36,6 @@ { "name": "on-equipped-HELMET-dog", "directions": 4 - }, - { - "name": "off-equipped-HELMET-vulpkanin", - "directions": 4 - }, - { - "name": "on-equipped-HELMET-vulpkanin", - "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json b/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json index 744990ce9a5..733d339bbb5 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. paper_stamp-greytide by ubaser. paper_stamp-psychologist by clinux. syndicate_card by Aserovich, paper_stamp-signature by Mnemotechnician, Nanotrasen card by SolsticOfTheWinter. paper_stamp_wizard by brassicaprime69 (Discord), acquisition_form acquisition_form_words and acquisition_form_header by sowelipililimute (GitHub), paper_stamp-admin-assistant by noctyrnal (github), station-report-paper by johnjjohn (GitHub). paper_stamp-wizard is a recolored stamp-rd by brassicaprime69 (Discord)", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432. paper_stamp-syndicate by Veritius. paper_receipt, paper_receipt_horizontal by eoineoineoin. paper_stamp-greytide by ubaser. paper_stamp-psychologist by clinux. syndicate_card by Aserovich, paper_stamp-signature by Mnemotechnician, Nanotrasen card by SolsticOfTheWinter. paper_stamp_wizard by brassicaprime69 (Discord), acquisition_form acquisition_form_words and acquisition_form_header by sowelipililimute (GitHub), station-report-paper by johnjjohn (GitHub)", "size": { "x": 32, "y": 32 @@ -165,9 +165,6 @@ { "name": "paper_stamp-centcom" }, - { - "name": "paper_stamp-centcom-intern" - }, { "name": "paper_stamp-chaplain" }, @@ -237,14 +234,9 @@ { "name": "contract-written" }, - { - "name": "paper_stamp-admin-assistant" - }, { "name": "station-report-paper" - }, - { - "name": "paper_stamp-wizard" } + ] } diff --git a/Resources/Textures/Objects/Tanks/Jetpacks/black.rsi/meta.json b/Resources/Textures/Objects/Tanks/Jetpacks/black.rsi/meta.json index cbed877cecd..21aae85629a 100644 --- a/Resources/Textures/Objects/Tanks/Jetpacks/black.rsi/meta.json +++ b/Resources/Textures/Objects/Tanks/Jetpacks/black.rsi/meta.json @@ -62,32 +62,6 @@ { "name": "on-equipped-BACKPACK-dog", "directions": 4 - }, - { - "name": "equipped-SUITSTORAGE", - "directions": 4 - }, - { - "name": "on-equipped-SUITSTORAGE", - "directions": 4, - "delays": [ - [ - 0.2, - 0.2 - ], - [ - 0.2, - 0.2 - ], - [ - 0.2, - 0.2 - ], - [ - 0.2, - 0.2 - ] - ] - } - ] + } + ] } diff --git a/Resources/Textures/Objects/Tanks/Jetpacks/blue.rsi/meta.json b/Resources/Textures/Objects/Tanks/Jetpacks/blue.rsi/meta.json index ae4897bbc5f..21aae85629a 100644 --- a/Resources/Textures/Objects/Tanks/Jetpacks/blue.rsi/meta.json +++ b/Resources/Textures/Objects/Tanks/Jetpacks/blue.rsi/meta.json @@ -62,32 +62,6 @@ { "name": "on-equipped-BACKPACK-dog", "directions": 4 - }, - { - "name": "equipped-SUITSTORAGE", - "directions": 4 - }, - { - "name": "on-equipped-SUITSTORAGE", - "directions": 4, - "delays": [ - [ - 0.2, - 0.2 - ], - [ - 0.2, - 0.2 - ], - [ - 0.2, - 0.2 - ], - [ - 0.2, - 0.2 - ] - ] - } - ] -} \ No newline at end of file + } + ] +} diff --git a/Resources/Textures/Objects/Tanks/Jetpacks/security.rsi/meta.json b/Resources/Textures/Objects/Tanks/Jetpacks/security.rsi/meta.json index 9d174545cdc..21aae85629a 100644 --- a/Resources/Textures/Objects/Tanks/Jetpacks/security.rsi/meta.json +++ b/Resources/Textures/Objects/Tanks/Jetpacks/security.rsi/meta.json @@ -1,93 +1,67 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/1592a112e3d33eec4a0704b518a138d5a976f455. Dog states modified from base states by Sparlight (GitHub).", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon", - "directions": 1 + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/1592a112e3d33eec4a0704b518a138d5a976f455. Dog states modified from base states by Sparlight (GitHub).", + "size": { + "x": 32, + "y": 32 }, - { - "name": "icon-on", - "directions": 1, - "delays": [ - [ - 0.2, - 0.2 - ] - ] - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - }, - { - "name": "equipped-BACKPACK", - "directions": 4 - }, - { - "name": "on-equipped-BACKPACK", - "directions": 4, - "delays": [ - [ - 0.2, - 0.2 - ], - [ - 0.2, - 0.2 - ], - [ - 0.2, - 0.2 - ], - [ - 0.2, - 0.2 - ] - ] - }, - { - "name": "equipped-BACKPACK-dog", - "directions": 4 - }, - { - "name": "on-equipped-BACKPACK-dog", - "directions": 4 - }, - { - "name": "equipped-SUITSTORAGE", - "directions": 4 - }, - { - "name": "on-equipped-SUITSTORAGE", - "directions": 4, - "delays": [ - [ - 0.2, - 0.2 - ], - [ - 0.2, - 0.2 - ], - [ - 0.2, - 0.2 - ], - [ - 0.2, - 0.2 - ] - ] - } - ] -} \ No newline at end of file + "states": [ + { + "name": "icon", + "directions": 1 + }, + { + "name": "icon-on", + "directions": 1, + "delays": [ + [ + 0.2, + 0.2 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-BACKPACK", + "directions": 4 + }, + { + "name": "on-equipped-BACKPACK", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2 + ], + [ + 0.2, + 0.2 + ], + [ + 0.2, + 0.2 + ], + [ + 0.2, + 0.2 + ] + ] + }, + { + "name": "equipped-BACKPACK-dog", + "directions": 4 + }, + { + "name": "on-equipped-BACKPACK-dog", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Objects/Tiles/tile.rsi/meta.json b/Resources/Textures/Objects/Tiles/tile.rsi/meta.json index 5d45f0ff253..1622acf3b39 100644 --- a/Resources/Textures/Objects/Tiles/tile.rsi/meta.json +++ b/Resources/Textures/Objects/Tiles/tile.rsi/meta.json @@ -7,628 +7,609 @@ "y": 32 }, "states": [ - { - "name": "dark" - }, - { - "name": "dark-diagonal-mini" - }, - { - "name": "dark-diagonal" - }, - { - "name": "dark-herringbone" - }, - { - "name": "dark-mini" - }, - { - "name": "dark-mono" - }, - { - "name": "dark-pavement" - }, - { - "name": "dark-pavement-vertical" - }, - { - "name": "dark-offset" - }, - { - "name": "dirty" - }, - { - "name": "checker-light" - }, - { - "name": "checker-dark" - }, - { - "name": "concrete" - }, - { - "name": "concrete-mono" - }, - { - "name": "concrete-smooth" - }, - { - "name": "grayconcrete" - }, - { - "name": "grayconcrete-mono" - }, - { - "name": "grayconcrete-smooth" - }, - { - "name": "oldconcrete" - }, - { - "name": "oldconcrete-mono" - }, - { - "name": "oldconcrete-smooth" - }, - { - "name": "gcircuit" - }, - { - "name": "bar" - }, - { - "name": "blue" - }, - { - "name": "brass" - }, - { - "name": "brass-filled" - }, - { - "name": "reebe" - }, - { - "name": "lime" - }, - { - "name": "mining" - }, - { - "name": "mining-inhand-right", - "directions": 4 - }, - { - "name": "mining-inhand-left", - "directions": 4 - }, - { - "name": "miningdark" - }, - { - "name": "miningdark-inhand-right", - "directions": 4 - }, - { - "name": "miningdark-inhand-left", - "directions": 4 - }, - { - "name": "mininglight" - }, - { - "name": "mininglight-inhand-right", - "directions": 4 - }, - { - "name": "mininglight-inhand-left", - "directions": 4 - }, - { - "name": "clown" - }, - { - "name": "grass" - }, - { - "name": "grassjungle" - }, - { - "name": "kitchen" - }, - { - "name": "laundry" - }, - { - "name": "lino" - }, - { - "name": "meat" - }, - { - "name": "meat-inhand-right", - "directions": 4 - }, - { - "name": "meat-inhand-left", - "directions": 4 - }, - { - "name": "mime" - }, - { - "name": "bcircuit" - }, - { - "name": "rcircuit" - }, - { - "name": "carpet-black" - }, - { - "name": "carpet-blue" - }, - { - "name": "carpet-skyblue" - }, - { - "name": "carpet-green" - }, - { - "name": "carpet-orange" - }, - { - "name": "carpet-purple" - }, - { - "name": "carpet-red" - }, - { - "name": "carpet-pink" - }, - { - "name": "carpet-cyan" - }, - { - "name": "carpet-white" - }, - { - "name": "hydro" - }, - { - "name": "reinforced" - }, - { - "name": "rockvault" - }, - { - "name": "gold" - }, - { - "name": "showroom" - }, - { - "name": "snow" - }, - { - "name": "steel" - }, - { - "name": "steel-offset" - }, - { - "name": "steel-diagonal-mini" - }, - { - "name": "steel-diagonal" - }, - { - "name": "steel-herringbone" - }, - { - "name": "steel-mini" - }, - { - "name": "steel-mono" - }, - { - "name": "steel-pavement" - }, - { - "name": "steel-pavement-vertical" - }, - { - "name": "silver" - }, - { - "name": "techfloor" - }, - { - "name": "techfloordark" - }, - { - "name": "white" - }, - { - "name": "white-offset" - }, - { - "name": "white-diagonal-mini" - }, - { - "name": "white-diagonal" - }, - { - "name": "white-herringbone" - }, - { - "name": "white-mini" - }, - { - "name": "white-mono" - }, - { - "name": "white-pavement" - }, - { - "name": "white-pavement-vertical" - }, - { - "name": "monofloor" - }, - { - "name": "wood" - }, - { - "name": "arcadeblue" - }, - { - "name": "arcadeblue2" - }, - { - "name": "arcadered" - }, - { - "name": "eighties" - }, - { - "name": "shuttlewhite" - }, - { - "name": "shuttleblue" - }, - { - "name": "shuttleorange" - }, - { - "name": "shuttlepurple" - }, - { - "name": "shuttlered" - }, - { - "name": "shuttlegrey" - }, - { - "name": "shuttleblack" - }, - { - "name": "carpetclown" - }, - { - "name": "carpetoffice" - }, - { - "name": "boxing" - }, - { - "name": "gym" - }, - { - "name": "metaldiamond" - }, - { - "name": "steelmaintfloor" - }, - { - "name": "gratingmaintfloor" - }, - { - "name": "woodpatternfloor" - }, - { - "name": "astrograss" - }, - { - "name": "astroice" - }, - { - "name": "bcircuit-inhand-left", - "directions": 4 - }, - { - "name": "bcircuit-inhand-right", - "directions": 4 - }, - { - "name": "carpet-black-inhand-left", - "directions": 4 - }, - { - "name": "carpet-black-inhand-right", - "directions": 4 - }, - { - "name": "carpet-blue-inhand-left", - "directions": 4 - }, - { - "name": "carpet-blue-inhand-right", - "directions": 4 - }, - { - "name": "carpet-skyblue-inhand-left", - "directions": 4 - }, - { - "name": "carpet-skyblue-inhand-right", - "directions": 4 - }, - { - "name": "carpet-green-inhand-left", - "directions": 4 - }, - { - "name": "carpet-green-inhand-right", - "directions": 4 - }, - { - "name": "carpet-orange-inhand-left", - "directions": 4 - }, - { - "name": "carpet-orange-inhand-right", - "directions": 4 - }, - { - "name": "carpet-purple-inhand-left", - "directions": 4 - }, - { - "name": "carpet-purple-inhand-right", - "directions": 4 - }, - { - "name": "carpet-red-inhand-left", - "directions": 4 - }, - { - "name": "carpet-red-inhand-right", - "directions": 4 - }, - { - "name": "carpet-pink-inhand-left", - "directions": 4 - }, - { - "name": "carpet-pink-inhand-right", - "directions": 4 - }, - { - "name": "carpet-cyan-inhand-left", - "directions": 4 - }, - { - "name": "carpet-cyan-inhand-right", - "directions": 4 - }, - { - "name": "carpet-white-inhand-left", - "directions": 4 - }, - { - "name": "carpet-white-inhand-right", - "directions": 4 - }, - { - "name": "grass-inhand-left", - "directions": 4 - }, - { - "name": "grass-inhand-right", - "directions": 4 - }, - { - "name": "snow-inhand-left", - "directions": 4 - }, - { - "name": "snow-inhand-right", - "directions": 4 - }, - { - "name": "dirty-inhand-left", - "directions": 4 - }, - { - "name": "dirty-inhand-right", - "directions": 4 - }, - { - "name": "dark-inhand-right", - "directions": 4 - }, - { - "name": "dark-inhand-left", - "directions": 4 - }, - { - "name": "gcircuit-inhand-right", - "directions": 4 - }, - { - "name": "gcircuit-inhand-left", - "directions": 4 - }, - { - "name": "gold-inhand-right", - "directions": 4 - }, - { - "name": "gold-inhand-left", - "directions": 4 - }, - { - "name": "rcircuit-inhand-right", - "directions": 4 - }, - { - "name": "rcircuit-inhand-left", - "directions": 4 - }, - { - "name": "reinforced-inhand-right", - "directions": 4 - }, - { - "name": "reinforced-inhand-left", - "directions": 4 - }, - { - "name": "showroom-inhand-right", - "directions": 4 - }, - { - "name": "showroom-inhand-left", - "directions": 4 - }, - { - "name": "silver-inhand-right", - "directions": 4 - }, - { - "name": "silver-inhand-left", - "directions": 4 - }, - { - "name": "white-inhand-right", - "directions": 4 - }, - { - "name": "white-inhand-left", - "directions": 4 - }, - { - "name": "wood-inhand-right", - "directions": 4 - }, - { - "name": "wood-inhand-left", - "directions": 4 - }, - { - "name": "generic-inhand-right", - "directions": 4 - }, - { - "name": "generic-inhand-left", - "directions": 4 - }, - { - "name": "steel-inhand-right", - "directions": 4 - }, - { - "name": "steel-inhand-left", - "directions": 4 - }, - { - "name": "hydro-inhand-right", - "directions": 4 - }, - { - "name": "hydro-inhand-left", - "directions": 4 - }, - { - "name": "wood-large" - }, - { - "name": "asteroid" - }, - { - "name": "astro-asteroid" - }, - { - "name": "asteroid-inhand-right", - "directions": 4 - }, - { - "name": "asteroid-inhand-left", - "directions": 4 - }, - { - "name": "xenofloor" - }, - { - "name": "xeno-steel" - }, - { - "name": "xeno-steel-corner" - }, - { - "name": "xeno-techmaint" - }, - { - "name": "xenoborg-floor" - }, - { - "name": "dark-squiggly" - } - , - { - "name": "white-marble" - }, - { - "name": "white-marble-inhand-left", - "directions": 4 - }, - { - "name": "white-marble-inhand-right", - "directions": 4 - }, - { - "name": "dark-marble" - }, - { - "name": "dark-marble-inhand-left", - "directions": 4 - }, - { - "name": "dark-marble-inhand-right", - "directions": 4 - }, - { - "name": "plasmarble" - }, - { - "name": "plasmarble-inhand-left", - "directions": 4 - }, - { - "name": "plasmarble-inhand-right", - "directions": 4 - }, - { - "name": "uranium-marble" - }, - { - "name": "uranium-marble-inhand-left", - "directions": 4 - }, - { - "name": "uranium-marble-inhand-right", - "directions": 4 - } - ] -} \ No newline at end of file + { + "name": "dark" + }, + { + "name": "dark-diagonal-mini" + }, + { + "name": "dark-diagonal" + }, + { + "name": "dark-herringbone" + }, + { + "name": "dark-mini" + }, + { + "name": "dark-mono" + }, + { + "name": "dark-pavement" + }, + { + "name": "dark-pavement-vertical" + }, + { + "name": "dark-offset" + }, + { + "name": "dirty" + }, + { + "name": "checker-light" + }, + { + "name": "checker-dark" + }, + { + "name": "concrete" + }, + { + "name": "concrete-mono" + }, + { + "name": "concrete-smooth" + }, + { + "name": "grayconcrete" + }, + { + "name": "grayconcrete-mono" + }, + { + "name": "grayconcrete-smooth" + }, + { + "name": "oldconcrete" + }, + { + "name": "oldconcrete-mono" + }, + { + "name": "oldconcrete-smooth" + }, + { + "name": "gcircuit" + }, + { + "name": "bar" + }, + { + "name": "blue" + }, + { + "name": "brass" + }, + { + "name": "brass-filled" + }, + { + "name": "reebe" + }, + { + "name": "lime" + }, + { + "name": "mining" + }, + { + "name": "mining-inhand-right", + "directions": 4 + }, + { + "name": "mining-inhand-left", + "directions": 4 + }, + { + "name": "miningdark" + }, + { + "name": "miningdark-inhand-right", + "directions": 4 + }, + { + "name": "miningdark-inhand-left", + "directions": 4 + }, + { + "name": "mininglight" + }, + { + "name": "mininglight-inhand-right", + "directions": 4 + }, + { + "name": "mininglight-inhand-left", + "directions": 4 + }, + { + "name": "clown" + }, + { + "name": "grass" + }, + { + "name": "grassjungle" + }, + { + "name": "kitchen" + }, + { + "name": "laundry" + }, + { + "name": "lino" + }, + { + "name": "meat" + }, + { + "name": "meat-inhand-right", + "directions": 4 + }, + { + "name": "meat-inhand-left", + "directions": 4 + }, + { + "name": "mime" + }, + { + "name": "bcircuit" + }, + { + "name": "rcircuit" + }, + { + "name": "carpet-black" + }, + { + "name": "carpet-blue" + }, + { + "name": "carpet-skyblue" + }, + { + "name": "carpet-green" + }, + { + "name": "carpet-orange" + }, + { + "name": "carpet-purple" + }, + { + "name": "carpet-red" + }, + { + "name": "carpet-pink" + }, + { + "name": "carpet-cyan" + }, + { + "name": "carpet-white" + }, + { + "name": "hydro" + }, + { + "name": "reinforced" + }, + { + "name": "rockvault" + }, + { + "name": "gold" + }, + { + "name": "showroom" + }, + { + "name": "snow" + }, + { + "name": "steel" + }, + { + "name": "steel-offset" + }, + { + "name": "steel-diagonal-mini" + }, + { + "name": "steel-diagonal" + }, + { + "name": "steel-herringbone" + }, + { + "name": "steel-mini" + }, + { + "name": "steel-mono" + }, + { + "name": "steel-pavement" + }, + { + "name": "steel-pavement-vertical" + }, + { + "name": "silver" + }, + { + "name": "techfloor" + }, + { + "name": "techfloordark" + }, + { + "name": "white" + }, + { + "name": "white-offset" + }, + { + "name": "white-diagonal-mini" + }, + { + "name": "white-diagonal" + }, + { + "name": "white-herringbone" + }, + { + "name": "white-mini" + }, + { + "name": "white-mono" + }, + { + "name": "white-pavement" + }, + { + "name": "white-pavement-vertical" + }, + { + "name": "monofloor" + }, + { + "name": "wood" + }, + { + "name": "arcadeblue" + }, + { + "name": "arcadeblue2" + }, + { + "name": "arcadered" + }, + { + "name": "eighties" + }, + { + "name": "shuttlewhite" + }, + { + "name": "shuttleblue" + }, + { + "name": "shuttleorange" + }, + { + "name": "shuttlepurple" + }, + { + "name": "shuttlered" + }, + { + "name": "shuttlegrey" + }, + { + "name": "shuttleblack" + }, + { + "name": "carpetclown" + }, + { + "name": "carpetoffice" + }, + { + "name": "boxing" + }, + { + "name": "gym" + }, + { + "name": "metaldiamond" + }, + { + "name": "steelmaintfloor" + }, + { + "name": "gratingmaintfloor" + }, + { + "name": "woodpatternfloor" + }, + { + "name": "astrograss" + }, + { + "name": "astroice" + }, + { + "name": "bcircuit-inhand-left", + "directions": 4 + }, + { + "name": "bcircuit-inhand-right", + "directions": 4 + }, + { + "name": "carpet-black-inhand-left", + "directions": 4 + }, + { + "name": "carpet-black-inhand-right", + "directions": 4 + }, + { + "name": "carpet-blue-inhand-left", + "directions": 4 + }, + { + "name": "carpet-blue-inhand-right", + "directions": 4 + }, + { + "name": "carpet-skyblue-inhand-left", + "directions": 4 + }, + { + "name": "carpet-skyblue-inhand-right", + "directions": 4 + }, + { + "name": "carpet-green-inhand-left", + "directions": 4 + }, + { + "name": "carpet-green-inhand-right", + "directions": 4 + }, + { + "name": "carpet-orange-inhand-left", + "directions": 4 + }, + { + "name": "carpet-orange-inhand-right", + "directions": 4 + }, + { + "name": "carpet-purple-inhand-left", + "directions": 4 + }, + { + "name": "carpet-purple-inhand-right", + "directions": 4 + }, + { + "name": "carpet-red-inhand-left", + "directions": 4 + }, + { + "name": "carpet-red-inhand-right", + "directions": 4 + }, + { + "name": "carpet-pink-inhand-left", + "directions": 4 + }, + { + "name": "carpet-pink-inhand-right", + "directions": 4 + }, + { + "name": "carpet-cyan-inhand-left", + "directions": 4 + }, + { + "name": "carpet-cyan-inhand-right", + "directions": 4 + }, + { + "name": "carpet-white-inhand-left", + "directions": 4 + }, + { + "name": "carpet-white-inhand-right", + "directions": 4 + }, + { + "name": "grass-inhand-left", + "directions": 4 + }, + { + "name": "grass-inhand-right", + "directions": 4 + }, + { + "name": "snow-inhand-left", + "directions": 4 + }, + { + "name": "snow-inhand-right", + "directions": 4 + }, + { + "name": "dirty-inhand-left", + "directions": 4 + }, + { + "name": "dirty-inhand-right", + "directions": 4 + }, + { + "name": "dark-inhand-right", + "directions": 4 + }, + { + "name": "dark-inhand-left", + "directions": 4 + }, + { + "name": "gcircuit-inhand-right", + "directions": 4 + }, + { + "name": "gcircuit-inhand-left", + "directions": 4 + }, + { + "name": "gold-inhand-right", + "directions": 4 + }, + { + "name": "gold-inhand-left", + "directions": 4 + }, + { + "name": "rcircuit-inhand-right", + "directions": 4 + }, + { + "name": "rcircuit-inhand-left", + "directions": 4 + }, + { + "name": "reinforced-inhand-right", + "directions": 4 + }, + { + "name": "reinforced-inhand-left", + "directions": 4 + }, + { + "name": "showroom-inhand-right", + "directions": 4 + }, + { + "name": "showroom-inhand-left", + "directions": 4 + }, + { + "name": "silver-inhand-right", + "directions": 4 + }, + { + "name": "silver-inhand-left", + "directions": 4 + }, + { + "name": "white-inhand-right", + "directions": 4 + }, + { + "name": "white-inhand-left", + "directions": 4 + }, + { + "name": "wood-inhand-right", + "directions": 4 + }, + { + "name": "wood-inhand-left", + "directions": 4 + }, + { + "name": "generic-inhand-right", + "directions": 4 + }, + { + "name": "generic-inhand-left", + "directions": 4 + }, + { + "name": "steel-inhand-right", + "directions": 4 + }, + { + "name": "steel-inhand-left", + "directions": 4 + }, + { + "name": "hydro-inhand-right", + "directions": 4 + }, + { + "name": "hydro-inhand-left", + "directions": 4 + }, + { + "name": "wood-large" + }, + { + "name": "asteroid" + }, + { + "name": "astro-asteroid" + }, + { + "name": "asteroid-inhand-right", + "directions": 4 + }, + { + "name": "asteroid-inhand-left", + "directions": 4 + }, + { + "name": "white-marble" + }, + { + "name": "white-marble-inhand-left", + "directions": 4 + }, + { + "name": "white-marble-inhand-right", + "directions": 4 + }, + { + "name": "dark-marble" + }, + { + "name": "dark-marble-inhand-left", + "directions": 4 + }, + { + "name": "dark-marble-inhand-right", + "directions": 4 + }, + { + "name": "plasmarble" + }, + { + "name": "plasmarble-inhand-left", + "directions": 4 + }, + { + "name": "plasmarble-inhand-right", + "directions": 4 + }, + { + "name": "uranium-marble" + }, + { + "name": "uranium-marble-inhand-left", + "directions": 4 + }, + { + "name": "uranium-marble-inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Structures/Machines/computers.rsi/meta.json b/Resources/Textures/Structures/Machines/computers.rsi/meta.json index 742fdb6ffc6..4e54c21821c 100644 --- a/Resources/Textures/Structures/Machines/computers.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/computers.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/bd6873fd4dd6a61d7e46f1d75cd4d90f64c40894. comm_syndie made by Veritius, based on comm. generic_panel_open made by Errant, commit https://github.com/space-wizards/space-station-14/pull/32273, comms_wizard and wizard_key by ScarKy0, request- variants transfer made by EmoGarbage404 (github), xenorobot by Samuka-C (github)", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/bd6873fd4dd6a61d7e46f1d75cd4d90f64c40894. comm_syndie made by Veritius, based on comm. generic_panel_open made by Errant, commit https://github.com/space-wizards/space-station-14/pull/32273, comms_wizard and wizard_key by ScarKy0, request- variants transfer made by EmoGarbage404 (github)", "size": { "x": 32, "y": 32 @@ -2042,10 +2042,6 @@ 0.3 ] ] - }, - { - "name": "xenorobot", - "directions": 4 } ] } diff --git a/Resources/Textures/Tiles/attributions.yml b/Resources/Textures/Tiles/attributions.yml index c5fa33cac3a..1eb0ff3aa35 100644 --- a/Resources/Textures/Tiles/attributions.yml +++ b/Resources/Textures/Tiles/attributions.yml @@ -161,8 +161,3 @@ license: "CC0-1.0" copyright: "Created by SeaWyrm" source: "https://github.com/space-wizards/space-station-14/pull/38007" - -- files: ["exoborg.png"] - license: "CC0-1.0" - copyright: "Created by Samuka-C (github) for space-station-14." - source: "https://github.com/space-wizards/space-station-14/pull/37068" diff --git a/Resources/Textures/_EinsteinEngines/Shaders/enthrall_effect.swsl b/Resources/Textures/_EinsteinEngines/Shaders/enthrall_effect.swsl index 1baed182acc..0a2a71800f5 100644 --- a/Resources/Textures/_EinsteinEngines/Shaders/enthrall_effect.swsl +++ b/Resources/Textures/_EinsteinEngines/Shaders/enthrall_effect.swsl @@ -23,11 +23,10 @@ void fragment() { c = vec4(u.y, u.y, u.y, 1.0) / 20000.0; for(highp float t = 0.6; t < 100.0; t += t) { - // Much slower time animations for gentler movement - highp float timeScale = 0.15; // slower = safer + // Slower time animations (reduced by factor of 2.5) + highp float timeScale = 0.4; // Slows down all time-based animations - // Lower frequency oscillations - highp float f1 = 0.15; + highp float f1 = 0.3; highp float f2 = f1; highp float f3 = f1; @@ -39,44 +38,40 @@ void fragment() { highp float ps2 = abs(s2); highp float ps3 = abs(s3); - // More gradual transitions (higher power = smoother) - s1 = sign(s1) * pow(ps1, 0.6); // Increased from 0.3 - s2 = sign(s2) * pow(ps2, 0.6); - s3 = sign(s3) * pow(ps3, 0.6); + s1 = sign(s1) * pow(ps1, 0.3); // Increased power = softer transition + s2 = sign(s2) * pow(ps2, 0.3); + s3 = sign(s3) * pow(ps3, 0.3); highp vec4 gbar = vec4(c.g, c.b, c.a, c.r); highp vec2 wz = vec2(c.w, c.z); - // Significantly reduced effect intensity - highp vec4 v1 = gbar / (sin(TIME * 0.1517 * timeScale) * 20.0); // Increased divisor - v1 = v1 - c * 0.1; - v1 = v1 + T(u - wz * t * 0.5); - highp vec4 v2 = gbar / (cos(TIME * 0.1335 * timeScale) * 20.0); - v2 = v2 - c * 0.1; - v2 = v2 + T(u - wz * t * 0.5); + highp vec4 v1 = gbar / (sin(TIME * 0.1517 * timeScale) * 12.0); // Increased divisor = reduced effect + v1 = v1 - c * 0.2; // Reduced from 0.3 + v1 = v1 + T(u - wz * t * 0.8); // Reduced movement speed - highp vec4 v3 = gbar / (sin(TIME * 0.1229 * timeScale) * 20.0); - v3 = v3 - c * 0.1; - v3 = v3 + T(u - wz * t * 0.5); + highp vec4 v2 = gbar / (cos(TIME * 0.1335 * timeScale) * 12.0); + v2 = v2 - c * 0.2; + v2 = v2 + T(u - wz * t * 0.8); - c += v1 * s1 * 0.4; - c += v2 * s2 * 0.4; - c += v3 * s3 * 0.4; + highp vec4 v3 = gbar / (sin(TIME * 0.1229 * timeScale) * 12.0); + v3 = v3 - c * 0.2; + v3 = v3 + T(u - wz * t * 0.8); + + c += v1 * s1 * 0.7; + c += v2 * s2 * 0.7; + c += v3 * s3 * 0.7; } - // Gentler mixing with slower oscillation - highp float mixscl = 0.001 + 0.015 * (0.5 + 0.5 * sin(TIME * 0.03)); + highp float mixscl = 0.002 + 0.03 * (0.5 + 0.5 * sin(TIME * 0.05)); // Reduced from 0.06, slower time - // Less distortion - highp vec4 color1 = T(u + vec2(c.x, c.y) * 0.4); + highp vec4 color1 = T(u + vec2(c.x, c.y) * 0.7); // Reduced distortion by 0.7 highp vec4 color2 = vec4(cos(c.x), cos(c.y), cos(c.z), cos(c.w)); highp vec4 originalColor = texture(SCREEN_TEXTURE, u); c = mix(color1, color2, mixscl); - // Reduced effect blend - keeps more of original image - c = mix(originalColor, c, 0.4); + c = mix(originalColor, c, 0.7); COLOR = vec4(c.rgb, remaining); } diff --git a/Resources/Textures/_Goobstation/Objects/Misc/emergencybox.rsi/meta.json b/Resources/Textures/_Goobstation/Objects/Misc/emergencybox.rsi/meta.json index bb956479d81..a7105bca3b6 100644 --- a/Resources/Textures/_Goobstation/Objects/Misc/emergencybox.rsi/meta.json +++ b/Resources/Textures/_Goobstation/Objects/Misc/emergencybox.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 modified by gtheglorious, aidenkrz, and gnusnotutopia, vapor made by modifying oxy by AstroDoge", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/cc65477c04f7403ca8a457bd5bae69a01abadbf0 modified by gtheglorious, aidenkrz, and gnusnotutopia", "size": { "x": 32, "y": 32 @@ -77,9 +77,6 @@ { "name": "nit" }, - { - "name": "vapor" - }, { "name": "box_silicon" }, diff --git a/Resources/Textures/_Goobstation/Objects/Weapons/Melee/revflash.rsi/burnt.png b/Resources/Textures/_Goobstation/Objects/Weapons/Melee/revflash.rsi/burnt.png new file mode 100644 index 00000000000..688628f9bb0 Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Weapons/Melee/revflash.rsi/burnt.png differ diff --git a/Resources/Textures/_Goobstation/Objects/Weapons/Melee/revflash.rsi/flash.png b/Resources/Textures/_Goobstation/Objects/Weapons/Melee/revflash.rsi/flash.png new file mode 100644 index 00000000000..7bdcede88ed Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Weapons/Melee/revflash.rsi/flash.png differ diff --git a/Resources/Textures/_Goobstation/Objects/Weapons/Melee/revflash.rsi/flashing.png b/Resources/Textures/_Goobstation/Objects/Weapons/Melee/revflash.rsi/flashing.png new file mode 100644 index 00000000000..0508c025416 Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Weapons/Melee/revflash.rsi/flashing.png differ diff --git a/Resources/Textures/_Goobstation/Objects/Weapons/Melee/revflash.rsi/inhand-left.png b/Resources/Textures/_Goobstation/Objects/Weapons/Melee/revflash.rsi/inhand-left.png new file mode 100644 index 00000000000..950195a37d4 Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Weapons/Melee/revflash.rsi/inhand-left.png differ diff --git a/Resources/Textures/_Goobstation/Objects/Weapons/Melee/revflash.rsi/inhand-right.png b/Resources/Textures/_Goobstation/Objects/Weapons/Melee/revflash.rsi/inhand-right.png new file mode 100644 index 00000000000..7a17666d9cd Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Weapons/Melee/revflash.rsi/inhand-right.png differ diff --git a/Resources/Textures/_Goobstation/Objects/Weapons/Melee/revflash.rsi/meta.json b/Resources/Textures/_Goobstation/Objects/Weapons/Melee/revflash.rsi/meta.json new file mode 100644 index 00000000000..e2cabf8c3e2 --- /dev/null +++ b/Resources/Textures/_Goobstation/Objects/Weapons/Melee/revflash.rsi/meta.json @@ -0,0 +1,35 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from cev-eris at https://github.com/discordia-space/CEV-Eris/commit/740ff31a81313086cf16761f3677cf1e2ab46c93 and modified by Timfa", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "burnt" + }, + { + "name": "flash" + }, + { + "name": "flashing", + "delays": [ + [ + 0.1, + 0.1, + 0.3 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_Mono/Clothing/Neck/Ponchos/blackstripe.rsi/equipped-NECK.png b/Resources/Textures/_Mono/Clothing/Neck/Ponchos/blackstripe.rsi/equipped-NECK.png new file mode 100644 index 00000000000..206f0a17848 Binary files /dev/null and b/Resources/Textures/_Mono/Clothing/Neck/Ponchos/blackstripe.rsi/equipped-NECK.png differ diff --git a/Resources/Textures/_Mono/Clothing/Neck/Ponchos/blackstripe.rsi/icon.png b/Resources/Textures/_Mono/Clothing/Neck/Ponchos/blackstripe.rsi/icon.png new file mode 100644 index 00000000000..3fe0e635fec Binary files /dev/null and b/Resources/Textures/_Mono/Clothing/Neck/Ponchos/blackstripe.rsi/icon.png differ diff --git a/Resources/Textures/_Mono/Clothing/Neck/Ponchos/blackstripe.rsi/inhand-left.png b/Resources/Textures/_Mono/Clothing/Neck/Ponchos/blackstripe.rsi/inhand-left.png new file mode 100644 index 00000000000..c0567db1a3e Binary files /dev/null and b/Resources/Textures/_Mono/Clothing/Neck/Ponchos/blackstripe.rsi/inhand-left.png differ diff --git a/Resources/Textures/_Mono/Clothing/Neck/Ponchos/blackstripe.rsi/inhand-right.png b/Resources/Textures/_Mono/Clothing/Neck/Ponchos/blackstripe.rsi/inhand-right.png new file mode 100644 index 00000000000..18df9020378 Binary files /dev/null and b/Resources/Textures/_Mono/Clothing/Neck/Ponchos/blackstripe.rsi/inhand-right.png differ diff --git a/Resources/Textures/_Mono/Clothing/Neck/Ponchos/blackstripe.rsi/meta.json b/Resources/Textures/_Mono/Clothing/Neck/Ponchos/blackstripe.rsi/meta.json new file mode 100644 index 00000000000..557e8b85a22 --- /dev/null +++ b/Resources/Textures/_Mono/Clothing/Neck/Ponchos/blackstripe.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Original work by TJohnson.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-NECK", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/drone.rsi/meta.json b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/drone.rsi/meta.json index 6fcd954108e..ab1ea41baa5 100644 --- a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/drone.rsi/meta.json +++ b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/drone.rsi/meta.json @@ -1,10 +1,10 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation: https://github.com/tgstation/tgstation/blob/master/icons/mob/nonhuman-player/alien.dmi | Edited by PuroSlavKing (Github) | Remade for Goobstation by Yonsim", + "copyright": "Taken from tgstation: https://github.com/tgstation/tgstation/blob/master/icons/mob/nonhuman-player/alien.dmi | Edited by PuroSlavKing (Github)", "size": { "x": 32, - "y": 36 + "y": 32 }, "states": [ { @@ -14,6 +14,10 @@ { "name": "xenomorph_dead" }, + { + "name": "xenomorph_sleep", + "directions": 4 + }, { "name": "xenomorph_unconscious" } diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/drone.rsi/xenomorph.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/drone.rsi/xenomorph.png index d7230303af0..8e382949285 100644 Binary files a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/drone.rsi/xenomorph.png and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/drone.rsi/xenomorph.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/drone.rsi/xenomorph_dead.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/drone.rsi/xenomorph_dead.png index 453a285ce21..4571e1c06d0 100644 Binary files a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/drone.rsi/xenomorph_dead.png and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/drone.rsi/xenomorph_dead.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/drone.rsi/xenomorph_sleep.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/drone.rsi/xenomorph_sleep.png new file mode 100644 index 00000000000..a172ade2185 Binary files /dev/null and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/drone.rsi/xenomorph_sleep.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/drone.rsi/xenomorph_unconscious.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/drone.rsi/xenomorph_unconscious.png index c6af7d15d28..778bc0f11fa 100644 Binary files a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/drone.rsi/xenomorph_unconscious.png and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/drone.rsi/xenomorph_unconscious.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/facehugger.rsi/equipped-MASK.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/facehugger.rsi/equipped-MASK.png index 179b37775a8..b9cb635ca75 100644 Binary files a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/facehugger.rsi/equipped-MASK.png and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/facehugger.rsi/equipped-MASK.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/facehugger.rsi/facehugger.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/facehugger.rsi/facehugger.png index afbb4035d7b..361ee97a4f2 100644 Binary files a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/facehugger.rsi/facehugger.png and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/facehugger.rsi/facehugger.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/facehugger.rsi/facehugger_dead.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/facehugger.rsi/facehugger_dead.png index e2e3ac5fed6..07e4240f1ec 100644 Binary files a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/facehugger.rsi/facehugger_dead.png and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/facehugger.rsi/facehugger_dead.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/facehugger.rsi/meta.json b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/facehugger.rsi/meta.json index b327b4c96a5..9d1edfe080a 100644 --- a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/facehugger.rsi/meta.json +++ b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/facehugger.rsi/meta.json @@ -1,114 +1,48 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Sprites by @aleksh and @.sigma_draconis. Animations by VictorJob. revised for Goobstation by johnjjohn(github)", + "copyright": "Taken from tgstation: https://github.com/tgstation/tgstation/blob/master/icons/mob/nonhuman-player/alien.dmi | Edited by PuroSlavKing (Github)", "size": { "x": 32, "y": 32 }, - "states": [ + "states": [ { "name": "facehugger", "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, + 0.1, + 0.1, + 0.1 + ] + ] }, { "name": "facehugger_dead" }, { "name": "equipped-MASK", - "directions": 4, - "delays": [ - [ - 0.2, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.2, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.2, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.2, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] + "directions": 4 }, { "name": "inhand-left", diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter.rsi/meta.json b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter.rsi/meta.json index 6fcd954108e..ab1ea41baa5 100644 --- a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter.rsi/meta.json +++ b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter.rsi/meta.json @@ -1,10 +1,10 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation: https://github.com/tgstation/tgstation/blob/master/icons/mob/nonhuman-player/alien.dmi | Edited by PuroSlavKing (Github) | Remade for Goobstation by Yonsim", + "copyright": "Taken from tgstation: https://github.com/tgstation/tgstation/blob/master/icons/mob/nonhuman-player/alien.dmi | Edited by PuroSlavKing (Github)", "size": { "x": 32, - "y": 36 + "y": 32 }, "states": [ { @@ -14,6 +14,10 @@ { "name": "xenomorph_dead" }, + { + "name": "xenomorph_sleep", + "directions": 4 + }, { "name": "xenomorph_unconscious" } diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter.rsi/xenomorph.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter.rsi/xenomorph.png index 1076654e969..29db838b5a5 100644 Binary files a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter.rsi/xenomorph.png and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter.rsi/xenomorph.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter.rsi/xenomorph_dead.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter.rsi/xenomorph_dead.png index 2ea83148bb6..79edd21d5d2 100644 Binary files a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter.rsi/xenomorph_dead.png and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter.rsi/xenomorph_dead.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter.rsi/xenomorph_sleep.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter.rsi/xenomorph_sleep.png new file mode 100644 index 00000000000..f416b23394c Binary files /dev/null and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter.rsi/xenomorph_sleep.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter.rsi/xenomorph_unconscious.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter.rsi/xenomorph_unconscious.png index 2f83ab67590..a0e0aadadfa 100644 Binary files a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter.rsi/xenomorph_unconscious.png and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter.rsi/xenomorph_unconscious.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter_jump.rsi/meta.json b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter_jump.rsi/meta.json index b7ba655b906..3b13a7d4c12 100644 --- a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter_jump.rsi/meta.json +++ b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter_jump.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation: https://github.com/tgstation/tgstation/blob/master/icons/mob/nonhuman-player/alien.dmi | Edited by PuroSlavKing (Github) | Remade for Goobstation by Yonsim", + "copyright": "Taken from tgstation: https://github.com/tgstation/tgstation/blob/master/icons/mob/nonhuman-player/alien.dmi | Edited by PuroSlavKing (Github)", "size": { "x": 64, "y": 32 diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter_jump.rsi/xenomorph_jump.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter_jump.rsi/xenomorph_jump.png index de89d392d98..25d3f75cc49 100644 Binary files a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter_jump.rsi/xenomorph_jump.png and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/hunter_jump.rsi/xenomorph_jump.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/meta.json b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/meta.json index 8df2a619d83..70d63fed034 100644 --- a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/meta.json +++ b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from CMSS13: https://github.com/cmss13-devs/cmss13/commit/dbebd43 | Revised for Goobstation by JohnJJohn (Github)", + "copyright": "Taken from tgstation: https://github.com/tgstation/tgstation/blob/master/icons/mob/nonhuman-player/alien.dmi | Edited by PuroSlavKing (Github)", "size": { "x": 32, "y": 32 @@ -16,52 +16,36 @@ "directions": 4, "delays": [ [ - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2 + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 ], [ - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2 + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 ], [ - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2 + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 ], [ - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2 + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 ] ] }, @@ -76,7 +60,20 @@ }, { "name": "xenomorph_unconscious", + "directions": 4, "delays": [ + [ + 0.7, + 0.7 + ], + [ + 0.7, + 0.7 + ], + [ + 0.7, + 0.7 + ], [ 0.7, 0.7 diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph-moving.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph-moving.png index d7015ebb26d..a02744e5c22 100644 Binary files a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph-moving.png and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph-moving.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph.png index 8882b1d81db..bd1f38edf17 100644 Binary files a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph.png and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph_dead.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph_dead.png index a21da7832a3..cb38c05490e 100644 Binary files a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph_dead.png and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph_dead.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph_sleep.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph_sleep.png index 75a52ddb8b4..11aeb22ef2e 100644 Binary files a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph_sleep.png and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph_sleep.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph_unconscious.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph_unconscious.png index e3eb0f381d9..d19536271a4 100644 Binary files a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph_unconscious.png and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/larva.rsi/xenomorph_unconscious.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/sentinel.rsi/meta.json b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/sentinel.rsi/meta.json index 6fcd954108e..ab1ea41baa5 100644 --- a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/sentinel.rsi/meta.json +++ b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/sentinel.rsi/meta.json @@ -1,10 +1,10 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation: https://github.com/tgstation/tgstation/blob/master/icons/mob/nonhuman-player/alien.dmi | Edited by PuroSlavKing (Github) | Remade for Goobstation by Yonsim", + "copyright": "Taken from tgstation: https://github.com/tgstation/tgstation/blob/master/icons/mob/nonhuman-player/alien.dmi | Edited by PuroSlavKing (Github)", "size": { "x": 32, - "y": 36 + "y": 32 }, "states": [ { @@ -14,6 +14,10 @@ { "name": "xenomorph_dead" }, + { + "name": "xenomorph_sleep", + "directions": 4 + }, { "name": "xenomorph_unconscious" } diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/sentinel.rsi/xenomorph.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/sentinel.rsi/xenomorph.png index 31ac1585d30..d985b0180dd 100644 Binary files a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/sentinel.rsi/xenomorph.png and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/sentinel.rsi/xenomorph.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/sentinel.rsi/xenomorph_dead.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/sentinel.rsi/xenomorph_dead.png index e7af0baa5a1..5c7d62c547c 100644 Binary files a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/sentinel.rsi/xenomorph_dead.png and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/sentinel.rsi/xenomorph_dead.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/sentinel.rsi/xenomorph_sleep.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/sentinel.rsi/xenomorph_sleep.png new file mode 100644 index 00000000000..0a8ae92a313 Binary files /dev/null and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/sentinel.rsi/xenomorph_sleep.png differ diff --git a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/sentinel.rsi/xenomorph_unconscious.png b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/sentinel.rsi/xenomorph_unconscious.png index eb3bf930b86..6de88942d0d 100644 Binary files a/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/sentinel.rsi/xenomorph_unconscious.png and b/Resources/Textures/_White/Mobs/Aliens/Xenomorphs/sentinel.rsi/xenomorph_unconscious.png differ diff --git a/Resources/Textures/_White/Mobs/Species/Xenomorph/organs.rsi/embryon.png b/Resources/Textures/_White/Mobs/Species/Xenomorph/organs.rsi/embryon.png index b8339ea3ee4..b12cb7a52b2 100644 Binary files a/Resources/Textures/_White/Mobs/Species/Xenomorph/organs.rsi/embryon.png and b/Resources/Textures/_White/Mobs/Species/Xenomorph/organs.rsi/embryon.png differ diff --git a/Resources/migration.yml b/Resources/migration.yml index 90c3ec5f78a..28a91ba6477 100644 --- a/Resources/migration.yml +++ b/Resources/migration.yml @@ -134,7 +134,6 @@ # SPDX-FileCopyrightText: 2025 pheenty # SPDX-FileCopyrightText: 2025 username <113782077+whateverusername0@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 whateverusername0 -# SPDX-FileCopyrightText: 2025 korczoczek # # SPDX-License-Identifier: AGPL-3.0-or-later # This is a basic dictionary that maps old entity prototype ids to new ids. This only works for entity prototypes, and @@ -179,8 +178,8 @@ BenchPewRight: null BenchSofaCorpLeft: null BenchSofaCorpMiddle: null BenchSofaCorpRight: null -#BenchSofaLeft: null #Omu -#BenchSofaRight: null #Omu +BenchSofaLeft: null +BenchSofaRight: null BenchSteelLeft: null BenchSteelMiddle: null BenchSteelRight: null @@ -226,7 +225,7 @@ GunSafeAdjutantShotgun: null GunSafeEnergyGunMini: null GunSafeVulcanRifle: null HatSpawner: null -#KitchenDeepFryer: null #Omu +KitchenDeepFryer: null KvassTankFull: null LockerForensicMantisFilled: null LunchboxSecurityFilledRandom: null @@ -237,7 +236,7 @@ PaintingMothBigCatch: null PaintingSpoon: null PlushieMothMusician: null PlushieMothRandom: null -PosterContrabandBreadLies: null #Omu +PosterContrabandBreadLies: null PosterContrabandGotWood: null PosterContrabandSafetyMothSyndie: null PosterContrabandSaucerNumberOne: null @@ -259,11 +258,11 @@ PosterLegitSafetyMothFires: null PosterLegitSafetyMothGlimmer: null PosterLegitSafetyMothPills: null PosterLegitSafetyMothPoisoning: null -#PosterLegitShoukou: null #omu +PosterLegitShoukou: null PoweredLightBlueInterior: null -PoweredLightColoredRed: null #omu -PoweredSmallLightMaintenance: null #omu -PoweredSmallLightMaintenanceRed: null #omu +PoweredLightColoredRed: null +PoweredSmallLightMaintenance: null +PoweredSmallLightMaintenanceRed: null RandomAmmoBox: null RandomAnimalSpawner: null RandomBoards: null @@ -277,11 +276,11 @@ SecBreachingHammer: null Shinai: null ShockCollar: null shuttle_manipulator: null -#SignConspiracyBoard: null #omu +SignConspiracyBoard: null SignDirectionalLogistics: null SignDirectionalMail: null SignDojo: null -#SignLastIdiot: null #omu +SignLastIdiot: null SignSec: null SophicScribe: null SpaceCashLuckyBill: null @@ -294,7 +293,7 @@ SpawnPointForensicMantis: null SpawnPointLocationMidRoundAntag: null SpawnPointMartialArtist: null SpawnPointMedicalBorg: null -#SpawnPointPrisoner: null # Omu +SpawnPointPrisoner: null SpawnPointPrisonGuard: null SpeedLoaderSpecialPractice: null SuitStorageCorpsman: null @@ -407,8 +406,8 @@ SpeedLoaderPistolHighVelocity: SpeedLoaderPistol # 2023-08-07 #If the name is anything to go off of, these are presumably just CEV-Eris versions of the snow rock (which we already have.) #They are practically never used in this way however, so they're migrated to the basic rock type. -#MountainRock: AsteroidRock #OMU! DO NOT CHANGE TO ASTEROID ROCK -#MountainRockMining: AsteroidRockMining #OMU! DO NOT CHANGE TO ASTEROID ROCK +MountainRock: AsteroidRock +MountainRockMining: AsteroidRockMining # 2023-08-08 WindowTintedDirectional: WindowFrostedDirectional @@ -1054,86 +1053,3 @@ BarSignWhiskeyEchoesAlignTile: BarSignWhiskeyEchoes # 2025-06-21 ClothingNeckHeadphones: ClothingMultipleHeadphones - -# 2025-09-01 - Omu -LightBulbMaintenanceRed: DimLightBulb -BookSalvageEpistemicsRandom: null -ClothingHeadAreopagite: null -ClothingHeadHelmetInsulated: null -ClothingHeadHoodBrown: null -ClothingHeadTechPriest: null -ClothingOuterChiefJustice: null -ClothingOuterCoatHyenhSweater: null -ClothingOuterCoatLettermanRed: null -ClothingOuterRobeBrown: null -ClothingOuterRobeTechPriest: null -ClothingOuterSuitAreopagite: null -ClothingOuterWinterCoatMantis: null -ClothingOuterWinterMystagogue: null -ClothingUniformJumpskirtNurse: null -ClothingUniformJumpsuitPrisonGuard: null -ClothingUniformRat: null -ComputerCargoOrdersJustice: null -ComputerShuttleMiningGlacier: ComputerCargoOrdersService -DefaultStationBeaconChiefJustice: null -DefaultStationBeaconJustice: null -DefaultStationBeaconProber: null -DefaultStationBeaconProsecutor: null -GasPipeSensorControlNitrogen: GasPipeSensor -GasPipeSensorControlOverpressure: GasPipeSensor -GasPipeSensorControlOxygen: GasPipeSensor -GavelBlock: null -HandgunSafeSpawner: GunSafePistolMk58 -HolopadCargoMail: HolopadCargoFront -HolopadEpistemicsMantis: HolopadScienceRobotics -HolopadEpistemicsOracle: HolopadScienceAnomaly -HolopadJusticeCJ: null -HolopadJusticeClerk: null -HolopadJusticeProsecutor: null -HolopadSecurityCorpsman: HolopadSecurityBrig -LockerChiefJusticeFilled: null -LockerClerkFilled: null -LockerParamedicFilledHardsuit: LockerParamedicFilled -LockerPsychologistFilled: null -LockerSurgeonFilled: LockerMedicalFilled -LogisticsTechFab: CargoTechFab -OilJarCorn: null -RailingCornerSmallDeltaV: null -RailingDeltaV: null -RifleSafeSpawner: GunSafeRifleLecter -SalvageSeedSpawnerLow: null -SecureCabinetCE: null -SecureCabinetEpistemics: null -SecureCabinetHoP: null -SecureCabinetHoS: null -SecureCabinetLogistics: null -SecureCabinetPsychologist: null -SentientSmileCore: SpawnMobSmile -ShotgunSafeSpawner: GunSafeShotgunKammerer -SignConspiracyBoard: null -SpawnMobJusticePet: null -SpawnMobSecLaikaOrShiva: SpawnMobSecDogLaika -SpawnPointAdminAssistant: SpawnPointAdminAssistant -SpawnPointChiefJustice: null -SpawnPointClerk: null -SpawnPointProsecutor: null -SpawnPointRoboticist: SpawnPointScientist -SpawnPointSecurityBorg: null -SpawnPointSurgeon: SpawnPointMedicalDoctor -SuitStorageSecDeltaV: SuitStorageSec -SuperweaponSafeSpawner: WeaponLauncherRocket -TrialTimer: null -UniformJabroni: null -WarpPointCourt: null -WeaponTurretAI: ChristmasTinselBlue1 -WindoorSecureClerkLocked: WindoorSecure -WarpPointEngineering: null -SpawnMobCMOPetSilvia: null -SpawnPointCargoAssistant: SpawnPointCargoTechnician -SignLastIdiot: null -EpistemicsTechFab: ScienceTechFab -LockableButtonRobotics: null -# LockerAdministrativeAssistantFilled: UniqueLockerNanorepFilled # Administrative Assistant is real now. This was just converting their lockers to NTR ones. - -# 2025-10-09 -FoodDonutJellySlugcat: FoodDonutJellyScurret