diff --git a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleButtonsBox.xaml b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleButtonsBox.xaml
new file mode 100644
index 0000000000..32d611e771
--- /dev/null
+++ b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleButtonsBox.xaml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEntry.xaml.cs b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleButtonsBox.xaml.cs
similarity index 82%
rename from Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEntry.xaml.cs
rename to Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleButtonsBox.xaml.cs
index fc53cc72ae..45be42c8b4 100644
--- a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEntry.xaml.cs
+++ b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleButtonsBox.xaml.cs
@@ -10,20 +10,17 @@ using Robust.Shared.Utility;
namespace Content.Client.UserInterface.Systems.Ghost.Controls.Roles
{
[GenerateTypedNameReferences]
- public sealed partial class GhostRolesEntry : BoxContainer
+ public sealed partial class GhostRoleButtonsBox : BoxContainer // WD Edit ahead of wizden upstream
{
private SpriteSystem _spriteSystem;
public event Action? OnRoleSelected;
public event Action? OnRoleFollow;
- public GhostRolesEntry(string name, string description, bool hasAccess, FormattedMessage? reason, IEnumerable roles, SpriteSystem spriteSystem)
+ public GhostRoleButtonsBox(bool hasAccess, FormattedMessage? reason, IEnumerable roles, SpriteSystem spriteSystem) // WD Edit ahead of wizden upstream
{
RobustXamlLoader.Load(this);
_spriteSystem = spriteSystem;
- Title.Text = name;
- Description.SetMessage(description);
-
foreach (var role in roles)
{
var button = new GhostRoleEntryButtons(role);
@@ -45,7 +42,7 @@ namespace Content.Client.UserInterface.Systems.Ghost.Controls.Roles
{
TextureScale = new Vector2(0.4f, 0.4f),
Stretch = TextureRect.StretchMode.KeepCentered,
- Texture = _spriteSystem.Frame0(new SpriteSpecifier.Texture(new ("/Textures/Interface/Nano/lock.svg.192dpi.png"))),
+ Texture = _spriteSystem.Frame0(new SpriteSpecifier.Texture(new("/Textures/Interface/Nano/lock.svg.192dpi.png"))),
HorizontalExpand = true,
HorizontalAlignment = HAlignment.Right,
});
diff --git a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleEntryButtons.xaml b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleEntryButtons.xaml
index ffde5d69f7..05c52deef1 100644
--- a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleEntryButtons.xaml
+++ b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleEntryButtons.xaml
@@ -1,15 +1,15 @@
+ Orientation="Horizontal"
+ HorizontalAlignment="Stretch">
+ HorizontalExpand="True"
+ SizeFlagsStretchRatio="3"/>
+ HorizontalExpand="True"/>
diff --git a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleInfoBox.xaml b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleInfoBox.xaml
new file mode 100644
index 0000000000..e24455bdf5
--- /dev/null
+++ b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleInfoBox.xaml
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleInfoBox.xaml.cs b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleInfoBox.xaml.cs
new file mode 100644
index 0000000000..705a9f0bb8
--- /dev/null
+++ b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleInfoBox.xaml.cs
@@ -0,0 +1,18 @@
+using Robust.Client.AutoGenerated;
+using Robust.Client.UserInterface.Controls;
+using Robust.Client.UserInterface.XAML;
+
+namespace Content.Client.UserInterface.Systems.Ghost.Controls.Roles
+{
+ [GenerateTypedNameReferences]
+ public sealed partial class GhostRoleInfoBox : BoxContainer
+ {
+ public GhostRoleInfoBox(string name, string description)
+ {
+ RobustXamlLoader.Load(this);
+
+ Title.Text = name;
+ Description.SetMessage(description);
+ }
+ }
+}
diff --git a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEntry.xaml b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEntry.xaml
deleted file mode 100644
index d9ed172810..0000000000
--- a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEntry.xaml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEui.cs b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEui.cs
index 6b183362e5..69cae05903 100644
--- a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEui.cs
+++ b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEui.cs
@@ -5,12 +5,11 @@ using Content.Shared.Eui;
using Content.Shared.Ghost.Roles;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
-using Robust.Shared.Utility;
namespace Content.Client.UserInterface.Systems.Ghost.Controls.Roles
{
[UsedImplicitly]
- public sealed class GhostRolesEui : BaseEui
+ public sealed class GhostRolesEui : BaseEui // WD Edit ahead of wizden upstream
{
private readonly GhostRolesWindow _window;
private GhostRoleRulesWindow? _windowRules = null;
@@ -77,6 +76,13 @@ namespace Content.Client.UserInterface.Systems.Ghost.Controls.Roles
if (state is not GhostRolesEuiState ghostState)
return;
+
+ // We must save BodyVisible state, so all Collapsible boxes will not close
+ // on adding new ghost role.
+ // Save the current state of each Collapsible box being visible or not
+ _window.SaveCollapsibleBoxesStates();
+
+ // Clearing the container before adding new roles
_window.ClearEntries();
var entityManager = IoCManager.Resolve();
@@ -84,28 +90,32 @@ namespace Content.Client.UserInterface.Systems.Ghost.Controls.Roles
var spriteSystem = sysManager.GetEntitySystem();
var requirementsManager = IoCManager.Resolve();
+ // TODO: role.Requirements value doesn't work at all as an equality key, this must be fixed
+ // Grouping roles
var groupedRoles = ghostState.GhostRoles.GroupBy(
role => (role.Name, role.Description, role.Requirements));
+
+ // Add a new entry for each role group
foreach (var group in groupedRoles)
{
var name = group.Key.Name;
var description = group.Key.Description;
- bool hasAccess = true;
- FormattedMessage? reason;
-
- if (!requirementsManager.CheckRoleRequirements(group.Key.Requirements, null, out reason))
- {
- hasAccess = false;
- }
+ var hasAccess = requirementsManager.CheckRoleRequirements(
+ group.Key.Requirements,
+ null,
+ out var reason);
+ // Adding a new role
_window.AddEntry(name, description, hasAccess, reason, group, spriteSystem);
}
+ // Restore the Collapsible box state if it is saved
+ _window.RestoreCollapsibleBoxesStates();
+
+ // Close the rules window if it is no longer needed
var closeRulesWindow = ghostState.GhostRoles.All(role => role.Identifier != _windowRulesId);
if (closeRulesWindow)
- {
_windowRules?.Close();
- }
}
}
}
diff --git a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesWindow.xaml.cs b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesWindow.xaml.cs
index 2e7c99641b..3189bb9faf 100644
--- a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesWindow.xaml.cs
+++ b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesWindow.xaml.cs
@@ -1,31 +1,100 @@
+using System.Linq;
using Content.Shared.Ghost.Roles;
using Robust.Client.AutoGenerated;
using Robust.Client.GameObjects;
+using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
+using Robust.Client.UserInterface.XAML;
using Robust.Shared.Utility;
namespace Content.Client.UserInterface.Systems.Ghost.Controls.Roles
{
[GenerateTypedNameReferences]
- public sealed partial class GhostRolesWindow : DefaultWindow
+ public sealed partial class GhostRolesWindow : DefaultWindow // WD Edit ahead of wizden upstream
{
public event Action? OnRoleRequestButtonClicked;
public event Action? OnRoleFollow;
+ private Dictionary<(string name, string description), Collapsible> _collapsibleBoxes = new();
+ private HashSet<(string name, string description)> _uncollapsedStates = new();
+
+ public GhostRolesWindow()
+ {
+ RobustXamlLoader.Load(this);
+ }
+
public void ClearEntries()
{
NoRolesMessage.Visible = true;
EntryContainer.DisposeAllChildren();
+ _collapsibleBoxes.Clear();
+ }
+
+ public void SaveCollapsibleBoxesStates()
+ {
+ _uncollapsedStates.Clear();
+ foreach (var (key, collapsible) in _collapsibleBoxes)
+ {
+ if (collapsible.BodyVisible)
+ {
+ _uncollapsedStates.Add(key);
+ }
+ }
+ }
+
+ public void RestoreCollapsibleBoxesStates()
+ {
+ foreach (var (key, collapsible) in _collapsibleBoxes)
+ {
+ collapsible.BodyVisible = _uncollapsedStates.Contains(key);
+ }
}
public void AddEntry(string name, string description, bool hasAccess, FormattedMessage? reason, IEnumerable roles, SpriteSystem spriteSystem)
{
NoRolesMessage.Visible = false;
- var entry = new GhostRolesEntry(name, description, hasAccess, reason, roles, spriteSystem);
- entry.OnRoleSelected += OnRoleRequestButtonClicked;
- entry.OnRoleFollow += OnRoleFollow;
- EntryContainer.AddChild(entry);
+ var ghostRoleInfos = roles.ToList();
+ var rolesCount = ghostRoleInfos.Count;
+
+ var info = new GhostRoleInfoBox(name, description);
+ var buttons = new GhostRoleButtonsBox(hasAccess, reason, ghostRoleInfos, spriteSystem);
+ buttons.OnRoleSelected += OnRoleRequestButtonClicked;
+ buttons.OnRoleFollow += OnRoleFollow;
+
+ EntryContainer.AddChild(info);
+
+ if (rolesCount > 1)
+ {
+ var buttonHeading = new CollapsibleHeading(Loc.GetString("ghost-roles-window-available-button", ("rolesCount", rolesCount)));
+
+ buttonHeading.AddStyleClass(ContainerButton.StyleClassButton);
+ buttonHeading.Label.HorizontalAlignment = HAlignment.Center;
+ buttonHeading.Label.HorizontalExpand = true;
+
+ var body = new CollapsibleBody
+ {
+ Margin = new Thickness(0, 5, 0, 0),
+ };
+
+ // TODO: Add Requirements to this key when it'll be fixed and work as an equality key in GhostRolesEui
+ var key = (name, description);
+
+ var collapsible = new Collapsible(buttonHeading, body)
+ {
+ Orientation = BoxContainer.LayoutOrientation.Vertical,
+ Margin = new Thickness(0, 0, 0, 8),
+ };
+
+ body.AddChild(buttons);
+
+ EntryContainer.AddChild(collapsible);
+ _collapsibleBoxes.Add(key, collapsible);
+ }
+ else
+ {
+ EntryContainer.AddChild(buttons);
+ }
}
}
}
diff --git a/Content.Shared/_White/Blocking/MeleeBlockSystem.cs b/Content.Shared/_White/Blocking/MeleeBlockSystem.cs
index d06048641c..934f812a65 100644
--- a/Content.Shared/_White/Blocking/MeleeBlockSystem.cs
+++ b/Content.Shared/_White/Blocking/MeleeBlockSystem.cs
@@ -11,6 +11,7 @@ using Content.Shared.Weapons.Melee;
using Content.Shared.Weapons.Melee.Events;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Timing;
+using Content.Shared.Mobs.Systems;
namespace Content.Shared._White.Blocking;
@@ -21,16 +22,17 @@ public sealed class MeleeBlockSystem : EntitySystem
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedPopupSystem _popupSystem = default!;
[Dependency] private readonly StatusEffectsSystem _statusEffect = default!;
+ [Dependency] private readonly MobStateSystem _mobStateSystem = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent(OnBlockAttempt,
- after: new[] {typeof(BlockingSystem)});
+ after: new[] { typeof(BlockingSystem) });
SubscribeLocalEvent(OnHit,
- before: new[] {typeof(StaminaSystem), typeof(MeleeThrowOnHitSystem)},
- after: new[] {typeof(BackstabSystem)});
+ before: new[] { typeof(StaminaSystem), typeof(MeleeThrowOnHitSystem) },
+ after: new[] { typeof(BackstabSystem) });
SubscribeLocalEvent(OnExamine);
}
@@ -76,6 +78,9 @@ public sealed class MeleeBlockSystem : EntitySystem
if (TryComp(uid.Value, out ItemToggleComponent? toggle) && !toggle.Activated)
return;
+ if (!_mobStateSystem.IsAlive(ent))
+ return;
+
_audio.PlayPredicted(block.BlockSound, ent, args.Attacker);
_popupSystem.PopupPredicted(Loc.GetString("melee-block-event-blocked"), ent, args.Attacker);
_damageable.TryChangeDamage(uid.Value, args.Damage);
diff --git a/Resources/Changelog/ChangelogWhite.yml b/Resources/Changelog/ChangelogWhite.yml
index 8dd9890b95..6e4b861f91 100644
--- a/Resources/Changelog/ChangelogWhite.yml
+++ b/Resources/Changelog/ChangelogWhite.yml
@@ -1,62 +1,4 @@
Entries:
-- author: Valtos
- changes:
- - message: "\u041D\u043E\u0432\u044B\u0439 \u0441\u0442\u0438\u043B\u044C \u0438\
- \u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0432 \u0437\u0435\u043B\
- \u0451\u043D\u043E\u043C \u0438\u0441\u043F\u043E\u043B\u043D\u0435\u043D\u0438\
- \u0438."
- type: Tweak
- - message: "\u0420\u0430\u0437\u043C\u0435\u0440\u044B \u043D\u0435\u043A\u043E\u0442\
- \u043E\u0440\u044B\u0445 \u043E\u043A\u043E\u043D \u0442\u0435\u043F\u0435\u0440\
- \u044C \u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u044B\u0435. \u042D\u0442\
- \u043E \u0438\u0437\u0431\u0430\u0432\u043B\u044F\u0435\u0442 \u043E\u0442 \u043D\
- \u0430\u0434\u043E\u0431\u043D\u043E\u0441\u0442\u0438 \u043A\u0440\u0443\u0442\
- \u0438\u0442\u044C \u0438 \u0432\u0435\u0440\u0442\u0435\u0442\u044C \u0438\u0445\
- \ \u043A\u0430\u0436\u0434\u044B\u0439 \u0440\u0430\u0437 \u043F\u0440\u0438\
- \ \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u0438."
- type: Fix
- - message: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C\u043D\
- \u0430\u044F \u043F\u043E\u043B\u043E\u0441\u043A\u0430 \u043C\u0435\u0436\u0434\
- \u0443 \u0447\u0430\u0442\u043E\u043C \u0438 \u0438\u0433\u0440\u043E\u0432\u044B\
- \u043C \u043E\u043A\u043D\u043E\u043C \u0442\u0435\u043F\u0435\u0440\u044C \u0441\
- \u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442 \u0441\u0432\u043E\u0451 \u043F\
- \u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043A\u043E\u0440\u0440\u0435\
- \u043A\u0442\u043D\u043E."
- type: Fix
- id: 118
- time: '2023-04-06T06:09:28.0000000+00:00'
-- author: BELNAKBU
- changes:
- - message: "\u0412\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u0440\
- \u0430\u0437\u0434\u0435\u043B\u043A\u0438 \u043B\u044E\u0434\u0435\u0439 \u043E\
- \u0431\u044B\u0447\u043D\u044B\u043C \u043E\u0441\u0442\u0440\u044B\u043C \u043F\
- \u0440\u0435\u0434\u043C\u0435\u0442\u043E\u043C, \u0431\u0435\u0437 \u043D\u0443\
- \u0436\u0434\u044B \u0432 \u043A\u0440\u044E\u043A\u0430\u0445. \u0422\u0430\
- \u043A\u0430\u044F \u0440\u0430\u0437\u0434\u0435\u043B\u043A\u0430 \u0437\u0430\
- \u0439\u043C\u0435\u0442 3 \u043C\u0438\u043D\u0443\u0442\u044B, \u0431\u0443\
- \u0434\u0443\u0442 \u043F\u0440\u043E\u0438\u0433\u0440\u044B\u0432\u0430\u0442\
- \u044C\u0441\u044F \u0433\u0440\u043E\u043C\u043A\u0438\u0435 \u0437\u0432\u0443\
- \u043A\u0438 \u0438 \u0435\u0434\u0438\u043D\u043E\u0440\u0430\u0437\u043E\u0432\
- \u043E \u043F\u043E\u044F\u0432\u0438\u0442\u0441\u044F \u043F\u043E\u043F\u0430\
- \u043F, \u043E \u0442\u043E\u043C \u0447\u0442\u043E \u0440\u0430\u0437\u0434\
- \u0435\u043B\u044B\u0432\u0430\u044E\u0442 \u0447\u0435\u043B\u043E\u0432\u0435\
- \u043A\u0430. \u0422\u0430\u043A\u0436\u0435 \u0432 \u043A\u0440\u0438\u043E\
- \ \u043F\u043E\u0434\u044B \u043C\u043E\u0436\u043D\u043E \u0432\u0441\u0442\
- \u0430\u0432\u043B\u044F\u0442\u044C \u0442\u0435\u043B\u0430 \u043F\u0440\u043E\
- \u0441\u0442\u043E \u043F\u0435\u0440\u0435\u0442\u0430\u0441\u043A\u0438\u0432\
- \u0430\u044F \u043C\u043E\u0434\u0435\u043B\u044C\u043A\u0438 \u043D\u0430 \u043A\
- \u0430\u043F\u0441\u0443\u043B\u0443."
- type: Add
- id: 119
- time: '2023-04-06T08:45:15.0000000+00:00'
-- author: Valtos
- changes:
- - message: "\u0424\u0438\u043A\u0441 \u0431\u0430\u043D\u043E\u0432, \u043A\u043E\
- \u0442\u043E\u0440\u044B\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u043B\u0438\
- \ \u0432\u0435\u0437\u0434\u0435."
- type: Fix
- id: 120
- time: '2023-04-06T10:06:06.0000000+00:00'
- author: HitPanda
changes:
- message: "\u041F\u0435\u0440\u0435\u0432\u043E\u0434 \u0442\u0435\u043A\u0441\u0442\
@@ -8906,3 +8848,37 @@
id: 617
time: '2024-12-01T21:08:39.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/799
+- author: keslik
+ changes:
+ - message: "\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0451\u043D \u043E\u0431\u043D\
+ \u043E\u0432\u043B\u0451\u043D\u043D\u044B\u0439 \u0438\u043D\u0442\u0435\u0440\
+ \u0444\u0435\u0439\u0441 \u0432\u044B\u0431\u043E\u0440\u0430 \u043F\u0440\u0438\
+ \u0437\u0440\u0430\u0447\u043D\u044B\u0445 \u0440\u043E\u043B\u0435\u0439"
+ type: Add
+ id: 618
+ time: '2024-12-02T17:16:33.0000000+00:00'
+ url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/800
+- author: BIG_Zi_348
+ changes:
+ - message: "\u0422\u0435\u043F\u0435\u0440\u044C \u0434\u043B\u044F \u0431\u043B\
+ \u043E\u043A\u0430 \u0430\u0442\u0430\u043A \u0431\u043B\u0438\u0436\u043D\u0435\
+ \u0433\u043E \u0431\u043E\u044F \u043D\u0443\u0436\u043D\u043E \u0431\u044B\u0442\
+ \u044C \u0436\u0438\u0432\u044B\u043C."
+ type: Fix
+ id: 619
+ time: '2024-12-02T19:30:18.0000000+00:00'
+ url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/801
+- author: BIG_Zi_348
+ changes:
+ - message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B \u043A\u043E\u043C\
+ \u043F\u043E\u043D\u0435\u043D\u0442\u044B \u0414\u0410\u041C \u0434\u043B\u044F\
+ \ \u043F\u043E\u043A\u0443\u043F\u043A\u0438 \u0432 \u043A\u0430\u0440\u0433\
+ \u043E."
+ type: Add
+ - message: "\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u0430 \u0432\u043E\
+ \u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u0433\u0438\u0431\u0430\
+ \ \u0443\u0434\u0430\u0440\u0430\u043C\u0438."
+ type: Add
+ id: 620
+ time: '2024-12-02T21:00:35.0000000+00:00'
+ url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/802
diff --git a/Resources/Locale/en-US/ghost/ghost-gui.ftl b/Resources/Locale/en-US/ghost/ghost-gui.ftl
index 4940621b61..f37c7863ed 100644
--- a/Resources/Locale/en-US/ghost/ghost-gui.ftl
+++ b/Resources/Locale/en-US/ghost/ghost-gui.ftl
@@ -22,6 +22,7 @@ ghost-target-window-current-button = Warp: {$name}
ghost-target-window-warp-to-most-followed = Warp to Most Followed
ghost-roles-window-title = Ghost Roles
+ghost-roles-window-available-button = Available ({$rolesCount})
ghost-roles-window-join-raffle-button = Join raffle
ghost-roles-window-raffle-in-progress-button =
Join raffle ({$time} left, { $players ->
diff --git a/Resources/Locale/ru-RU/ghost/ghost-gui.ftl b/Resources/Locale/ru-RU/ghost/ghost-gui.ftl
index a1b9590db3..e461702286 100644
--- a/Resources/Locale/ru-RU/ghost/ghost-gui.ftl
+++ b/Resources/Locale/ru-RU/ghost/ghost-gui.ftl
@@ -23,7 +23,7 @@ ghost-target-window-title = Телепорт призрака
ghost-target-window-current-button = Телепорт в: { $name }
ghost-roles-window-title = Роли призраков
-
+ghost-roles-window-available-button = Доступно ({$rolesCount})
ghost-roles-window-join-raffle-button = Начать лотерею
ghost-roles-window-raffle-in-progress-button =
Участвовать ({$time} осталось, { $players ->
diff --git a/Resources/Prototypes/Entities/Mobs/base.yml b/Resources/Prototypes/Entities/Mobs/base.yml
index bbc7b1e920..93519a4bdc 100644
--- a/Resources/Prototypes/Entities/Mobs/base.yml
+++ b/Resources/Prototypes/Entities/Mobs/base.yml
@@ -54,6 +54,12 @@
damageContainer: Biological
- type: Destructible
thresholds:
+ - trigger:
+ !type:DamageTypeTrigger
+ damageType: Blunt
+ damage: 1500 # WD Edit from 400 to 1500
+ behaviors:
+ - !type:GibBehavior { }
- trigger:
!type:DamageTypeTrigger
damageType: Heat
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml
index 2080783d44..0567e4af1b 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml
@@ -119,8 +119,8 @@
- type: Item
sprite: White/Objects/Weapons/Guns/SMG/c20r-inhands.rsi
- type: Gun
- minAngle: 1 # Amour EDIT FROM 11 TO 1
- maxAngle: 7 # Amour EDIT FROM 19 TO 7
+ minAngle: 1 # WD
+ maxAngle: 7 # WD
shotsPerBurst: 5
availableModes:
- SemiAuto
@@ -217,9 +217,9 @@
- type: Item
sprite: White/Objects/Weapons/Guns/SMG/drozd-inhands.rsi
- type: Gun
- minAngle: 4 # Amour EDIT FROM 21 TO 4
- maxAngle: 10 # Amour EDIT FROM 32 TO 10
- fireRate: 5 # Amour EDIT FROM 6 TO 5
+ minAngle: 4 # WD
+ maxAngle: 10 # WD
+ fireRate: 5 # WD
selectedMode: FullAuto
soundGunshot:
path: /Audio/Weapons/Guns/Gunshots/atreides.ogg
diff --git a/Resources/Prototypes/_White/Catalog/Cargo/cargo_engines.yml b/Resources/Prototypes/_White/Catalog/Cargo/cargo_engines.yml
new file mode 100644
index 0000000000..db43028703
--- /dev/null
+++ b/Resources/Prototypes/_White/Catalog/Cargo/cargo_engines.yml
@@ -0,0 +1,19 @@
+- type: cargoProduct
+ id: EngineAmeShielding
+ icon:
+ sprite: Objects/Devices/flatpack.rsi
+ state: ame-part
+ product: CrateEngineeringAMEShielding
+ cost: 28000
+ category: cargoproduct-category-name-engineering
+ group: market
+
+- type: cargoProduct
+ id: EngineAmeControl
+ icon:
+ sprite: Structures/Power/Generation/ame.rsi
+ state: control
+ product: CrateEngineeringAMEControl
+ cost: 4000
+ category: cargoproduct-category-name-engineering
+ group: market