Refactor guard bell (#1553)

* Remove maps edits

* fix from review

* Remove unused CP14 alert levels (fixing YAML)

* fix missing prototype CP14GuardBell

* fix from review 2

* fix TriggerSystem partial

---------

Co-authored-by: Jordan FUMA <@jfa>
This commit is contained in:
Kryyto
2025-07-26 14:09:04 +02:00
committed by GitHub
parent 6ff39a79e2
commit 23ce52c69e
26 changed files with 174 additions and 244 deletions

View File

@@ -1,55 +0,0 @@
using Content.Shared.CCVar;
using Content.Shared.Chat;
using Content.Shared.Communications;
using Robust.Client.UserInterface;
using Robust.Shared.Configuration;
using Robust.Shared.Timing;
namespace Content.Client._CP14.UserInterface
{
public sealed class GuardBellBoundUserInterface : BoundUserInterface
{
[Dependency] private readonly IConfigurationManager _cfg = default!;
[ViewVariables]
private GuardBellMenu? _menu;
public GuardBellBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
{
}
protected override void Open()
{
base.Open();
_menu = this.CreateWindow<GuardBellMenu>();
_menu.OnAlertLevel += AlertLevelSelected;
}
public void AlertLevelSelected(string level)
{
if (_menu!.AlertLevelSelectable)
{
_menu.CurrentLevel = level;
SendMessage(new CommunicationsConsoleSelectAlertLevelMessage(level));
}
}
protected override void UpdateState(BoundUserInterfaceState state)
{
base.UpdateState(state);
if (state is not CommunicationsConsoleInterfaceState commsState)
return;
if (_menu != null)
{
_menu.AlertLevelSelectable = commsState.AlertLevels != null && !float.IsNaN(commsState.CurrentAlertDelay) && commsState.CurrentAlertDelay <= 0;
_menu.CurrentLevel = commsState.CurrentAlert;
_menu.UpdateAlertLevels(commsState.AlertLevels, _menu.CurrentLevel);
_menu.AlertLevelButton.Disabled = !_menu.AlertLevelSelectable;
}
}
}
}

View File

@@ -1,28 +0,0 @@
<controls:FancyWindow xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
Title="{Loc 'cp14-guard-bell-menu-title'}"
MinSize="200 100">
<!-- Main Container -->
<BoxContainer Orientation="Vertical"
HorizontalExpand="False"
VerticalExpand="True"
Margin="6 6 6 5">
<!-- ButtonsPart -->
<BoxContainer Orientation="Vertical"
VerticalAlignment="Bottom"
SeparationOverride="4">
<!-- AnnouncePart -->
<BoxContainer Orientation="Vertical"
Margin="0 2">
<OptionButton Name="AlertLevelButton"
Access="Public"
ToolTip="{Loc 'cp14-guard-bell-alert-button'}"
StyleClasses="OpenRight"/>
</BoxContainer>
</BoxContainer>
</BoxContainer>
</controls:FancyWindow>

View File

@@ -1,86 +0,0 @@
using System.Globalization;
using Content.Client.UserInterface.Controls;
using Content.Shared.CCVar;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Configuration;
using Robust.Shared.Timing;
using Robust.Shared.Utility;
namespace Content.Client._CP14.UserInterface
{
[GenerateTypedNameReferences]
public sealed partial class GuardBellMenu : FancyWindow
{
[Dependency] private readonly IConfigurationManager _cfg = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly ILocalizationManager _loc = default!;
public bool AlertLevelSelectable;
public string CurrentLevel = string.Empty;
public event Action<string>? OnAlertLevel;
public GuardBellMenu()
{
IoCManager.InjectDependencies(this);
RobustXamlLoader.Load(this);
AlertLevelButton.OnItemSelected += args =>
{
var metadata = AlertLevelButton.GetItemMetadata(args.Id);
if (metadata != null && metadata is string cast)
{
OnAlertLevel?.Invoke(cast);
}
};
AlertLevelButton.Disabled = !AlertLevelSelectable;
}
protected override void FrameUpdate(FrameEventArgs args)
{
base.FrameUpdate(args);
}
// The current alert could make levels unselectable, so we need to ensure that the UI reacts properly.
// If the current alert is unselectable, the only item in the alerts list will be
// the current alert. Otherwise, it will be the list of alerts, with the current alert
// selected.
public void UpdateAlertLevels(List<string>? alerts, string currentAlert)
{
AlertLevelButton.Clear();
if (alerts == null)
{
var name = currentAlert;
if (_loc.TryGetString($"cp14-alert-level-{currentAlert}", out var locName))
{
name = locName;
}
AlertLevelButton.AddItem(name);
AlertLevelButton.SetItemMetadata(AlertLevelButton.ItemCount - 1, currentAlert);
}
else
{
foreach (var alert in alerts)
{
var name = alert;
if (_loc.TryGetString($"cp14-alert-level-{alert}", out var locName))
{
name = locName;
}
AlertLevelButton.AddItem(name);
AlertLevelButton.SetItemMetadata(AlertLevelButton.ItemCount - 1, alert);
if (alert == currentAlert)
{
AlertLevelButton.Select(AlertLevelButton.ItemCount - 1);
}
}
}
}
}
}

View File

@@ -18,8 +18,7 @@ public sealed class AlertLevelSystem : EntitySystem
[Dependency] private readonly StationSystem _stationSystem = default!;
// Until stations are a prototype, this is how it's going to have to be.
// public const string DefaultAlertLevelSet = "stationAlerts"; // OLD VANILA. Changed by CP14.
public const string DefaultAlertLevelSet = "CP14TownAlerts";
public const string DefaultAlertLevelSet = "stationAlerts";
public override void Initialize()
{
@@ -185,8 +184,7 @@ public sealed class AlertLevelSystem : EntitySystem
}
// The full announcement to be spat out into chat.
// var announcementFull = Loc.GetString("alert-level-announcement", ("name", name), ("announcement", announcement)); // OLD VANILA. Changed by CP14.
var announcementFull = Loc.GetString("cp14-alert-level-announcement", ("name", name), ("announcement", announcement));
var announcementFull = Loc.GetString("alert-level-announcement", ("name", name), ("announcement", announcement));
var playDefault = false;
if (playSound)

View File

@@ -95,6 +95,7 @@ namespace Content.Server.Explosion.EntitySystems
InitializeTimedCollide();
InitializeVoice();
InitializeMobstate();
InitializeDamageReceived(); //CP14 trigger on damage partial
SubscribeLocalEvent<TriggerOnSpawnComponent, MapInitEvent>(OnSpawnTriggered);
SubscribeLocalEvent<TriggerOnCollideComponent, StartCollideEvent>(OnTriggerCollide);

View File

@@ -0,0 +1,7 @@
namespace Content.Server.Explosion.Components;
/// <summary>
/// Triggers when the entity is damaged.
/// </summary>
[RegisterComponent]
public sealed partial class CP14TriggerOnDamageReceivedComponent : Component { }

View File

@@ -0,0 +1,20 @@
using Content.Server.Explosion.Components;
using Content.Shared.Damage;
namespace Content.Server.Explosion.EntitySystems;
public sealed partial class TriggerSystem
{
private void InitializeDamageReceived()
{
SubscribeLocalEvent<CP14TriggerOnDamageReceivedComponent, DamageChangedEvent>(OnDamageReceived);
}
private void OnDamageReceived(EntityUid uid, CP14TriggerOnDamageReceivedComponent component, DamageChangedEvent args)
{
if (!args.DamageIncreased)
return;
Trigger(uid);
}
}

View File

@@ -1,16 +1,21 @@
# Attempted to keep the files in alphabetical order so its easier to audit.
# Finding individual authors is an unfeasible task. If you can reference the author please do so.
- files: ["safe-alert.ogg"]
license: "CC-BY-4.0"
copyright: "Created by kevp888"
source: "https://freesound.org/s/688445"
- files: ["doom-bell-short.ogg"]
license: "CC-BY-NC-3.0"
copyright: "Created by Ev-Dawg"
source: "https://freesound.org/s/335991"
- files: ["minor-alert.ogg"]
- files: ["minor-alert-short.ogg"]
license: "CC0-1.0"
copyright: "Created by Horrormarkus"
source: "https://freesound.org/s/659672"
- files: ["major-alert.ogg"]
- files: ["major-alert-short.ogg"]
license: "CC0-1.0"
copyright: "Created by Aeonomi"
source: "https://freesound.org/s/180329"
- files: ["scary-bell-short.ogg"]
license: "CC-BY-NC-4.0"
copyright: "Created by WesleyExtremeGamer"
source: "https://freesound.org/s/530340"

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,10 +0,0 @@
cp14-alert-level-announcement = Attention! Towns threat level is now {$name}! {$announcement}
cp14-alert-level-safe = Safe
cp14-alert-level-safe-announcement = There is no threat to the town. Town folk may return to their duties safely.
cp14-alert-level-minor = Minor
cp14-alert-level-minor-announcement = There is a minor threat to the town. Townsfolk should return to the town for their own safety. Guards are to be at their posts armed and combat ready.
cp14-alert-level-major = Major
cp14-alert-level-major-announcement = There is a major threat to the town. Everyone must return to the town and protect it.

View File

@@ -1,2 +0,0 @@
cp14-guard-bell-menu-title = Guard Bell
cp14-guard-bell-alert-button = Change the towns threat level.

View File

@@ -1,10 +0,0 @@
cp14-alert-level-announcement = Внимание! Уровень угрозы города теперь { $name }! { $announcement }
cp14-alert-level-safe = Безопасно
cp14-alert-level-safe-announcement = Угрозы городу нет. Горожане могут спокойно вернуться к своим обязанностям.
cp14-alert-level-minor = Незначительная угроза
cp14-alert-level-minor-announcement = Городу предстоит небольшая угроза. Горожанам рекомендуется быть внимательными и не покидать пределы города в темное время суток. Стража должна находиться на своих постах вооруженными и готовыми к бою.
cp14-alert-level-major = Большая угроза
cp14-alert-level-major-announcement = Городу предстоит большая угроза! Призываем всех жителей объединиться и подготовиться к защите своих домов и семей.

View File

@@ -1,2 +0,0 @@
cp14-guard-bell-menu-title = Колокол стражи
cp14-guard-bell-alert-button = Изменяет уровень угрозы города.

View File

@@ -1,23 +0,0 @@
- type: alertLevels
id: CP14TownAlerts
defaultLevel: safe
levels:
safe:
announcement: cp14-alert-level-safe-announcement
sound: /Audio/_CP14/Misc/safe-alert.ogg
color: Green
emergencyLightColor: LawnGreen
shuttleTime: 600
minor:
announcement: cp14-alert-level-minor-announcement
sound: /Audio/_CP14/Misc/minor-alert.ogg
color: DodgerBlue
emergencyLightColor: DodgerBlue
shuttleTime: 600
major:
announcement: cp14-alert-level-major-announcement
sound: /Audio/_CP14/Misc/major-alert.ogg
color: Red
emergencyLightColor: Red
shuttleTime: 600

View File

@@ -5,7 +5,7 @@
- BaseStation
- BaseStationAllEventsEligible
- BaseStationJobsSpawning
- CP14BaseTownAlerts
- BaseStationAlertLevels
- BaseStationRecords # Required for lobby manifest + cryo leave
- CP14BaseStationCommonObjectives
- CP14BaseStationDemiplaneMap
@@ -18,13 +18,6 @@
components:
- type: CP14StationCommonObjectives
- type: entity
id: CP14BaseTownAlerts
abstract: true
components:
- type: AlertLevel
alertLevelPrototype: CP14TownAlerts
- type: entity
id: CP14BaseStationDemiplaneMap
abstract: true

View File

@@ -1,9 +1,10 @@
- type: entity
parent: BaseStructure
id: CP14GuardBell
id: CP14BaseGuardBell
name: guard bell
description: A strong bell to alert the entire settlement of a possible threat.
categories: [ ForkFiltered ]
abstract: true
components:
- type: Sprite
drawdepth: Mobs
@@ -12,11 +13,123 @@
sprite: _CP14/Structures/Specific/Guard/guard_bell.rsi
layers:
- state: base
- type: ActivatableUI
key: enum.CommunicationsConsoleUiKey.Key
- type: CommunicationsConsole
title: cp14-guard-bell-menu-title
- type: UserInterface
interfaces:
enum.CommunicationsConsoleUiKey.Key:
type: GuardBellBoundUserInterface
- type: Damageable
damageContainer: Inorganic
- type: TriggerOnActivate
- type: CP14TriggerOnDamageReceived
- type: SpawnOnTrigger
proto: GuardBellEffect1
- type: UseDelay
delay: 2.0
- type: entity
id: CP14GuardBell
parent: CP14BaseGuardBell
components:
- type: Sprite
layers:
- state: base
- type: SpawnOnTrigger
proto: CP14GuardBellEffect1
- type: entity
id: CP14GuardBell2
parent: CP14BaseGuardBell
components:
- type: Sprite
layers:
- state: base-2
- type: SpawnOnTrigger
proto: CP14GuardBellEffect2
- type: entity
id: CP14GuardBell3
parent: CP14BaseGuardBell
components:
- type: Sprite
layers:
- state: base-3
- type: SpawnOnTrigger
proto: CP14GuardBellEffect3
- type: entity
id: CP14GuardBell4
parent: CP14BaseGuardBell
components:
- type: Sprite
layers:
- state: base-4
- type: SpawnOnTrigger
proto: CP14GuardBellEffect4
# Effects
- type: entity
id: CP14BaseGuardBellEffect
categories: [ HideSpawnMenu ]
abstract: true
components:
- type: CP14PvsOverride
- type: EmitSoundOnSpawn
sound:
path: /Audio/_CP14/Misc/scary-bell-short.ogg
params:
variation: 0.1
maxDistance: 200
- type: TimedDespawn
lifetime: 4.8
- type: Sprite
drawdepth: Effects
offset: 0, 0.5
layers:
- state: circle_increase
sprite: _CP14/Effects/Magic/cast_impact.rsi
shader: unshaded
- type: entity
id: CP14GuardBellEffect1
parent: CP14BaseGuardBellEffect
categories: [ HideSpawnMenu ]
components:
- type: EmitSoundOnSpawn
sound:
path: /Audio/_CP14/Misc/scary-bell-short.ogg
params:
variation: 0.1
maxDistance: 200
- type: entity
id: CP14GuardBellEffect2
parent: CP14BaseGuardBellEffect
categories: [ HideSpawnMenu ]
components:
- type: EmitSoundOnSpawn
sound:
path: /Audio/_CP14/Misc/doom-bell-short.ogg
params:
variation: 0.1
maxDistance: 200
- type: entity
id: CP14GuardBellEffect3
parent: CP14BaseGuardBellEffect
categories: [ HideSpawnMenu ]
components:
- type: EmitSoundOnSpawn
sound:
path: /Audio/_CP14/Misc/minor-alert-short.ogg
params:
volume: 20
variation: 0.1
maxDistance: 200
- type: entity
id: CP14GuardBellEffect4
parent: CP14BaseGuardBellEffect
categories: [ HideSpawnMenu ]
components:
- type: EmitSoundOnSpawn
sound:
path: /Audio/_CP14/Misc/major-alert-short.ogg
params:
variation: 0.1
maxDistance: 200

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -5,10 +5,19 @@
"y": 64
},
"license": "CC-BY-SA-4.0",
"copyright": "Created by Jaba",
"copyright": "Created by Jaba. Variant 2, 3 and 4 by Kryyto.",
"states": [
{
"name": "base"
},
{
"name": "base-2"
},
{
"name": "base-3"
},
{
"name": "base-4"
}
]
}