Merge remote-tracking branch 'upstream/master' into UPS
@@ -7,7 +7,8 @@ using Robust.Shared.Player;
|
||||
|
||||
namespace Content.Client._White.Overlays;
|
||||
|
||||
public sealed class NightVisionSystem : SharedNightVisionSystem
|
||||
public sealed class NightVisionSystem : SharedEnhancedVisionSystem<NightVisionComponent, TemporaryNightVisionComponent,
|
||||
ToggleNightVisionEvent>
|
||||
{
|
||||
[Dependency] private readonly IPlayerManager _player = default!;
|
||||
[Dependency] private readonly IOverlayManager _overlayMan = default!;
|
||||
@@ -46,12 +47,12 @@ public sealed class NightVisionSystem : SharedNightVisionSystem
|
||||
if (TryComp(ent, out NightVisionComponent? nightVision) && nightVision.IsActive)
|
||||
return;
|
||||
|
||||
UpdateNightVision(ent, false);
|
||||
UpdateEnhancedVision(ent, false);
|
||||
}
|
||||
|
||||
private void OnTempInit(Entity<TemporaryNightVisionComponent> ent, ref ComponentInit args)
|
||||
{
|
||||
UpdateNightVision(ent, true);
|
||||
UpdateEnhancedVision(ent, true);
|
||||
}
|
||||
|
||||
private void OnPlayerAttached(EntityUid uid, NightVisionComponent component, PlayerAttachedEvent args)
|
||||
@@ -76,7 +77,7 @@ public sealed class NightVisionSystem : SharedNightVisionSystem
|
||||
UpdateNightVision(active);
|
||||
}
|
||||
|
||||
protected override void UpdateNightVision(EntityUid uid, bool active)
|
||||
protected override void UpdateEnhancedVision(EntityUid uid, bool active)
|
||||
{
|
||||
if (_player.LocalSession?.AttachedEntity != uid)
|
||||
return;
|
||||
|
||||
@@ -22,6 +22,7 @@ public sealed class ThermalVisionOverlay : Overlay
|
||||
public override OverlaySpace Space => OverlaySpace.WorldSpace;
|
||||
|
||||
private readonly List<NightVisionRenderEntry> _entries = new();
|
||||
private EntityUid _pointLightEntity;
|
||||
|
||||
public ThermalVisionOverlay()
|
||||
{
|
||||
@@ -46,23 +47,50 @@ public sealed class ThermalVisionOverlay : Overlay
|
||||
return;
|
||||
}
|
||||
|
||||
var transform = _entity.GetComponent<TransformComponent>(ent);
|
||||
if (_pointLightEntity == default)
|
||||
{
|
||||
_pointLightEntity = _entity.SpawnAttachedTo(null, transform.Coordinates);
|
||||
_entity.EnsureComponent<PointLightComponent>(_pointLightEntity);
|
||||
_transform.SetParent(_pointLightEntity, ent);
|
||||
}
|
||||
else
|
||||
{
|
||||
var pointLightXForm = _entity.GetComponent<TransformComponent>(_pointLightEntity);
|
||||
if (pointLightXForm.ParentUid != ent)
|
||||
_transform.SetParent(_pointLightEntity, pointLightXForm, ent, transform);
|
||||
}
|
||||
|
||||
if (HasOccluders(ent))
|
||||
return;
|
||||
|
||||
var handle = args.WorldHandle;
|
||||
var eye = args.Viewport.Eye;
|
||||
var mapId = eye?.Position.MapId;
|
||||
var eyeRot = eye?.Rotation ?? default;
|
||||
|
||||
_entries.Clear();
|
||||
var entities = _entity.EntityQueryEnumerator<BodyComponent, SpriteComponent, TransformComponent>();
|
||||
while (entities.MoveNext(out var uid, out _, out var sprite, out var xform))
|
||||
{
|
||||
if (HasOccluders(uid))
|
||||
var entity = uid;
|
||||
|
||||
if (_container.TryGetOuterContainer(uid, xform, out var container))
|
||||
{
|
||||
var owner = container.Owner;
|
||||
if (_entity.TryGetComponent<SpriteComponent>(owner, out var ownerSprite) &&
|
||||
_entity.TryGetComponent<TransformComponent>(owner, out var ownerXform))
|
||||
{
|
||||
entity = owner;
|
||||
sprite = ownerSprite;
|
||||
xform = ownerXform;
|
||||
}
|
||||
}
|
||||
|
||||
if (_entries.Any(e => e.Ent.Item1 == entity))
|
||||
continue;
|
||||
|
||||
_entries.Add(new NightVisionRenderEntry((uid, sprite, xform),
|
||||
eye?.Position.MapId,
|
||||
eyeRot));
|
||||
_entries.Add(new NightVisionRenderEntry((entity, sprite, xform), mapId, eyeRot));
|
||||
}
|
||||
|
||||
foreach (var entry in _entries)
|
||||
@@ -79,7 +107,7 @@ public sealed class ThermalVisionOverlay : Overlay
|
||||
Angle eyeRot)
|
||||
{
|
||||
var (uid, sprite, xform) = ent;
|
||||
if (xform.MapID != map || _container.IsEntityOrParentInContainer(uid))
|
||||
if (xform.MapID != map || HasOccluders(uid))
|
||||
return;
|
||||
|
||||
var position = _transform.GetWorldPosition(xform);
|
||||
@@ -95,6 +123,15 @@ public sealed class ThermalVisionOverlay : Overlay
|
||||
Box2.CenteredAround(mapCoordinates.Position, new Vector2(0.4f, 0.4f)));
|
||||
return occluders.Any(o => o.Component.Enabled);
|
||||
}
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
if (_pointLightEntity == default)
|
||||
return;
|
||||
|
||||
_entity.DeleteEntity(_pointLightEntity);
|
||||
_pointLightEntity = default;
|
||||
}
|
||||
}
|
||||
|
||||
public record struct NightVisionRenderEntry(
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
using Content.Shared._Miracle.Systems;
|
||||
using Content.Shared.GameTicking;
|
||||
using Content.Shared._White.Overlays;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.Graphics;
|
||||
using Robust.Client.Player;
|
||||
using Robust.Shared.Player;
|
||||
|
||||
namespace Content.Client._White.Overlays;
|
||||
|
||||
public sealed class ThermalVisionSystem : SharedThermalVisionSystem
|
||||
public sealed class ThermalVisionSystem : SharedEnhancedVisionSystem<ThermalVisionComponent,
|
||||
TemporaryThermalVisionComponent, ToggleThermalVisionEvent>
|
||||
{
|
||||
[Dependency] private readonly IPlayerManager _player = default!;
|
||||
[Dependency] private readonly IOverlayManager _overlayMan = default!;
|
||||
@@ -46,12 +48,12 @@ public sealed class ThermalVisionSystem : SharedThermalVisionSystem
|
||||
if (TryComp(ent, out ThermalVisionComponent? thermalVision) && thermalVision.IsActive)
|
||||
return;
|
||||
|
||||
UpdateThermalVision(ent, false);
|
||||
UpdateEnhancedVision(ent, false);
|
||||
}
|
||||
|
||||
private void OnTempInit(Entity<TemporaryThermalVisionComponent> ent, ref ComponentInit args)
|
||||
{
|
||||
UpdateThermalVision(ent, true);
|
||||
UpdateEnhancedVision(ent, true);
|
||||
}
|
||||
|
||||
private void OnPlayerAttached(EntityUid uid, ThermalVisionComponent component, PlayerAttachedEvent args)
|
||||
@@ -76,7 +78,7 @@ public sealed class ThermalVisionSystem : SharedThermalVisionSystem
|
||||
UpdateThermalVision(active);
|
||||
}
|
||||
|
||||
protected override void UpdateThermalVision(EntityUid uid, bool active)
|
||||
protected override void UpdateEnhancedVision(EntityUid uid, bool active)
|
||||
{
|
||||
if (_player.LocalSession?.AttachedEntity != uid)
|
||||
return;
|
||||
@@ -89,6 +91,7 @@ public sealed class ThermalVisionSystem : SharedThermalVisionSystem
|
||||
{
|
||||
if (_player.LocalEntity == null)
|
||||
{
|
||||
_overlay.Reset();
|
||||
_overlayMan.RemoveOverlay(_overlay);
|
||||
return;
|
||||
}
|
||||
@@ -99,11 +102,15 @@ public sealed class ThermalVisionSystem : SharedThermalVisionSystem
|
||||
if (active)
|
||||
_overlayMan.AddOverlay(_overlay);
|
||||
else
|
||||
{
|
||||
_overlay.Reset();
|
||||
_overlayMan.RemoveOverlay(_overlay);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnRestart(RoundRestartCleanupEvent ev)
|
||||
{
|
||||
_overlay.Reset();
|
||||
_overlayMan.RemoveOverlay(_overlay);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
using Content.Shared._Miracle.Systems;
|
||||
using Content.Shared._White.Overlays;
|
||||
|
||||
namespace Content.Server._Miracle.Systems;
|
||||
|
||||
public sealed class NightVisionSystem : SharedNightVisionSystem
|
||||
public sealed class NightVisionSystem : SharedEnhancedVisionSystem<NightVisionComponent, TemporaryNightVisionComponent,
|
||||
ToggleNightVisionEvent>
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
using Content.Shared._Miracle.Systems;
|
||||
using Content.Shared._White.Overlays;
|
||||
|
||||
namespace Content.Server._Miracle.Systems;
|
||||
|
||||
public sealed class ThermalVisionSystem : SharedThermalVisionSystem
|
||||
public sealed class ThermalVisionSystem : SharedEnhancedVisionSystem<ThermalVisionComponent,
|
||||
TemporaryThermalVisionComponent, ToggleThermalVisionEvent>
|
||||
{
|
||||
}
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
using Content.Shared._White.Overlays;
|
||||
using Content.Shared.Actions;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Shared._Miracle.Systems;
|
||||
|
||||
public abstract class SharedEnhancedVisionSystem<TComp, TTempComp, TEvent> : EntitySystem
|
||||
where TComp : BaseEnhancedVisionComponent
|
||||
where TEvent : InstantActionEvent
|
||||
where TTempComp : Component
|
||||
{
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
[Dependency] private readonly SharedActionsSystem _actions = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<TComp, TEvent>(OnToggle);
|
||||
SubscribeLocalEvent<TComp, ComponentInit>(OnInit);
|
||||
SubscribeLocalEvent<TComp, ComponentRemove>(OnRemove);
|
||||
}
|
||||
|
||||
private void OnRemove(EntityUid uid, TComp component, ComponentRemove args)
|
||||
{
|
||||
_actions.RemoveAction(uid, component.ToggleActionEntity);
|
||||
|
||||
if (HasComp<TTempComp>(uid))
|
||||
return;
|
||||
|
||||
UpdateEnhancedVision(uid, false);
|
||||
}
|
||||
|
||||
private void OnInit(EntityUid uid, TComp component, ComponentInit args)
|
||||
{
|
||||
_actions.AddAction(uid, ref component.ToggleActionEntity, component.ToggleAction);
|
||||
|
||||
if (!component.IsActive && HasComp<TTempComp>(uid))
|
||||
return;
|
||||
|
||||
UpdateEnhancedVision(uid, component.IsActive);
|
||||
}
|
||||
|
||||
protected virtual void UpdateEnhancedVision(EntityUid uid, bool active) { }
|
||||
|
||||
private void OnToggle(EntityUid uid, TComp component, TEvent args)
|
||||
{
|
||||
if (!_timing.IsFirstTimePredicted)
|
||||
return;
|
||||
|
||||
component.IsActive = !component.IsActive;
|
||||
|
||||
_audio.PlayPredicted(component.IsActive ? component.ActivateSound : component.DeactivateSound, uid, uid);
|
||||
|
||||
args.Handled = true;
|
||||
|
||||
if (!component.IsActive && HasComp<TTempComp>(uid))
|
||||
return;
|
||||
|
||||
UpdateEnhancedVision(uid, component.IsActive);
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
using Content.Shared._White.Overlays;
|
||||
using Content.Shared.Actions;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Shared._Miracle.Systems;
|
||||
|
||||
public abstract class SharedNightVisionSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
[Dependency] private readonly SharedActionsSystem _actions = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<NightVisionComponent, ToggleNightVisionEvent>(OnToggle);
|
||||
SubscribeLocalEvent<NightVisionComponent, ComponentInit>(OnInit);
|
||||
SubscribeLocalEvent<NightVisionComponent, ComponentRemove>(OnRemove);
|
||||
}
|
||||
|
||||
private void OnRemove(EntityUid uid, NightVisionComponent component, ComponentRemove args)
|
||||
{
|
||||
_actions.RemoveAction(uid, component.ToggleActionEntity);
|
||||
|
||||
if (HasComp<TemporaryNightVisionComponent>(uid))
|
||||
return;
|
||||
|
||||
UpdateNightVision(uid, false);
|
||||
}
|
||||
|
||||
private void OnInit(EntityUid uid, NightVisionComponent component, ComponentInit args)
|
||||
{
|
||||
_actions.AddAction(uid, ref component.ToggleActionEntity, component.ToggleAction);
|
||||
|
||||
if (!component.IsActive && HasComp<TemporaryNightVisionComponent>(uid))
|
||||
return;
|
||||
|
||||
UpdateNightVision(uid, component.IsActive);
|
||||
}
|
||||
|
||||
protected virtual void UpdateNightVision(EntityUid uid, bool active) { }
|
||||
|
||||
private void OnToggle(EntityUid uid, NightVisionComponent component, ToggleNightVisionEvent args)
|
||||
{
|
||||
if (!_timing.IsFirstTimePredicted)
|
||||
return;
|
||||
|
||||
component.IsActive = !component.IsActive;
|
||||
|
||||
if (component.IsActive && component.ActivateSound != null)
|
||||
_audio.PlayPredicted(component.ActivateSound, uid, uid);
|
||||
else if (component.DeactivateSound != null)
|
||||
_audio.PlayPredicted(component.DeactivateSound, uid, uid);
|
||||
|
||||
args.Handled = true;
|
||||
|
||||
if (!component.IsActive && HasComp<TemporaryNightVisionComponent>(uid))
|
||||
return;
|
||||
|
||||
UpdateNightVision(uid, component.IsActive);
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
using Content.Shared._White.Overlays;
|
||||
using Content.Shared.Actions;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Shared._Miracle.Systems;
|
||||
|
||||
public abstract class SharedThermalVisionSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
[Dependency] private readonly SharedActionsSystem _actions = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<ThermalVisionComponent, ToggleThermalVisionEvent>(OnToggle);
|
||||
SubscribeLocalEvent<ThermalVisionComponent, ComponentInit>(OnInit);
|
||||
SubscribeLocalEvent<ThermalVisionComponent, ComponentRemove>(OnRemove);
|
||||
}
|
||||
|
||||
private void OnRemove(EntityUid uid, ThermalVisionComponent component, ComponentRemove args)
|
||||
{
|
||||
_actions.RemoveAction(uid, component.ToggleActionEntity);
|
||||
|
||||
if (HasComp<TemporaryThermalVisionComponent>(uid))
|
||||
return;
|
||||
|
||||
UpdateThermalVision(uid, false);
|
||||
}
|
||||
|
||||
private void OnInit(EntityUid uid, ThermalVisionComponent component, ComponentInit args)
|
||||
{
|
||||
_actions.AddAction(uid, ref component.ToggleActionEntity, component.ToggleAction);
|
||||
|
||||
if (!component.IsActive && HasComp<TemporaryThermalVisionComponent>(uid))
|
||||
return;
|
||||
|
||||
UpdateThermalVision(uid, component.IsActive);
|
||||
}
|
||||
|
||||
protected virtual void UpdateThermalVision(EntityUid uid, bool active) { }
|
||||
|
||||
private void OnToggle(EntityUid uid, ThermalVisionComponent component, ToggleThermalVisionEvent args)
|
||||
{
|
||||
if (!_timing.IsFirstTimePredicted)
|
||||
return;
|
||||
|
||||
component.IsActive = !component.IsActive;
|
||||
|
||||
if (component.IsActive && component.ActivateSound != null)
|
||||
_audio.PlayPredicted(component.ActivateSound, uid, uid);
|
||||
else if (component.DeactivateSound != null)
|
||||
_audio.PlayPredicted(component.DeactivateSound, uid, uid);
|
||||
|
||||
args.Handled = true;
|
||||
|
||||
if (!component.IsActive && HasComp<TemporaryThermalVisionComponent>(uid))
|
||||
return;
|
||||
|
||||
UpdateThermalVision(uid, component.IsActive);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._White.Overlays;
|
||||
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
public abstract partial class BaseEnhancedVisionComponent : BaseNvOverlayComponent
|
||||
{
|
||||
[DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
|
||||
public bool IsActive = true;
|
||||
|
||||
[DataField]
|
||||
public virtual SoundSpecifier? ActivateSound { get; set; }= new SoundPathSpecifier("/Audio/White/Items/Goggles/activate.ogg");
|
||||
|
||||
[DataField]
|
||||
public virtual SoundSpecifier? DeactivateSound { get; set; } = new SoundPathSpecifier("/Audio/White/Items/Goggles/deactivate.ogg");
|
||||
|
||||
[DataField]
|
||||
public virtual EntProtoId? ToggleAction { get; set; }
|
||||
|
||||
[ViewVariables]
|
||||
public EntityUid? ToggleActionEntity;
|
||||
}
|
||||
@@ -6,25 +6,13 @@ using Robust.Shared.Prototypes;
|
||||
namespace Content.Shared._White.Overlays;
|
||||
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
public sealed partial class NightVisionComponent : BaseNvOverlayComponent
|
||||
public sealed partial class NightVisionComponent : BaseEnhancedVisionComponent
|
||||
{
|
||||
[DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
|
||||
public override Color Color { get; set; } = Color.FromHex("#98FB98");
|
||||
|
||||
[DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
|
||||
public bool IsActive = true;
|
||||
|
||||
[DataField]
|
||||
public SoundSpecifier? ActivateSound = new SoundPathSpecifier("/Audio/White/Items/Goggles/activate.ogg");
|
||||
|
||||
[DataField]
|
||||
public SoundSpecifier? DeactivateSound = new SoundPathSpecifier("/Audio/White/Items/Goggles/deactivate.ogg");
|
||||
|
||||
[DataField]
|
||||
public EntProtoId? ToggleAction = "ToggleNightVision";
|
||||
|
||||
[ViewVariables]
|
||||
public EntityUid? ToggleActionEntity;
|
||||
public override EntProtoId? ToggleAction { get; set; } = "ToggleNightVision";
|
||||
}
|
||||
|
||||
public sealed partial class ToggleNightVisionEvent : InstantActionEvent
|
||||
|
||||
@@ -6,25 +6,13 @@ using Robust.Shared.Prototypes;
|
||||
namespace Content.Shared._White.Overlays;
|
||||
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
public sealed partial class ThermalVisionComponent : BaseNvOverlayComponent
|
||||
public sealed partial class ThermalVisionComponent : BaseEnhancedVisionComponent
|
||||
{
|
||||
[DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
|
||||
public override Color Color { get; set; } = Color.FromHex("#F84742");
|
||||
|
||||
[DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
|
||||
public bool IsActive = true;
|
||||
|
||||
[DataField]
|
||||
public SoundSpecifier? ActivateSound = new SoundPathSpecifier("/Audio/White/Items/Goggles/activate.ogg");
|
||||
|
||||
[DataField]
|
||||
public SoundSpecifier? DeactivateSound = new SoundPathSpecifier("/Audio/White/Items/Goggles/deactivate.ogg");
|
||||
|
||||
[DataField]
|
||||
public EntProtoId? ToggleAction = "ToggleThermalVision";
|
||||
|
||||
[ViewVariables]
|
||||
public EntityUid? ToggleActionEntity;
|
||||
public override EntProtoId? ToggleAction { get; set; } = "ToggleThermalVision";
|
||||
}
|
||||
|
||||
public sealed partial class ToggleThermalVisionEvent : InstantActionEvent
|
||||
|
||||
BIN
Resources/Audio/White/Voice/SpeechSounds/kazooie/ehh.ogg
Normal file
BIN
Resources/Audio/White/Voice/SpeechSounds/kazooie/ehh2.ogg
Normal file
BIN
Resources/Audio/White/Voice/SpeechSounds/kazooie/ehh3.ogg
Normal file
@@ -6245,3 +6245,68 @@
|
||||
id: 400
|
||||
time: '2024-07-20T15:28:44.0000000+00:00'
|
||||
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/470
|
||||
- author: Aviu
|
||||
changes:
|
||||
- message: "\u0422\u0435\u043F\u0435\u0440\u044C \u0442\u0435\u0440\u043C\u0430\u043B\
|
||||
\u043A\u0438 \u043F\u043E\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u044E\
|
||||
\u0442 \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440, \u0435\u0441\u043B\
|
||||
\u0438 \u0432 \u043D\u0435\u043C \u043A\u0442\u043E-\u0442\u043E \u043D\u0430\
|
||||
\u0445\u043E\u0434\u0438\u0442\u0441\u044F."
|
||||
type: Add
|
||||
- message: "\u0422\u0435\u0440\u043C\u0430\u043B\u043A\u0438 \u0442\u0435\u043F\u0435\
|
||||
\u0440\u044C \u0434\u0430\u044E\u0442 \u043D\u0435\u043C\u043D\u043E\u0433\u043E\
|
||||
\ \u043D\u043E\u0447\u043D\u043E\u0433\u043E \u0437\u0440\u0435\u043D\u0438\u044F\
|
||||
."
|
||||
type: Add
|
||||
id: 401
|
||||
time: '2024-07-21T11:30:47.0000000+00:00'
|
||||
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/471
|
||||
- author: ThereDrD
|
||||
changes:
|
||||
- message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430 \u043A\u0430\u0440\
|
||||
\u0442\u0430 \u0441\u0442\u0430\u043D\u0446\u0438\u0438 \u0432 \u043F\u043E\u0431\
|
||||
\u0440\u044F\u043A\u0443\u0448\u043A\u0438 \u043B\u043E\u0430\u0434\u0430\u0443\
|
||||
\u0442\u043E\u0432"
|
||||
type: Add
|
||||
- message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D \u0441\u0432\u0438\u0441\
|
||||
\u0442\u043E\u043A \u0438 \u0444\u043E\u043D\u0430\u0440\u0438\u043A \u0434\u043B\
|
||||
\u044F \u0432\u0441\u0435\u0433\u043E \u0421\u0411 \u0432 \u043B\u043E\u0430\
|
||||
\u0434\u0430\u0443\u0442\u044B"
|
||||
type: Add
|
||||
- message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430 \u0440\u0430\u0437\
|
||||
\u0433\u0440\u0443\u0437\u043A\u0430 \u0432 \u043B\u043E\u0430\u0434\u0430\u0443\
|
||||
\u0442\u044B \u0434\u043B\u044F \u0432\u0441\u0435\u0433\u043E \u0421\u0411."
|
||||
type: Add
|
||||
- message: "\u041F\u043E\u0444\u0438\u043A\u0448\u0435\u043D\u044B \u043D\u0435\u043A\
|
||||
\u043E\u0442\u043E\u0440\u044B\u0435 \u0441\u043B\u043E\u043C\u0430\u043D\u043D\
|
||||
\u044B\u0435 \u043F\u0440\u043E\u0442\u043E\u0442\u0438\u043F\u044B \u043B\u043E\
|
||||
\u0430\u0434\u0430\u0443\u0442\u043E\u0432, \u0443 \u043D\u0435\u043A\u043E\u0442\
|
||||
\u043E\u0440\u044B\u0445 \u0440\u043E\u043B\u0435\u0439 \u043F\u043E\u044F\u0432\
|
||||
\u0438\u043B\u0438\u0441\u044C \u0432\u0435\u0449\u0438, \u043A\u043E\u0442\u043E\
|
||||
\u0440\u044B\u0445 \u0440\u0430\u043D\u044C\u0448\u0435 \u043D\u0435 \u0431\u044B\
|
||||
\u043B\u043E. \u042D\u0442\u043E \u0432\u0441\u0435 \u0435\u0449\u0435 \u043D\
|
||||
\u0435 \u0444\u0438\u043A\u0441\u0438\u0442 \u043F\u0440\u043E\u0431\u043B\u0435\
|
||||
\u043C\u0443 \u0441\u0431\u0440\u0430\u0441\u044B\u0432\u0430\u043D\u0438\u044F\
|
||||
\ \u043B\u043E\u0430\u0434\u0430\u0443\u0442\u043E\u0432 \u043F\u0440\u0438\
|
||||
\ \u0432\u044B\u0431\u043E\u0440\u0435 \u0432\u0435\u0449\u0435\u0439 \u0441\
|
||||
\ \u0442\u0430\u0439\u043C\u0435\u0440\u0430\u043C\u0438. \u041F\u043E\u0434\
|
||||
\u0440\u043E\u0431\u043D\u0435\u0435 \u0432 \u0437\u0430\u043A\u0440\u0435\u043F\
|
||||
\u043B\u0435\u043D\u043D\u043E\u043C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\
|
||||
\u0438\u0438 \u043A\u0430\u043D\u0430\u043B\u0430 \u0438\u0437\u043C\u0435\u043D\
|
||||
\u0435\u043D\u0438\u0439."
|
||||
type: Fix
|
||||
id: 402
|
||||
time: '2024-07-21T12:48:53.0000000+00:00'
|
||||
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/473
|
||||
- author: PuroSlavKing
|
||||
changes:
|
||||
- message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B \u0413\u043E\u043D\
|
||||
\u0434\u043E\u043B\u044B. \u041C\u043E\u0436\u043D\u043E \u043A\u0443\u043F\u0438\
|
||||
\u0442\u044C \u044F\u0449\u0438\u043A \u0441 \u0413\u043E\u043D\u0434\u043E\u043B\
|
||||
\u043E\u0439 \u0437\u0430 2\u0422\u041A, \u0432 \u0430\u043F\u043B\u0438\u043D\
|
||||
\u043A\u0435, \u0432\u043A\u043B\u0430\u0434\u043A\u0430 \u0441\u0430\u0431\u043E\
|
||||
\u0442\u0430\u0436."
|
||||
type: Add
|
||||
id: 403
|
||||
time: '2024-07-21T16:53:20.0000000+00:00'
|
||||
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/475
|
||||
|
||||
1
Resources/Locale/ru-RU/_white/accent/gondola.ftl
Normal file
@@ -0,0 +1 @@
|
||||
accent-words-gondola-1 = ...
|
||||
@@ -0,0 +1,3 @@
|
||||
chat-speech-verb-name-gondola = Гондола
|
||||
chat-speech-verb-gondola-1 = уставляется взглядом
|
||||
chat-speech-verb-gondola-2 = тяжело дышит
|
||||
1
Resources/Locale/ru-RU/_white/reagents/fun.ftl
Normal file
@@ -0,0 +1 @@
|
||||
reagent-popup-tranquility = Вы чувствуете себя странно спокойными...
|
||||
@@ -0,0 +1 @@
|
||||
reagent-physical-desc-calming = успокаивающий
|
||||
2
Resources/Locale/ru-RU/_white/store/uplink-catalog.ftl
Normal file
@@ -0,0 +1,2 @@
|
||||
uplink-gondola-name = Ящик с Гондолой
|
||||
uplink-gondola-desc = Ящик, содержащий одну стандартную Гондолу.
|
||||
@@ -0,0 +1,5 @@
|
||||
ent-FoodMeatGondola = сырое мясо Гондолы
|
||||
.desc = Ты монстр.
|
||||
|
||||
ent-FoodMeatGondolaCooked = стейк из Гондолы
|
||||
.desc = Приготовленное мясо Гондолы...
|
||||
@@ -7,3 +7,41 @@
|
||||
id: ScienceHeadset
|
||||
equipment:
|
||||
ears: ClothingHeadsetScience
|
||||
|
||||
# Jumpsuit
|
||||
|
||||
- type: itemLoadout # WD
|
||||
id: RoboticistJumpskirt
|
||||
equipment: RoboticistJumpskirt
|
||||
- type: startingGear
|
||||
id: RoboticistJumpskirt
|
||||
equipment:
|
||||
jumpsuit: ClothingUniformJumpskirtRoboticist
|
||||
|
||||
- type: itemLoadout # WD
|
||||
id: RoboticistJumpsuit
|
||||
equipment: RoboticistJumpsuit
|
||||
- type: startingGear
|
||||
id: RoboticistJumpsuit
|
||||
equipment:
|
||||
jumpsuit: ClothingUniformJumpsuitRoboticist
|
||||
|
||||
# Outercloting
|
||||
|
||||
- type: itemLoadout # WD
|
||||
id: RoboticistLabCoat
|
||||
equipment: RoboticistLabCoat
|
||||
- type: startingGear
|
||||
id: RoboticistLabCoat
|
||||
equipment:
|
||||
outerClothing: ClothingOuterCoatRoboOpened
|
||||
|
||||
# Gloves
|
||||
|
||||
- type: itemLoadout # WD
|
||||
id: RoboticistGloves
|
||||
equipment: RoboticistGloves
|
||||
- type: startingGear
|
||||
id: RoboticistGloves
|
||||
equipment:
|
||||
gloves: ClothingHandsGlovesRobohands
|
||||
|
||||
@@ -1,15 +1,6 @@
|
||||
# jumpsuit
|
||||
- type: itemLoadout
|
||||
id: SecurityJumpsuitBlue
|
||||
equipment: SecurityJumpsuitBlue
|
||||
- type: startingGear
|
||||
id: SecurityJumpsuitBlue
|
||||
equipment:
|
||||
jumpsuit: ClothingUniformJumpsuitSecBlue
|
||||
# Ears
|
||||
|
||||
# ears
|
||||
|
||||
- type: itemLoadout
|
||||
- type: itemLoadout # WD
|
||||
id: SecurityHeadset
|
||||
equipment: SecurityHeadset
|
||||
- type: startingGear
|
||||
@@ -17,7 +8,7 @@
|
||||
equipment:
|
||||
ears: ClothingHeadsetSecurity
|
||||
|
||||
- type: itemLoadout
|
||||
- type: itemLoadout # WD
|
||||
id: SecurityCommandHeadset
|
||||
equipment: SecurityCommandHeadset
|
||||
- type: startingGear
|
||||
@@ -25,7 +16,7 @@
|
||||
equipment:
|
||||
ears: ClothingHeadsetAltSecurityCommand
|
||||
|
||||
- type: itemLoadout
|
||||
- type: itemLoadout # WD
|
||||
id: SecurityHeadsetFull
|
||||
equipment: SecurityHeadsetFull
|
||||
- type: startingGear
|
||||
@@ -35,7 +26,7 @@
|
||||
|
||||
# Mask
|
||||
|
||||
- type: itemLoadout
|
||||
- type: itemLoadout # WD
|
||||
id: SecurityMaskStandard
|
||||
equipment: SecurityMaskStandard
|
||||
- type: startingGear
|
||||
@@ -43,10 +34,50 @@
|
||||
equipment:
|
||||
mask: ClothingMaskGasSecurity
|
||||
|
||||
- type: itemLoadout
|
||||
- type: itemLoadout # WD
|
||||
id: SecurityMaskSwat
|
||||
equipment: SecurityMaskSwat
|
||||
- type: startingGear
|
||||
id: SecurityMaskSwat
|
||||
equipment:
|
||||
mask: ClothingMaskGasSwat
|
||||
|
||||
# Jumpsuit
|
||||
|
||||
- type: itemLoadout # WD
|
||||
id: SecurityJumpsuitBlue
|
||||
equipment: SecurityJumpsuitBlue
|
||||
- type: startingGear
|
||||
id: SecurityJumpsuitBlue
|
||||
equipment:
|
||||
jumpsuit: ClothingUniformJumpsuitSecBlue
|
||||
|
||||
# Belt
|
||||
|
||||
- type: itemLoadout # WD
|
||||
id: SecurityWebbing
|
||||
equipment: SecurityWebbing
|
||||
- type: startingGear
|
||||
id: SecurityWebbing
|
||||
equipment:
|
||||
belt: ClothingBeltSecurityWebbing
|
||||
|
||||
# Job trinkets
|
||||
|
||||
- type: itemLoadout # WD
|
||||
id: SecurityWhistle
|
||||
equipment: SecurityWhistle
|
||||
- type: startingGear
|
||||
id: SecurityWhistle
|
||||
storage:
|
||||
back:
|
||||
- SecurityWhistle
|
||||
|
||||
- type: itemLoadout # WD
|
||||
id: SecurityFlashlight
|
||||
equipment: SecurityFlashlight
|
||||
- type: startingGear
|
||||
id: SecurityFlashlight
|
||||
storage:
|
||||
back:
|
||||
- FlashlightSeclite
|
||||
|
||||
@@ -8,6 +8,17 @@
|
||||
back:
|
||||
- PlushieLizard
|
||||
|
||||
# Useful items
|
||||
|
||||
- type: itemLoadout # WD
|
||||
id: HandheldStationMap
|
||||
equipment: HandheldStationMap
|
||||
- type: startingGear
|
||||
id: HandheldStationMap
|
||||
storage:
|
||||
back:
|
||||
- HandheldStationMap
|
||||
|
||||
# Table games
|
||||
- type: itemLoadout # WD
|
||||
id: ChessBoard
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
minLimit: 0
|
||||
maxLimit: 3
|
||||
loadouts:
|
||||
- HandheldStationMap # WD
|
||||
- ChessBoard # WD
|
||||
- CheckerBoard # WD
|
||||
- BackgammonBoard # WD
|
||||
@@ -74,7 +75,6 @@
|
||||
name: loadout-group-outerclothing
|
||||
minLimit: 0
|
||||
loadouts:
|
||||
- CaptainOuterClothing
|
||||
- CaptainWintercoat
|
||||
|
||||
- type: loadoutGroup
|
||||
@@ -225,7 +225,7 @@
|
||||
loadouts:
|
||||
- AssistantPDA
|
||||
|
||||
- type: loadoutGroup # WD edot
|
||||
- type: loadoutGroup # WD edit
|
||||
id: BartenderHead
|
||||
name: loadout-group-head
|
||||
minLimit: 0
|
||||
@@ -233,7 +233,7 @@
|
||||
- BowlerHat
|
||||
- Tophat
|
||||
- HatMagician
|
||||
- BeretStandardЙ
|
||||
- BeretStandard
|
||||
- FrenchBeret
|
||||
- FedoraGrey
|
||||
|
||||
@@ -617,7 +617,7 @@
|
||||
- BowlerHat
|
||||
- Tophat
|
||||
- HatMagician
|
||||
- BeretStandardЙ
|
||||
- BeretStandard
|
||||
- FrenchBeret
|
||||
|
||||
- type: loadoutGroup
|
||||
@@ -1211,7 +1211,7 @@
|
||||
loadouts:
|
||||
- BrownShoes
|
||||
- ShoesLeather
|
||||
- ClothingShoesBootsLaceup
|
||||
- BootsLaceup # WD
|
||||
- ScienceWinterBoots
|
||||
|
||||
- type: loadoutGroup # WD
|
||||
@@ -1238,8 +1238,8 @@
|
||||
loadouts:
|
||||
- SeniorResearcherJumpsuit
|
||||
- SeniorResearcherJumpskirt
|
||||
- RoboticistJumpsuit
|
||||
- RoboticistJumpskirt
|
||||
- RoboticistJumpsuit # WD
|
||||
- RoboticistJumpskirt # WD
|
||||
|
||||
- type: loadoutGroup
|
||||
id: SeniorResearcherOuterclothing
|
||||
@@ -1251,7 +1251,6 @@
|
||||
- ScienceLabCoat
|
||||
- ScienceWintercoat
|
||||
- RoboticistLabCoat
|
||||
- RoboticistWintercoat
|
||||
|
||||
- type: loadoutGroup
|
||||
id: ScientistHead
|
||||
@@ -1287,14 +1286,13 @@
|
||||
- ScienceLabCoat
|
||||
- ScienceWintercoat
|
||||
- RoboticistLabCoat
|
||||
- RoboticistWintercoat
|
||||
|
||||
- type: loadoutGroup
|
||||
id: ScientistShoes
|
||||
name: loadout-group-shoes
|
||||
loadouts:
|
||||
- WhiteShoes
|
||||
- BlackShoes
|
||||
- ShoesColorBlack # WD
|
||||
- ScienceWinterBoots
|
||||
|
||||
- type: loadoutGroup
|
||||
@@ -1333,7 +1331,7 @@
|
||||
- GlovesColorBlack
|
||||
- GlovesColorPurple
|
||||
- GlovesLatex
|
||||
- ClothingHandsGlovesRobohands
|
||||
- RoboticistGloves
|
||||
|
||||
- type: loadoutGroup # WD
|
||||
id: CommonScienceHeadset
|
||||
@@ -1556,7 +1554,7 @@
|
||||
loadouts:
|
||||
- SecurityCadetPDA
|
||||
|
||||
- type: loadoutGroup
|
||||
- type: loadoutGroup # WD
|
||||
id: CommonSecurityHead
|
||||
name: loadout-group-head
|
||||
minLimit: 0
|
||||
@@ -1568,14 +1566,14 @@
|
||||
- CowboyBlack
|
||||
- CowboyBountyHunter
|
||||
|
||||
- type: loadoutGroup
|
||||
- type: loadoutGroup # WD
|
||||
id: CommonSecurityMask
|
||||
name: loadout-group-mask
|
||||
minLimit: 0
|
||||
loadouts:
|
||||
- SecurityMaskStandard
|
||||
|
||||
- type: loadoutGroup
|
||||
- type: loadoutGroup # WD
|
||||
id: CommonSecurityCommandMask
|
||||
name: loadout-group-mask
|
||||
minLimit: 0
|
||||
@@ -1583,7 +1581,7 @@
|
||||
- SecurityMaskStandard
|
||||
- SecurityMaskSwat
|
||||
|
||||
- type: loadoutGroup
|
||||
- type: loadoutGroup # WD
|
||||
id: CommonSecurityNeck
|
||||
name: loadout-group-neck
|
||||
minLimit: 0
|
||||
@@ -1591,13 +1589,13 @@
|
||||
- BlackTie
|
||||
- RedTie
|
||||
|
||||
- type: loadoutGroup
|
||||
- type: loadoutGroup # WD
|
||||
id: CommonSecurityHeadset
|
||||
name: loadout-group-ears
|
||||
loadouts:
|
||||
- SecurityHeadset
|
||||
|
||||
- type: loadoutGroup
|
||||
- type: loadoutGroup # WD
|
||||
id: CommonSecurityCommandHeadset
|
||||
name: loadout-group-ears
|
||||
loadouts:
|
||||
@@ -1609,14 +1607,21 @@
|
||||
loadouts:
|
||||
- SecurityHeadsetFull
|
||||
|
||||
- type: loadoutGroup
|
||||
- type: loadoutGroup # WD
|
||||
id: CommonSecurityBackpack
|
||||
name: loadout-group-backpack
|
||||
loadouts:
|
||||
- SecurityBackpack
|
||||
- SecuritySatchel
|
||||
- SecurityDuffel
|
||||
- CommonSatchelLeather # WD
|
||||
- CommonSatchelLeather
|
||||
|
||||
- type: loadoutGroup # WD
|
||||
id: CommonSecurityBelt
|
||||
name: loadout-group-belt
|
||||
minLimit: 0
|
||||
loadouts:
|
||||
- SecurityWebbing
|
||||
|
||||
- type: loadoutGroup
|
||||
id: CommonSecurityShoes
|
||||
@@ -1626,6 +1631,14 @@
|
||||
- BootsJack
|
||||
- SecurityWinterBoots
|
||||
|
||||
- type: loadoutGroup # WD
|
||||
id: CommonSecurityJobTrinkets
|
||||
name: loadout-group-job-trinkets
|
||||
minLimit: 0
|
||||
loadouts:
|
||||
- SecurityWhistle
|
||||
- SecurityFlashlight
|
||||
|
||||
# Medical
|
||||
|
||||
- type: loadoutGroup
|
||||
|
||||
@@ -374,11 +374,12 @@
|
||||
- CommonSecurityCommandMask # WD
|
||||
- HeadofSecurityNeck
|
||||
- HeadofSecurityJumpsuit
|
||||
- CommonSecurityBackpack
|
||||
- HeadofSecurityOuterClothing
|
||||
- CommonGloves # WD
|
||||
- CommonSecurityBelt # WD
|
||||
- CommonSecurityBackpack
|
||||
- CommonSecurityShoes
|
||||
- HeadofSecurityPDA
|
||||
- CommonSecurityJobTrinkets # WD
|
||||
- Trinkets
|
||||
|
||||
- type: roleLoadout
|
||||
@@ -391,8 +392,10 @@
|
||||
- WardenJumpsuit
|
||||
- CommonSecurityBackpack
|
||||
- CommonGloves # WD
|
||||
- CommonSecurityBelt # WD
|
||||
- CommonSecurityShoes
|
||||
- WardenPDA
|
||||
- CommonSecurityJobTrinkets # WD
|
||||
- Trinkets
|
||||
|
||||
- type: roleLoadout
|
||||
@@ -405,9 +408,11 @@
|
||||
- SeniorOfficerJumpsuit
|
||||
- CommonSecurityBackpack
|
||||
- SecurityOuterClothing
|
||||
- CommonSecurityBelt # WD
|
||||
- CommonGloves # WD
|
||||
- CommonSecurityShoes
|
||||
- SeniorOfficerPDA
|
||||
- CommonSecurityJobTrinkets # WD
|
||||
- Trinkets
|
||||
|
||||
- type: roleLoadout
|
||||
@@ -420,10 +425,11 @@
|
||||
- SecurityJumpsuit
|
||||
- CommonSecurityBackpack
|
||||
- SecurityOuterClothing
|
||||
- CommonSecurityBelt # WD
|
||||
- CommonGloves # WD
|
||||
- CommonSecurityShoes
|
||||
- SecurityPDA
|
||||
- SecurityBelt
|
||||
- CommonSecurityJobTrinkets # WD
|
||||
- Trinkets
|
||||
|
||||
- type: roleLoadout
|
||||
@@ -439,6 +445,7 @@
|
||||
- DetectiveGloves
|
||||
- DetectiveShoes
|
||||
- DetectivePDA # WD
|
||||
- CommonSecurityJobTrinkets # WD
|
||||
- Trinkets
|
||||
|
||||
- type: roleLoadout
|
||||
@@ -452,6 +459,7 @@
|
||||
- CommonGloves # WD
|
||||
- CommonSecurityShoes
|
||||
- SecurityCadetPDA
|
||||
- CommonSecurityJobTrinkets # WD
|
||||
- Trinkets
|
||||
|
||||
# Medical
|
||||
@@ -491,12 +499,11 @@
|
||||
- CommonMedicalHeadset # WD
|
||||
- CommonMedicalMask # WD
|
||||
- MedicalDoctorJumpsuit
|
||||
- MedicalGloves
|
||||
- MedicalBackpack
|
||||
- MedicalDoctorOuterClothing
|
||||
- CommonMedicalShoes
|
||||
- CommonMedicalGloves
|
||||
- MedicalDoctorPDA
|
||||
- CommonMedicalShoes # WD
|
||||
- CommonMedicalGloves # WD
|
||||
- MedicalDoctorPDA # WD
|
||||
- Trinkets
|
||||
|
||||
- type: roleLoadout
|
||||
@@ -521,10 +528,9 @@
|
||||
- ChemistEyes
|
||||
- CommonMedicalMask # WD
|
||||
- ChemistJumpsuit
|
||||
- MedicalGloves
|
||||
- ChemistBackpack
|
||||
- ChemistOuterClothing
|
||||
- CommonMedicalGloves
|
||||
- CommonMedicalGloves # WD
|
||||
- ChemistShoes
|
||||
- ChemistPDA
|
||||
- Trinkets
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
- type: accent
|
||||
id: gondola
|
||||
fullReplacements:
|
||||
- accent-words-gondola-1
|
||||
9
Resources/Prototypes/_White/Catalog/Fills/Crates/npc.yml
Normal file
@@ -0,0 +1,9 @@
|
||||
- type: entity
|
||||
parent: CrateLivestock
|
||||
id: CrateNPCGondola
|
||||
name: ящик с Гондолой
|
||||
description: Ящик содержащий в себе Гондолу.
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: MobGondola
|
||||
@@ -292,3 +292,14 @@
|
||||
categories:
|
||||
- UplinkDisruption
|
||||
saleLimit: 2
|
||||
|
||||
- type: listing
|
||||
id: UplinkCrateNPCGondola
|
||||
name: uplink-gondola-name
|
||||
description: uplink-gondola-desc
|
||||
icon: { sprite: /Textures/White/Mobs/Animals/gondola.rsi, state: icon }
|
||||
productEntity: CrateNPCGondola
|
||||
cost:
|
||||
Telecrystal: 2
|
||||
categories:
|
||||
- UplinkDisruption
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
- type: entity
|
||||
parent: MarkerBase
|
||||
id: SpawnMobGondola
|
||||
name: спавнер Гондола
|
||||
components:
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: green
|
||||
- sprite: White/Mobs/Animals/gondola.rsi
|
||||
state: icon
|
||||
- type: ConditionalSpawner
|
||||
prototypes:
|
||||
- MobGondola
|
||||
96
Resources/Prototypes/_White/Entities/Mobs/NPCs/gondola.yml
Normal file
@@ -0,0 +1,96 @@
|
||||
- type: entity
|
||||
parent:
|
||||
- MobRespirator
|
||||
- MobAtmosStandard
|
||||
- BaseSimpleMob
|
||||
- MobBloodstream
|
||||
- MobFlammable
|
||||
id: MobGondola
|
||||
name: Гондола
|
||||
description: Не имея рук, он воплощает даосский принцип у-вэй (бездействия), а выражение его улыбающегося лица показывает его полное принятие мира таким, какой он есть.
|
||||
components:
|
||||
- type: FloatingVisuals
|
||||
- type: RotationVisuals
|
||||
defaultRotation: 90
|
||||
horizontalRotation: 90
|
||||
- type: Sprite
|
||||
sprite: White/Mobs/Animals/gondola.rsi
|
||||
layers:
|
||||
- state: gondola_body_medium
|
||||
map: [ "enum.DamageStateVisualLayers.Base" ]
|
||||
color: "#6e4e40"
|
||||
shader: unshaded
|
||||
- state: gondola_moustache_large_short
|
||||
map: [ "enum.DamageStateVisualLayers.BaseUnshaded" ]
|
||||
shader: unshaded
|
||||
- type: RandomSprite
|
||||
available:
|
||||
- enum.DamageStateVisualLayers.Base:
|
||||
gondola_body_long: GondolaBrowns
|
||||
gondola_body_medium: GondolaBrowns
|
||||
enum.DamageStateVisualLayers.BaseUnshaded:
|
||||
gondola_moustache_large: ""
|
||||
gondola_moustache_small: ""
|
||||
- enum.DamageStateVisualLayers.Base:
|
||||
gondola_body_medium: GondolaBrowns
|
||||
gondola_body_short: GondolaBrowns
|
||||
enum.DamageStateVisualLayers.BaseUnshaded:
|
||||
gondola_moustache_large_short: ""
|
||||
gondola_moustache_small_short: ""
|
||||
- type: Fixtures
|
||||
fixtures:
|
||||
fix1:
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.2
|
||||
density: 50
|
||||
mask:
|
||||
- MobMask
|
||||
layer:
|
||||
- MobLayer
|
||||
- type: Butcherable
|
||||
spawned:
|
||||
- id: FoodMeatGondola
|
||||
amount: 3
|
||||
- type: Bloodstream
|
||||
bloodMaxVolume: 150
|
||||
- type: Damageable
|
||||
damageContainer: Biological
|
||||
damageModifierSet: Scale
|
||||
- type: Tag
|
||||
tags:
|
||||
- VimPilot
|
||||
- type: MovementSpeedModifier
|
||||
baseWalkSpeed: 1
|
||||
baseSprintSpeed: 2
|
||||
- type: Speech
|
||||
speechVerb: Gondola
|
||||
speechSounds: GoofyAhh
|
||||
- type: ReplacementAccent
|
||||
accent: gondola
|
||||
- type: HTN
|
||||
rootTask:
|
||||
task: IdleCompound
|
||||
- type: Body
|
||||
prototype: Animal
|
||||
- type: NameIdentifier
|
||||
group: GenericNumber
|
||||
- type: SlowOnDamage
|
||||
speedModifierThresholds:
|
||||
60: 0.7
|
||||
80: 0.5
|
||||
- type: MobPrice
|
||||
price: 1000
|
||||
- type: Perishable
|
||||
- type: GhostRole
|
||||
makeSentient: true
|
||||
allowSpeech: true
|
||||
allowMovement: true
|
||||
name: Гондола
|
||||
description: Ты Гондола.
|
||||
raffle:
|
||||
settings: default
|
||||
- type: GhostTakeoverAvailable
|
||||
- type: NpcFactionMember
|
||||
factions:
|
||||
- Passive
|
||||
@@ -0,0 +1,54 @@
|
||||
# RAW
|
||||
|
||||
- type: entity
|
||||
parent: FoodMeatRawBase
|
||||
id: FoodMeatGondola
|
||||
name: raw Gondola meat
|
||||
description: You're a monster.
|
||||
components:
|
||||
- type: Sprite
|
||||
state: plain
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
food:
|
||||
reagents:
|
||||
- ReagentId: UncookedAnimalProteins
|
||||
Quantity: 9
|
||||
- ReagentId: Fat
|
||||
Quantity: 9
|
||||
- ReagentId: Tranquility
|
||||
Quantity: 10
|
||||
- type: Construction
|
||||
graph: GondolaSteak
|
||||
node: start
|
||||
defaultTarget: gondola steak
|
||||
|
||||
# COOKED
|
||||
|
||||
- type: entity
|
||||
parent: FoodMeatBase
|
||||
id: FoodMeatGondolaCooked
|
||||
name: Gondola steak
|
||||
description: Cooked Gondola meat...
|
||||
components:
|
||||
- type: Tag
|
||||
tags:
|
||||
- Cooked
|
||||
- Meat
|
||||
- Steak
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: plain-cooked
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
food:
|
||||
reagents:
|
||||
- ReagentId: Nutriment
|
||||
Quantity: 5
|
||||
- ReagentId: Protein
|
||||
Quantity: 5
|
||||
- ReagentId: Tranquility
|
||||
Quantity: 15
|
||||
- type: Construction
|
||||
graph: GondolaSteak
|
||||
node: gondola steak
|
||||
8
Resources/Prototypes/_White/Palettes/sixteen.yml
Normal file
@@ -0,0 +1,8 @@
|
||||
- type: palette
|
||||
id: GondolaBrowns
|
||||
name: коричневая Гондола
|
||||
colors:
|
||||
brown: "#6e4e40"
|
||||
brown1: "#593d31"
|
||||
brown2: "#6e4330"
|
||||
brown3: "#73422d"
|
||||
10
Resources/Prototypes/_White/Polymorphs/polymorph.yml
Normal file
@@ -0,0 +1,10 @@
|
||||
- type: polymorph
|
||||
id: Gondola
|
||||
configuration:
|
||||
entity: MobGondola
|
||||
forced: true
|
||||
transferName: false
|
||||
transferHumanoidAppearance: false
|
||||
inventory: Drop
|
||||
revertOnDeath: true
|
||||
revertOnCrit: false
|
||||
40
Resources/Prototypes/_White/Reagents/fun.yml
Normal file
@@ -0,0 +1,40 @@
|
||||
- type: reagent
|
||||
id: Tranquility
|
||||
group: Toxins
|
||||
name: reagent-name-tranquility
|
||||
desc: reagent-desc-tranquility
|
||||
physicalDesc: reagent-physical-desc-calming
|
||||
flavor: mindful
|
||||
color: "#915E48"
|
||||
metabolisms:
|
||||
Poison:
|
||||
metabolismRate: 0.25
|
||||
effects:
|
||||
- !type:PopupMessage
|
||||
type: Local
|
||||
messages: [ "reagent-popup-tranquility" ]
|
||||
probability: 0.2
|
||||
- !type:GenericStatusEffect
|
||||
key: Muted
|
||||
component: Muted
|
||||
refresh: false
|
||||
type: Add
|
||||
conditions:
|
||||
- !type:ReagentThreshold
|
||||
min: 5
|
||||
- !type:GenericStatusEffect
|
||||
key: Pacified
|
||||
component: Pacified
|
||||
refresh: false
|
||||
type: Add
|
||||
conditions:
|
||||
- !type:ReagentThreshold
|
||||
min: 10
|
||||
- !type:Polymorph
|
||||
prototype: Gondola
|
||||
conditions:
|
||||
- !type:OrganType
|
||||
type: Animal
|
||||
shouldHave: false
|
||||
- !type:ReagentThreshold
|
||||
min: 30
|
||||
@@ -0,0 +1,15 @@
|
||||
- type: constructionGraph
|
||||
id: GondolaSteak
|
||||
start: start
|
||||
graph:
|
||||
- node: start
|
||||
edges:
|
||||
- to: gondola steak
|
||||
completed:
|
||||
- !type:PlaySound
|
||||
sound: /Audio/Effects/sizzle.ogg
|
||||
steps:
|
||||
- minTemperature: 345
|
||||
|
||||
- node: gondola steak
|
||||
entity: FoodMeatGondolaCooked
|
||||
@@ -0,0 +1,8 @@
|
||||
- type: speechSounds
|
||||
id: GoofyAhh
|
||||
saySound:
|
||||
path: /Audio/White/Voice/SpeechSounds/kazooie/ehh.ogg
|
||||
askSound:
|
||||
path: /Audio/White/Voice/SpeechSounds/kazooie/ehh3.ogg
|
||||
exclaimSound:
|
||||
path: /Audio/White/Voice/SpeechSounds/kazooie/ehh2.ogg
|
||||
6
Resources/Prototypes/_White/Voice/speech_verbs.yml
Normal file
@@ -0,0 +1,6 @@
|
||||
- type: speechVerb
|
||||
id: Gondola
|
||||
name: chat-speech-verb-name-gondola
|
||||
speechVerbStrings:
|
||||
- chat-speech-verb-gondola-1
|
||||
- chat-speech-verb-gondola-2
|
||||
|
After Width: | Height: | Size: 499 B |
|
After Width: | Height: | Size: 497 B |
|
After Width: | Height: | Size: 495 B |
|
After Width: | Height: | Size: 274 B |
|
After Width: | Height: | Size: 273 B |
|
After Width: | Height: | Size: 273 B |
|
After Width: | Height: | Size: 274 B |
BIN
Resources/Textures/White/Mobs/Animals/gondola.rsi/icon.png
Normal file
|
After Width: | Height: | Size: 439 B |
42
Resources/Textures/White/Mobs/Animals/gondola.rsi/meta.json
Normal file
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "Taken from /TG/ station | Edited by PuroSlavKing (Github) ",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "icon"
|
||||
},
|
||||
{
|
||||
"name": "gondola_body_long",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "gondola_body_medium",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "gondola_body_short",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "gondola_moustache_large",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "gondola_moustache_small",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "gondola_moustache_large_short",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "gondola_moustache_small_short",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||