Skip to content

Commit

Permalink
Speech is relayed by holopad holograms (#33978) (#2631)
Browse files Browse the repository at this point in the history
* Initial commit

* Corrected a field attribute

Co-authored-by: chromiumboy <[email protected]>
  • Loading branch information
deltanedas and chromiumboy authored Jan 6, 2025
1 parent f6edc6b commit 27bfa35
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 10 deletions.
16 changes: 12 additions & 4 deletions Content.Server/Holopad/HolopadSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using Content.Shared.IdentityManagement;
using Content.Shared.Labels.Components;
using Content.Shared.Silicons.StationAi;
using Content.Shared.Speech;
using Content.Shared.Telephone;
using Content.Shared.UserInterface;
using Content.Shared.Verbs;
Expand Down Expand Up @@ -524,16 +525,23 @@ private void GenerateHologram(Entity<HolopadComponent> entity)
entity.Comp.HologramProtoId == null)
return;

var uid = Spawn(entity.Comp.HologramProtoId, Transform(entity).Coordinates);
var hologramUid = Spawn(entity.Comp.HologramProtoId, Transform(entity).Coordinates);

// Safeguard - spawned holograms must have this component
if (!TryComp<HolopadHologramComponent>(uid, out var component))
if (!TryComp<HolopadHologramComponent>(hologramUid, out var holopadHologram))
{
Del(uid);
Del(hologramUid);
return;
}

entity.Comp.Hologram = new Entity<HolopadHologramComponent>(uid, component);
entity.Comp.Hologram = new Entity<HolopadHologramComponent>(hologramUid, holopadHologram);

// Relay speech preferentially through the hologram
if (TryComp<SpeechComponent>(hologramUid, out var hologramSpeech) &&
TryComp<TelephoneComponent>(entity, out var entityTelephone))
{
_telephoneSystem.SetSpeakerForTelephone((entity, entityTelephone), (hologramUid, hologramSpeech));
}
}

private void DeleteHologram(Entity<HolopadHologramComponent> hologram, Entity<HolopadComponent> attachedHolopad)
Expand Down
16 changes: 12 additions & 4 deletions Content.Server/Telephone/TelephoneSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,14 +105,17 @@ private void OnTelephoneMessageReceived(Entity<TelephoneComponent> entity, ref T
var nameEv = new TransformSpeakerNameEvent(args.MessageSource, Name(args.MessageSource));
RaiseLocalEvent(args.MessageSource, nameEv);

var name = Loc.GetString("speech-name-relay",
("speaker", Name(entity)),
("originalName", nameEv.VoiceName));
// Determine if speech should be relayed via the telephone itself or a designated speaker
var speaker = entity.Comp.Speaker != null ? entity.Comp.Speaker.Value.Owner : entity.Owner;

var name = Loc.GetString("chat-telephone-name-relay",
("originalName", nameEv.VoiceName),
("speaker", Name(speaker)));

var range = args.TelephoneSource.Comp.LinkedTelephones.Count > 1 ? ChatTransmitRange.HideChat : ChatTransmitRange.GhostRangeLimit;
var volume = entity.Comp.SpeakerVolume == TelephoneVolume.Speak ? InGameICChatType.Speak : InGameICChatType.Whisper;

_chat.TrySendInGameICMessage(entity, args.Message, volume, range, nameOverride: name, checkRadioPrefix: false);
_chat.TrySendInGameICMessage(speaker, args.Message, volume, range, nameOverride: name, checkRadioPrefix: false);
}

#endregion
Expand Down Expand Up @@ -412,6 +415,11 @@ private void SetTelephoneMicrophoneState(Entity<TelephoneComponent> entity, bool
}
}

public void SetSpeakerForTelephone(Entity<TelephoneComponent> entity, Entity<SpeechComponent>? speaker)
{
entity.Comp.Speaker = speaker;
}

private (string?, string?) GetNameAndJobOfCallingEntity(EntityUid uid)
{
string? presumedName = null;
Expand Down
11 changes: 9 additions & 2 deletions Content.Shared/Telephone/TelephoneComponent.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Content.Shared.Chat;
using Content.Shared.Speech;
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
using Robust.Shared.Serialization;
Expand Down Expand Up @@ -92,6 +93,12 @@ public sealed partial class TelephoneComponent : Component
[DataField]
public bool UnlistedNumber = false;

/// <summary>
/// Speech is relayed through this entity instead of the telephone
/// </summary>
[ViewVariables(VVAccess.ReadOnly)]
public Entity<SpeechComponent>? Speaker = null;

/// <summary>
/// Telephone number for this device
/// </summary>
Expand Down Expand Up @@ -183,7 +190,7 @@ public record struct TelephoneCallEndedEvent();
public struct TelephoneCallOptions
{
public bool IgnoreRange; // The source can always reach its target
public bool ForceConnect; // The source immediately starts a call with the receiver, potentially interrupting a call that is already in progress
public bool ForceConnect; // The source immediately starts a call with the receiver, potentially interrupting a call that is already in progress
public bool ForceJoin; // The source smoothly joins a call in progress, or starts a normal call with the receiver if there is none
public bool MuteSource; // Chatter from the source is not transmitted - could be used for eavesdropping when combined with 'ForceJoin'
public bool MuteReceiver; // Chatter from the receiver is not transmitted - useful for broadcasting messages to multiple receivers
Expand Down Expand Up @@ -215,7 +222,7 @@ public enum TelephoneVolume : byte
[Serializable, NetSerializable]
public enum TelephoneRange : byte
{
Grid, // Can only reach telephones that are on the same grid
Grid, // Can only reach telephones that are on the same grid
Map, // Can reach any telephone that is on the same map
Unlimited, // Can reach any telephone, across any distance
}
3 changes: 3 additions & 0 deletions Resources/Locale/en-US/telephone/telephone.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,6 @@ chat-telephone-caller-id-with-job = [color={$color}][font={$fontType} size={$fon
chat-telephone-caller-id-without-job = [color={$color}][font={$fontType} size={$fontSize}][bold]{CAPITALIZE($callerName)}[/bold][/font][/color]
chat-telephone-unknown-device = [color={$color}][font={$fontType} size={$fontSize}][bolditalic]Unknown source[/bolditalic][/font][/color]
chat-telephone-device-id = [color={$color}][font={$fontType} size={$fontSize}][bold]{CAPITALIZE($deviceName)}[/bold][/font][/color]
# Chat text
chat-telephone-name-relay = {$originalName} ({$speaker})
5 changes: 5 additions & 0 deletions Resources/Prototypes/Entities/Structures/Machines/holopad.yml
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@
# These are spawned by holopads
- type: entity
id: HolopadHologram
name: hologram
categories: [ HideSpawnMenu ]
suffix: DO NOT MAP
components:
Expand All @@ -163,6 +164,10 @@
- type: Appearance
- type: TypingIndicator
proto: robot
- type: Speech
speechVerb: Robotic
speechSounds: Borg
speechBubbleOffset: 0.45
- type: HolopadHologram
rsiPath: Structures/Machines/holopad.rsi
rsiState: icon_in_call
Expand Down

0 comments on commit 27bfa35

Please sign in to comment.