Skip to content

Commit

Permalink
по статистике, каждый 3-й житель империума - еретик (#641)
Browse files Browse the repository at this point in the history
## Описание PR
<!-- Что вы изменили в этом пулл реквесте? -->
черри-пикнуты пр-ы:
Goob-Station/Goob-Station#755
Goob-Station/Goob-Station#726
Goob-Station/Goob-Station#723
и добавлен перевод экшенов
## Почему / Баланс
<!-- Почему оно было изменено? Ссылайтесь на любые обсуждения или
вопросы здесь. Пожалуйста, обсудите, как это повлияет на игровой баланс.
-->
**Ссылка на публикацию в Discord**
<!-- Укажите ссылки на соответствующие обсуждения, проблемы, баги,
заказы в разработку или предложения
- [Технические проблемы](ссылка)
- [Баги](ссылка)
- [Заказы-разработка](ссылка)
- [Предложения](ссылка)
- [Перенос контента](ссылка)-->
чтоб еретикам жизнь малинок не казалась
## Техническая информация
<!-- Если речь идет об изменении кода, кратко изложите на высоком уровне
принцип работы нового кода. Это облегчает рецензирование.- -->

## Медиа
<!--
Пулл реквесты, которые вносят внутриигровые изменения (добавление
одежды, предметов, новых возможностей и т.д.), должны содержать медиа,
демонстрирующие изменения.
Небольшие исправления/рефакторы не требуют медиа.

Если Вы не уверены в том, что Ваш пулл реквест требует медиа, спросите
мейнтейнера.
-->

## Требования
<!--
В связи с наплывом ПР'ов нам необходимо убедиться, что ПР'ы следуют
правильным рекомендациям.

Пожалуйста, уделите время прочтению, если делаете пулл реквест (ПР)
впервые.

Отметьте поля ниже, чтобы подтвердить, что Вы действительно видели их
(поставьте X в скобках, например [X]):
-->
- [x] Я прочитал(а) и следую [Руководство по созданию пулл
реквестов](https://docs.spacestation14.com/en/general-development/codebase-info/pull-request-guidelines.html).
Я понимаю, что в противном случае мой ПР может быть закрыт по усмотрению
мейнтейнера.
- [x] Я добавил скриншоты/видео к этому пулл реквесту, демонстрирующие
его изменения в игре, **или** этот пулл реквест не требует демонстрации
в игре

## Критические изменения
<!--
Перечислите все критические изменения, включая изменения пространства
имён, публичных классов/методов/полей, переименования прототипов, и
предоставьте инструкции по их исправлению.
-->

**Чейнджлог**
<!--
Здесь Вы можете заполнить журнал изменений, который будет автоматически
добавлен в игру при мердже Вашего пулл реквест.

Чтобы игроки узнали о новых возможностях и изменениях, которые могут
повлиять на их игру, добавьте запись в журнал изменений.

Не считайте суффикс типа записи (например, add) "частью" предложения:
плохо: - add: новый инструмент для инженеров
хорошо: - add: добавлен новый инструмент для инженеров

Помещение имени после символа 🆑 изменит имя, которое будет
отображаться в журнале изменений (в противном случае будет
использоваться ваше имя пользователя GitHub).
Например: 🆑 AruMoon
-->


🆑 Ratyyy
- add: Древние боги перестали принимать в жертву случайных людей!
- tweak: Еретики научились грамотно выбирать ритуалы используя круговую
голограмму!
- tweak: Сила пустотного втягивания ослабла и теперь наносит только в 2
раза больше повреждений!
- fix: Еретики приняли решение стать более гуманными, и потому больше не
используют органы внутри тел для ритуалов!
  • Loading branch information
Ratyyy authored Oct 14, 2024
1 parent dceb662 commit d3684f5
Show file tree
Hide file tree
Showing 46 changed files with 932 additions and 230 deletions.
39 changes: 39 additions & 0 deletions Content.Client/ADT/Heretic/HereticRitualRuneBoundUserInterface.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using Content.Client.ADT.Heretic.UI;
using Content.Shared.ADT.Heretic.Components;
using Content.Shared.Heretic.Prototypes;
using Robust.Client.Graphics;
using Robust.Client.Input;
using Robust.Client.UserInterface;
using Robust.Shared.Prototypes;

namespace Content.Client.ADT.Heretic;

public sealed class HereticRitualRuneBoundUserInterface : BoundUserInterface
{
[Dependency] private readonly IClyde _displayManager = default!;
[Dependency] private readonly IInputManager _inputManager = default!;

private HereticRitualRuneRadialMenu? _hereticRitualMenu;

public HereticRitualRuneBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
{
IoCManager.InjectDependencies(this);
}

protected override void Open()
{
base.Open();

_hereticRitualMenu = this.CreateWindow<HereticRitualRuneRadialMenu>();
_hereticRitualMenu.SetEntity(Owner);
_hereticRitualMenu.SendHereticRitualRuneMessageAction += SendHereticRitualMessage;

var vpSize = _displayManager.ScreenSize;
_hereticRitualMenu.OpenCenteredAt(_inputManager.MouseScreenPosition.Position / vpSize);
}

private void SendHereticRitualMessage(ProtoId<HereticRitualPrototype> protoId)
{
SendMessage(new HereticRitualMessage(protoId));
}
}
13 changes: 13 additions & 0 deletions Content.Client/ADT/Heretic/UI/HereticRitualRuneRadialMenu.xaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<ui:RadialMenu xmlns="https://spacestation14.io"
xmlns:ui="clr-namespace:Content.Client.UserInterface.Controls"
BackButtonStyleClass="RadialMenuBackButton"
CloseButtonStyleClass="RadialMenuCloseButton"
VerticalExpand="True"
HorizontalExpand="True"
MinSize="450 450">

<!-- Main -->
<ui:RadialContainer Name="Main" VerticalExpand="True" HorizontalExpand="True" Radius="64" ReserveSpaceForHiddenChildren="False">
</ui:RadialContainer>

</ui:RadialMenu>
101 changes: 101 additions & 0 deletions Content.Client/ADT/Heretic/UI/HereticRitualRuneRadialMenu.xaml.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
using Content.Client.UserInterface.Controls;
using Content.Shared.Heretic;
using Content.Shared.Heretic.Prototypes;
using Robust.Client.GameObjects;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
using System.Numerics;

namespace Content.Client.ADT.Heretic.UI;

public sealed partial class HereticRitualRuneRadialMenu : RadialMenu
{
[Dependency] private readonly EntityManager _entityManager = default!;
[Dependency] private readonly IEntitySystemManager _entitySystem = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly ISharedPlayerManager _playerManager = default!;
private readonly SpriteSystem _spriteSystem;

public event Action<ProtoId<HereticRitualPrototype>>? SendHereticRitualRuneMessageAction;

public EntityUid Entity { get; set; }

public HereticRitualRuneRadialMenu()
{
IoCManager.InjectDependencies(this);
RobustXamlLoader.Load(this);
_spriteSystem = _entitySystem.GetEntitySystem<SpriteSystem>();
}

public void SetEntity(EntityUid uid)
{
Entity = uid;
RefreshUI();
}

private void RefreshUI()
{
var main = FindControl<RadialContainer>("Main");
if (main == null)
return;

var player = _playerManager.LocalEntity;

if (!_entityManager.TryGetComponent<HereticComponent>(player, out var heretic))
return;

foreach (var ritual in heretic.KnownRituals)
{
if (!_prototypeManager.TryIndex(ritual, out var ritualPrototype))
continue;

var button = new HereticRitualMenuButton
{
StyleClasses = { "RadialMenuButton" },
SetSize = new Vector2(64, 64),
ToolTip = Loc.GetString(ritualPrototype.Name),
ProtoId = ritualPrototype.ID
};

var texture = new TextureRect
{
VerticalAlignment = VAlignment.Center,
HorizontalAlignment = HAlignment.Center,
Texture = _spriteSystem.Frame0(ritualPrototype.Icon),
TextureScale = new Vector2(2f, 2f)
};

button.AddChild(texture);
main.AddChild(button);
}

AddHereticRitualMenuButtonOnClickAction(main);
}

private void AddHereticRitualMenuButtonOnClickAction(RadialContainer mainControl)
{
if (mainControl == null)
return;

foreach(var child in mainControl.Children)
{
var castChild = child as HereticRitualMenuButton;

if (castChild == null)
continue;

castChild.OnButtonUp += _ =>
{
SendHereticRitualRuneMessageAction?.Invoke(castChild.ProtoId);
Close();
};
}
}

public sealed class HereticRitualMenuButton : RadialMenuTextureButton
{
public ProtoId<HereticRitualPrototype> ProtoId { get; set; }
}
}
16 changes: 16 additions & 0 deletions Content.Client/ADT/Heretic/UI/LivingHeartMenu.xaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<ui:RadialMenu xmlns="https://spacestation14.io"
xmlns:ui="clr-namespace:Content.Client.UserInterface.Controls"
BackButtonStyleClass="RadialMenuBackButton"
CloseButtonStyleClass="RadialMenuCloseButton"
VerticalExpand="True"
HorizontalExpand="True"
MinSize="450 450">

<ui:RadialContainer Name="Main"
VerticalExpand="True"
HorizontalExpand="True"
Radius="64"
ReserveSpaceForHiddenChildren="False"/>


</ui:RadialMenu>
97 changes: 97 additions & 0 deletions Content.Client/ADT/Heretic/UI/LivingHeartMenu.xaml.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
using Content.Client.UserInterface.Controls;
using Content.Shared.Heretic;
using Robust.Client.Player;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes;
using System.Numerics;

namespace Content.Client.ADT.Heretic.UI;

public sealed partial class LivingHeartMenu : RadialMenu
{
[Dependency] private readonly EntityManager _ent = default!;
[Dependency] private readonly IPrototypeManager _prot = default!;
[Dependency] private readonly IPlayerManager _player = default!;

public EntityUid Entity { get; private set; }

public event Action<NetEntity>? SendActivateMessageAction;

public LivingHeartMenu()
{
IoCManager.InjectDependencies(this);
RobustXamlLoader.Load(this);
}

public void SetEntity(EntityUid ent)
{
Entity = ent;
UpdateUI();
}

private void UpdateUI()
{
var main = FindControl<RadialContainer>("Main");
if (main == null) return;

var player = _player.LocalEntity;

if (!_ent.TryGetComponent<HereticComponent>(player, out var heretic))
return;

foreach (var target in heretic.SacrificeTargets)
{
if (target == null) continue;

var ent = _ent.GetEntity(target);
if (ent == null)
continue;

var button = new EmbeddedEntityMenuButton
{
StyleClasses = { "RadialMenuButton" },
SetSize = new Vector2(64, 64),
ToolTip = _ent.TryGetComponent<MetaDataComponent>(ent.Value, out var md) ? md.EntityName : "Unknown",
NetEntity = (NetEntity) target,
};

var texture = new SpriteView(ent.Value, _ent)
{
OverrideDirection = Direction.South,
VerticalAlignment = VAlignment.Center,
SetSize = new Vector2(64, 64),
VerticalExpand = true,
Stretch = SpriteView.StretchMode.Fill,
};
button.AddChild(texture);

main.AddChild(button);
}
AddAction(main);
}

private void AddAction(RadialContainer main)
{
if (main == null)
return;

foreach (var child in main.Children)
{
var castChild = child as EmbeddedEntityMenuButton;
if (castChild == null)
continue;

castChild.OnButtonUp += _ =>
{
SendActivateMessageAction?.Invoke(castChild.NetEntity);
Close();
};
}
}

public sealed class EmbeddedEntityMenuButton : RadialMenuTextureButton
{
public NetEntity NetEntity;
}
}
34 changes: 34 additions & 0 deletions Content.Client/ADT/Heretic/UI/LivingHeartMenuBoundUserInterface.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using Content.Shared.Heretic;
using Robust.Client.Graphics;
using Robust.Client.Input;
using Robust.Client.UserInterface;

namespace Content.Client.ADT.Heretic.UI;

public sealed partial class LivingHeartMenuBoundUserInterface : BoundUserInterface
{
[Dependency] private readonly IClyde _displayManager = default!;
[Dependency] private readonly IInputManager _inputManager = default!;

[NonSerialized] private LivingHeartMenu? _menu;

public LivingHeartMenuBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
{
IoCManager.InjectDependencies(this);
}

protected override void Open()
{
base.Open();

_menu = this.CreateWindow<LivingHeartMenu>();
_menu.SetEntity(Owner);
_menu.SendActivateMessageAction += SendMessage;
_menu.OpenCenteredAt(_inputManager.MouseScreenPosition.Position / _displayManager.ScreenSize);
}

private void SendMessage(NetEntity netent)
{
base.SendMessage(new EventHereticLivingHeartActivate() { Target = netent });
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,11 @@ private void OnVolcano(Entity<HereticComponent> ent, ref EventHereticVolcanoBlas
return;

var ignoredTargets = new List<EntityUid>();

// all ghouls are immune to heretic shittery
foreach (var e in EntityQuery<GhoulComponent>())
ignoredTargets.Add(e.Owner);

// all heretics with the same path are also immune
foreach (var e in EntityQuery<HereticComponent>())
if (e.CurrentPath == ent.Comp.CurrentPath)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,9 @@ private void OnFleshSurgery(Entity<HereticComponent> ent, ref EventHereticFleshS
}
private void OnFleshSurgeryDoAfter(Entity<HereticComponent> ent, ref EventHereticFleshSurgeryDoAfter args)
{
if (args.Cancelled)
return;

if (args.Target == null) // shouldn't really happen. just in case
return;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ private void OnVoidPull(Entity<HereticComponent> ent, ref HereticVoidPullEvent a
// damage closest ones
foreach (var pookie in topPriority)
if (TryComp<DamageableComponent>(pookie, out var dmg))
_dmg.SetAllDamage(pookie, dmg, dmg.TotalDamage + .5f);
_dmg.SetAllDamage(pookie, dmg, dmg.TotalDamage + .2f);

// stun close-mid range
foreach (var pookie in midPriority)
Expand Down
Loading

0 comments on commit d3684f5

Please sign in to comment.