-
Notifications
You must be signed in to change notification settings - Fork 55
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
## Описание PR <!-- Что вы изменили в этом пулл реквесте? --> Добавлен кассетный проигрыватель. Он позволяет записывать разговоры. ура? ## Почему / Баланс <!-- Почему оно было изменено? Ссылайтесь на любые обсуждения или вопросы здесь. Пожалуйста, обсудите, как это повлияет на игровой баланс. --> Иллюми попросил **Ссылка на публикацию в Discord** <!-- Укажите ссылки на соответствующие обсуждения, проблемы, баги, заказы в разработку или предложения - [Технические проблемы](ссылка) - [Баги](ссылка) - [Заказы-разработка](ссылка) - [Предложения](ссылка) - [Перенос контента](ссылка)--> Всё, кроме поддержки барков и ТТСа, взято с space-wizards/space-station-14#32234 ## Техническая информация <!-- Если речь идет об изменении кода, кратко изложите на высоком уровне принцип работы нового кода. Это облегчает рецензирование.- --> ничего из существующего не менялось ## Медиа <!-- Пулл реквесты, которые вносят внутриигровые изменения (добавление одежды, предметов, новых возможностей и т.д.), должны содержать медиа, демонстрирующие изменения. Небольшие исправления/рефакторы не требуют медиа. Если Вы не уверены в том, что Ваш пулл реквест требует медиа, спросите мейнтейнера. --> ## Требования <!-- В связи с наплывом ПР'ов нам необходимо убедиться, что ПР'ы следуют правильным рекомендациям. Пожалуйста, уделите время прочтению, если делаете пулл реквест (ПР) впервые. Отметьте поля ниже, чтобы подтвердить, что Вы действительно видели их (поставьте X в скобках, например [X]): --> - [ ] Я прочитал(а) и следую [Руководство по созданию пулл реквестов](https://docs.spacestation14.com/en/general-development/codebase-info/pull-request-guidelines.html). Я понимаю, что в противном случае мой ПР может быть закрыт по усмотрению мейнтейнера. - [ ] Я добавил скриншоты/видео к этому пулл реквесту, демонстрирующие его изменения в игре, **или** этот пулл реквест не требует демонстрации в игре ## Критические изменения <!-- Перечислите все критические изменения, включая изменения пространства имён, публичных классов/методов/полей, переименования прототипов, и предоставьте инструкции по их исправлению. --> **Чейнджлог** <!-- Здесь Вы можете заполнить журнал изменений, который будет автоматически добавлен в игру при мердже Вашего пулл реквест. Чтобы игроки узнали о новых возможностях и изменениях, которые могут повлиять на их игру, добавьте запись в журнал изменений. Не считайте суффикс типа записи (например, add) "частью" предложения: плохо: - add: новый инструмент для инженеров хорошо: - add: добавлен новый инструмент для инженеров Помещение имени после символа 🆑 изменит имя, которое будет отображаться в журнале изменений (в противном случае будет использоваться ваше имя пользователя GitHub). Например: 🆑 AruMoon --> 🆑 Котя - add: Добавлен кассетный проигрыватель! --------- Co-authored-by: Schrödinger <[email protected]> Co-authored-by: Jungar <[email protected]>
- Loading branch information
1 parent
e9cc76a
commit 2ba0ea6
Showing
44 changed files
with
1,564 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
using Content.Shared.TapeRecorder; | ||
|
||
namespace Content.Client.TapeRecorder; | ||
|
||
/// <summary> | ||
/// Required for client side prediction stuff | ||
/// </summary> | ||
public sealed class TapeRecorderSystem : SharedTapeRecorderSystem | ||
{ | ||
private TimeSpan _lastTickTime = TimeSpan.Zero; | ||
|
||
public override void Update(float frameTime) | ||
{ | ||
if (!Timing.IsFirstTimePredicted) | ||
return; | ||
|
||
//We need to know the exact time period that has passed since the last update to ensure the tape position is sync'd with the server | ||
//Since the client can skip frames when lagging, we cannot use frameTime | ||
var realTime = (float) (Timing.CurTime - _lastTickTime).TotalSeconds; | ||
_lastTickTime = Timing.CurTime; | ||
|
||
base.Update(realTime); | ||
} | ||
} |
64 changes: 64 additions & 0 deletions
64
Content.Client/ADT/TapeRecorder/Ui/TapeRecorderBoundUserInterface.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
using Content.Shared.TapeRecorder.Components; | ||
using Content.Shared.TapeRecorder.Events; | ||
using Robust.Shared.Prototypes; | ||
using Robust.Shared.Timing; | ||
|
||
namespace Content.Client.ADT.TapeRecorder.Ui; | ||
|
||
public sealed class TapeRecorderBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey) | ||
{ | ||
[Dependency] private readonly IEntityManager _entMan = default!; | ||
|
||
[ViewVariables] | ||
private TapeRecorderWindow? _window; | ||
|
||
[ViewVariables] | ||
private TimeSpan _printCooldown; | ||
|
||
protected override void Open() | ||
{ | ||
base.Open(); | ||
|
||
_window = new(_entMan, Owner); | ||
_window.OnClose += Close; | ||
_window.OnModeChanged += ChangeMode; | ||
_window.OnPrintTranscript += PrintTranscript; | ||
_window.OpenCentered(); | ||
} | ||
|
||
private void ChangeMode(TapeRecorderMode mode) | ||
{ | ||
SendMessage(new ChangeModeTapeRecorderMessage(mode)); | ||
} | ||
|
||
private void PrintTranscript() | ||
{ | ||
SendMessage(new PrintTapeRecorderMessage()); | ||
|
||
_window?.UpdatePrint(true); | ||
|
||
Timer.Spawn(_printCooldown, () => | ||
{ | ||
_window?.UpdatePrint(false); | ||
}); | ||
} | ||
|
||
protected override void UpdateState(BoundUserInterfaceState state) | ||
{ | ||
base.UpdateState(state); | ||
|
||
if (state is not TapeRecorderState cast) | ||
return; | ||
|
||
_printCooldown = cast.PrintCooldown; | ||
|
||
_window?.UpdateState(cast); | ||
} | ||
|
||
protected override void Dispose(bool disposing) | ||
{ | ||
base.Dispose(disposing); | ||
if (disposing) | ||
_window?.Dispose(); | ||
} | ||
} |
23 changes: 23 additions & 0 deletions
23
Content.Client/ADT/TapeRecorder/Ui/TapeRecorderWindow.xaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
<controls:FancyWindow | ||
xmlns="https://spacestation14.io" | ||
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" | ||
MinSize="440 220" | ||
SetSize="440 220" | ||
Title="{Loc 'tape-recorder-menu-title'}" | ||
Resizable="False"> | ||
<BoxContainer Margin = "10 5" Orientation="Vertical" SeparationOverride="5"> | ||
<BoxContainer Orientation="Vertical"> | ||
<Label Margin = "5 0" Name="CassetteLabel" Text="{Loc 'tape-recorder-menu-no-cassette-label'}" Align="Left" StyleClasses="StatusFieldTitle" /> | ||
<Slider Name="PlaybackSlider" HorizontalExpand="True" /> | ||
</BoxContainer> | ||
<BoxContainer Name ="Test" Margin = "0 5 0 0" Orientation="Horizontal" VerticalExpand = "True"> | ||
<BoxContainer Orientation="Vertical" HorizontalExpand = "True"> | ||
<Label Text="{Loc 'tape-recorder-menu-controls-label'}" Align="Center" /> | ||
<BoxContainer Name="Buttons" Orientation="Horizontal" VerticalExpand="True" Align="Center"/> <!-- Populated in constructor --> | ||
</BoxContainer> | ||
</BoxContainer> | ||
<BoxContainer Margin = "0 2 0 0" Orientation="Horizontal"> | ||
<Button Name="PrintButton" Text="{Loc 'tape-recorder-menu-print-button'}" TextAlign="Center" HorizontalExpand ="True"/> | ||
</BoxContainer> | ||
</BoxContainer> | ||
</controls:FancyWindow> |
133 changes: 133 additions & 0 deletions
133
Content.Client/ADT/TapeRecorder/Ui/TapeRecorderWindow.xaml.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,133 @@ | ||
using Content.Client.UserInterface.Controls; | ||
using Content.Shared.Shuttles.Components; | ||
using Content.Shared.TapeRecorder.Components; | ||
using Content.Shared.TapeRecorder.Events; | ||
using Robust.Client.AutoGenerated; | ||
using Robust.Client.UserInterface.Controls; | ||
using Robust.Client.UserInterface.XAML; | ||
using Robust.Shared.Timing; | ||
|
||
namespace Content.Client.ADT.TapeRecorder.Ui; | ||
|
||
[GenerateTypedNameReferences] | ||
public sealed partial class TapeRecorderWindow : FancyWindow | ||
{ | ||
private IEntityManager _entMan; | ||
|
||
private EntityUid _owner; | ||
private bool _onCooldown; | ||
private bool _hasCasette; | ||
private TapeRecorderMode _mode = TapeRecorderMode.Stopped; | ||
|
||
private RadioOptions<TapeRecorderMode> _options = default!; | ||
private bool _updating; | ||
|
||
public Action<TapeRecorderMode>? OnModeChanged; | ||
public Action? OnPrintTranscript; | ||
|
||
public TapeRecorderWindow(IEntityManager entMan, EntityUid owner) | ||
{ | ||
RobustXamlLoader.Load(this); | ||
IoCManager.InjectDependencies(this); | ||
|
||
_entMan = entMan; | ||
|
||
_owner = owner; | ||
|
||
_options = new RadioOptions<TapeRecorderMode>(RadioOptionsLayout.Horizontal); | ||
Buttons.AddChild(_options); | ||
_options.FirstButtonStyle = "OpenRight"; | ||
_options.LastButtonStyle = "OpenLeft"; | ||
_options.ButtonStyle = "OpenBoth"; | ||
foreach (var mode in Enum.GetValues<TapeRecorderMode>()) | ||
{ | ||
var name = mode.ToString().ToLower(); | ||
_options.AddItem(Loc.GetString($"tape-recorder-menu-{name}-button"), mode); | ||
} | ||
|
||
_options.OnItemSelected += args => | ||
{ | ||
if (_updating) // don't tell server to change mode to the mode it told us | ||
return; | ||
args.Button.Select(args.Id); | ||
var mode = args.Button.SelectedValue; | ||
OnModeChanged?.Invoke(mode); | ||
}; | ||
|
||
PrintButton.OnPressed += _ => OnPrintTranscript?.Invoke(); | ||
|
||
SetEnabled(TapeRecorderMode.Recording, false); | ||
SetEnabled(TapeRecorderMode.Playing, false); | ||
SetEnabled(TapeRecorderMode.Rewinding, false); | ||
} | ||
|
||
private void SetSlider(float maxTime, float currentTime) | ||
{ | ||
PlaybackSlider.Disabled = true; | ||
PlaybackSlider.MaxValue = maxTime; | ||
PlaybackSlider.Value = currentTime; | ||
} | ||
|
||
public void UpdatePrint(bool disabled) | ||
{ | ||
PrintButton.Disabled = disabled; | ||
_onCooldown = disabled; | ||
} | ||
|
||
public void UpdateState(TapeRecorderState state) | ||
{ | ||
if (!_entMan.TryGetComponent<TapeRecorderComponent>(_owner, out var comp)) | ||
return; | ||
|
||
_mode = comp.Mode; // TODO: update UI on handling state instead of adding UpdateUI to everything | ||
_hasCasette = state.HasCasette; | ||
|
||
_updating = true; | ||
|
||
CassetteLabel.Text = _hasCasette | ||
? Loc.GetString("tape-recorder-menu-cassette-label", ("cassetteName", state.CassetteName)) | ||
: Loc.GetString("tape-recorder-menu-no-cassette-label"); | ||
|
||
// Select the currently used mode | ||
_options.SelectByValue(_mode); | ||
|
||
// When tape is ejected or a button can't be used, disable it | ||
// Server will change to paused once a tape is inactive | ||
var tapeLeft = state.CurrentTime < state.MaxTime; | ||
SetEnabled(TapeRecorderMode.Recording, tapeLeft); | ||
SetEnabled(TapeRecorderMode.Playing, tapeLeft); | ||
SetEnabled(TapeRecorderMode.Rewinding, state.CurrentTime > float.Epsilon); | ||
|
||
if (state.HasCasette) | ||
SetSlider(state.MaxTime, state.CurrentTime); | ||
|
||
_updating = false; | ||
} | ||
|
||
private void SetEnabled(TapeRecorderMode mode, bool condition) | ||
{ | ||
_options.SetItemDisabled((int) mode, !(_hasCasette && condition)); | ||
} | ||
|
||
protected override void FrameUpdate(FrameEventArgs args) | ||
{ | ||
base.FrameUpdate(args); | ||
|
||
if (!_entMan.HasComponent<ActiveTapeRecorderComponent>(_owner)) | ||
return; | ||
|
||
if (!_entMan.TryGetComponent<TapeRecorderComponent>(_owner, out var comp)) | ||
return; | ||
|
||
if (_mode != comp.Mode) | ||
{ | ||
_mode = comp.Mode; | ||
_options.SelectByValue(_mode); | ||
} | ||
|
||
var speed = _mode == TapeRecorderMode.Rewinding | ||
? -comp.RewindSpeed | ||
: 1f; | ||
PlaybackSlider.Value += args.DeltaSeconds * speed; | ||
} | ||
} |
22 changes: 22 additions & 0 deletions
22
Content.Server/ADT/Bark/Systems/VoiceOverrideSystem.Barks.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
using Content.Shared.Chat; | ||
using Content.Server.Speech.Components; | ||
using Content.Shared.ADT.SpeechBarks; | ||
|
||
namespace Content.Server.Speech.EntitySystems; | ||
|
||
public sealed partial class VoiceOverrideSystem | ||
{ | ||
private void InitializeBarks() | ||
{ | ||
SubscribeLocalEvent<VoiceOverrideComponent, TransformSpeakerBarkEvent>(OnTransformSpeakerBark); | ||
} | ||
|
||
private void OnTransformSpeakerBark(Entity<VoiceOverrideComponent> entity, ref TransformSpeakerBarkEvent args) | ||
{ | ||
if (!entity.Comp.Enabled) | ||
return; | ||
|
||
args.Sound = entity.Comp.BarkSound ?? args.Sound; | ||
args.Pitch = entity.Comp.BarkPitch ?? args.Pitch; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
using Content.Shared.Chat; | ||
using Content.Server.Speech.Components; | ||
using Content.Shared.ADT.SpeechBarks; | ||
using Content.Shared.Corvax.TTS; | ||
|
||
namespace Content.Server.Speech.EntitySystems; | ||
|
||
public sealed partial class VoiceOverrideSystem | ||
{ | ||
private void InitializeTTS() | ||
{ | ||
SubscribeLocalEvent<VoiceOverrideComponent, TransformSpeakerVoiceEvent>(OnTransformSpeakerVoice); | ||
} | ||
|
||
private void OnTransformSpeakerVoice(Entity<VoiceOverrideComponent> entity, ref TransformSpeakerVoiceEvent args) | ||
{ | ||
if (!entity.Comp.Enabled) | ||
return; | ||
|
||
args.VoiceId = entity.Comp.TTS ?? args.VoiceId; | ||
} | ||
} |
Oops, something went wrong.