Merge branch 'master' into StormyV_Con

This commit is contained in:
storm! 2026-07-31 17:07:10 -07:00 committed by GitHub
commit 34a6abe39b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
271 changed files with 2124 additions and 2523 deletions

View File

@ -59,9 +59,12 @@
<Label Text="{Loc 'health-analyzer-window-entity-temperature-text'}" />
<Label Name="TemperatureLabel" />
<Label Text="{Loc 'health-analyzer-window-entity-blood-level-text'}" />
<Label Name="BloodLabel" />
<Label Text="{Loc 'health-analyzer-window-entity-damage-total-text'}" />
<Label Name="DamageLabel" />
<!-- Begin DeltaV - Health Analyzer Plus -->
<Label Name="BloodLevelLabel" />
<!-- Label Name="BloodLabel" / -->
<!-- Label Text="{Loc 'health-analyzer-window-entity-damage-total-text'}" / -->
<!-- Label Name="DamageLabel" / -->
<!-- End DeltaV - Health Analyzer Plus -->
</GridContainer>
</BoxContainer>
@ -73,10 +76,41 @@
<PanelContainer StyleClasses="LowDivider" />
<BoxContainer
Name="GroupsContainer"
Margin="0 5 0 5"
Orientation="Vertical">
</BoxContainer>
<!-- Begin DeltaV - Health Analyzer Plus -->
<!-- BoxContainer Name="GroupsContainer" Margin="0 5 0 5" Orientation="Vertical" -->
<!-- /BoxContainer -->
<GridContainer Margin="0 5 0 5" Columns="3" HorizontalAlignment="Center">
<BoxContainer Name="DamageBox" Margin="5 5 5 5" Orientation="Vertical">
<Label Name="TotalDamageLabel" HorizontalAlignment="Center" />
<PanelContainer Name="DamageGroupsDivider" StyleClasses="LowDivider" />
<Label
Name="NoDamageLabel"
HorizontalAlignment="Center"
Text="{Loc 'health-analyzer-plus-window-no-damage-text'}"
FontColorOverride="DeepSkyBlue"
Margin="0 5 0 5" />
<BoxContainer HorizontalAlignment="Center">
<BoxContainer Name="DamageGroupsContainer" Margin="0 5 0 5" Orientation="Vertical" />
</BoxContainer>
</BoxContainer>
<PanelContainer StyleClasses="LowDivider" />
<BoxContainer Name="BloodstreamBox" Margin="5 5 5 5" Orientation="Vertical">
<Label Name="TotalReagentQuantityLabel" HorizontalAlignment="Center" />
<PanelContainer Name="BloodstreamReagentsDivider" StyleClasses="LowDivider" />
<Label
Name="NoReagentsLabel"
HorizontalAlignment="Center"
Text="{Loc 'health-analyzer-plus-window-no-reagents-text'}"
FontColorOverride="DeepSkyBlue"
Margin="0 5 0 5" />
<BoxContainer HorizontalAlignment="Center">
<BoxContainer Name="BloodstreamReagentListContainer" Orientation="Vertical" Margin="0 5 0 5" />
</BoxContainer>
</BoxContainer>
</GridContainer>
<!-- End DeltaV - Health Analyzer Plus -->
</BoxContainer>

View File

@ -19,12 +19,25 @@ using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
// BEGIN DeltaV
using Content.Client._DV.Traits.Assorted;
using Content.Shared._DV.Traits.Assorted;
using Content.Shared._DV.Medical; // Uncloneable
using Content.Shared._DV.MedicalRecords; // Medical Records
// Health Analyzer Plus
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.Body.Systems;
using Content.Client.Body.Systems;
using Content.Shared.Chemistry.EntitySystems;
using Content.Client.Chemistry.Containers.EntitySystems;
using Content.Shared.Body.Components;
// END DeltaV
namespace Content.Client.HealthAnalyzer.UI;
using Content.Client._DV.Traits.Assorted; // DeltaV
using Content.Shared._DV.Traits.Assorted; // DeltaV
using Content.Shared._DV.Medical; // DeltaV - Uncloneable
using Content.Shared._DV.MedicalRecords; // DeltaV - Medical Records
// Health analyzer UI is split from its window because it's used by both the
// health analyzer item and the cryo pod UI.
@ -32,6 +45,8 @@ using Content.Shared._DV.MedicalRecords; // DeltaV - Medical Records
[GenerateTypedNameReferences]
public sealed partial class HealthAnalyzerControl : BoxContainer
{
private const string REAGENT_GROUP_MEDICINE = "Medicine"; // DeltaV - Health Analyzer
private readonly IEntityManager _entityManager;
private readonly SpriteSystem _spriteSystem;
private readonly IPrototypeManager _prototypes;
@ -41,6 +56,8 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
private readonly UnborgableSystem _unborgable; // DeltaV
private readonly RedshirtSystem _redshirt; // DeltaV
private readonly UncloneableSystem _uncloneable; // DeltaV
private readonly SharedBloodstreamSystem _bloodstream; // DeltaV
private readonly SharedSolutionContainerSystem _solutionContainer; // DeltaV
// Begin DeltaV - Medical Records
private readonly ButtonGroup _triageStatusGroup = new();
@ -66,6 +83,8 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
_unborgable = _entityManager.System<UnborgableSystem>(); // DeltaV
_redshirt = _entityManager.System<RedshirtSystem>(); // DeltaV
_uncloneable = _entityManager.System<UncloneableSystem>(); // DeltaV
_bloodstream = _entityManager.System<BloodstreamSystem>(); // DeltaV
_solutionContainer = _entityManager.System<SolutionContainerSystem>(); // DeltaV
// Begin DeltaV - Medical Records
foreach (var item in Enum.GetValues<TriageStatus>())
@ -138,9 +157,13 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
? $"{state.Temperature - Atmospherics.T0C:F1} °C ({state.Temperature:F1} K)"
: Loc.GetString("health-analyzer-window-entity-unknown-value-text");
// Begin DeltaV - Health Analyzer Plus
/*
BloodLabel.Text = !float.IsNaN(state.BloodLevel)
? $"{state.BloodLevel * 100:F1} %"
: Loc.GetString("health-analyzer-window-entity-unknown-value-text");
*/
// End DeltaV - Health Analyzer Plus
StatusLabel.Text =
_entityManager.TryGetComponent<MobStateComponent>(target.Value, out var mobStateComponent)
@ -149,7 +172,7 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
// Total Damage
DamageLabel.Text = _damageable.GetTotalDamage(target.Value).ToString();
// DamageLabel.Text = _damageable.GetTotalDamage(target.Value).ToString(); // DeltaV - Health Analyzer Plus
// Alerts
// DeltaV traits - This is going to be horrid if we just keep adding things like this.
@ -216,6 +239,7 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
var damagePerType = _damageable.GetAllDamage(target.Value).DamageDict;
DrawDiagnosticGroups(damageSortedGroups, damagePerType);
DrawBloodstreamInfo(target.Value, state.BloodSolution, state.BloodLevel); // End DeltaV - Health Analyzer Plus
// Begin DeltaV - Medical Records
if (state.MedicalRecord is not { } records)
@ -254,7 +278,15 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
Dictionary<ProtoId<DamageGroupPrototype>, FixedPoint2> groups,
IReadOnlyDictionary<ProtoId<DamageTypePrototype>, FixedPoint2> damageDict)
{
GroupsContainer.RemoveAllChildren();
// Begin DeltaV - Health Analyzer Plus
// GroupsContainer.RemoveAllChildren();
DamageGroupsContainer.RemoveAllChildren();
// Begin DeltaV - Health Analyzer Plus
var totalDamage = damageDict.Sum(x => x.Value.Double());
TotalDamageLabel.Text = Loc.GetString("health-analyzer-plus-window-entity-total-damage-text", ("amount", Math.Round(totalDamage, 2)));
NoDamageLabel.Visible = totalDamage == 0;
// End DeltaV - Health Analyzer Plus
foreach (var (damageGroupId, damageAmount) in groups)
{
@ -275,7 +307,8 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
groupContainer.AddChild(CreateDiagnosticGroupTitle(groupTitleText, damageGroupId));
GroupsContainer.AddChild(groupContainer);
// GroupsContainer.AddChild(groupContainer); // DeltaV - Health Analyzer Plus
DamageGroupsContainer.AddChild(groupContainer); // DeltaV - Health Analyzer Plus
// Show the damage for each type in that group.
var group = _prototypes.Index(damageGroupId);
@ -296,6 +329,116 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
}
}
// Begin DeltaV - Health Analyzer Plus
private void DrawBloodstreamInfo(EntityUid target, Solution? bloodSolution, float bloodlevel)
{
BloodstreamReagentListContainer.RemoveAllChildren();
List<ReagentQuantity> bloodstream = new();
double totalReagentQuantity = 0;
double unknownReagents = 0;
// Make sure we can access the bloodtype and reagents before trying to use them
if (bloodSolution is not null)
{
if (!_entityManager.TryGetComponent<BloodstreamComponent>(target, out var bloodstreamComp) ||
!_solutionContainer.ResolveSolution(target, bloodstreamComp.BloodSolutionName, ref bloodstreamComp.BloodSolution, out var bloodReagentSolution))
return;
// Get the blood reagent IDs to ignore in the scan
var bloodReagentIds = bloodstreamComp.BloodReferenceSolution.Select(b => b.Reagent);
// Get all of the medicines in the bloodstream
foreach (var reagent in bloodSolution!.Contents)
{
if (bloodReagentIds.Contains(reagent.Reagent))
continue;
if (_prototypes.Index<ReagentPrototype>(reagent.Reagent.Prototype).Group == REAGENT_GROUP_MEDICINE)
{
bloodstream.Add(reagent);
totalReagentQuantity += reagent.Quantity.Double();
}
else
{
unknownReagents += reagent.Quantity.Double();
}
}
}
var bloodQuantityPercent = !float.IsNaN(bloodlevel)
? $"{bloodlevel * 100:F1} %"
: Loc.GetString("health-analyzer-window-entity-unknown-value-text");
// Display the percent and amount of blood in the system
// Normal health scanner is percent only, this one adds the actual units too
BloodLevelLabel.Text = Loc.GetString(
"health-analyzer-plus-window-entity-blood-level-quantity-text",
("percent", bloodQuantityPercent)
);
// Display the total amount of reagents in the bloodstream, 0 is valid
TotalReagentQuantityLabel.Text = Loc.GetString(
"health-analyzer-plus-window-entity-total-reagents-text",
("amount", Math.Round(totalReagentQuantity, 1).ToString("0.0"))
);
// If the bloodstream was empty, display a message instead to fill the space with something
NoReagentsLabel.Visible = bloodstream.Count == 0 && unknownReagents == 0;
// For each of the reagents in the bloodstream, add them to the list of reagents
// If there are none, this loop will simply do nothing
foreach (var (reagentID, reagentQuantity) in bloodstream)
{
var reagentPrototype = _prototypes.Index<ReagentPrototype>(reagentID.Prototype);
// Make a new container for each reagent we add to the list
var reagentContainer = new BoxContainer
{
Align = AlignMode.Begin,
Orientation = LayoutOrientation.Vertical
};
// Add the string "[] <reagent_name>: <reagent_amount>u" for the current reagent
// The [] is a unicode block character, and is colored with the reagent color
// to make it easier to identify
reagentContainer.AddChild(
new RichTextLabel
{
Text = Loc.GetString("health-analyzer-plus-window-reagent-text",
("reagentColor", reagentPrototype.SubstanceColor),
("reagentName", reagentPrototype.LocalizedName),
("amount", Math.Round(reagentQuantity.Double(), 1).ToString("0.0"))
)
}
);
BloodstreamReagentListContainer.AddChild(reagentContainer);
}
// Add unknown reagents (if any)
if (unknownReagents > 0)
{
var unknownReagentContainer = new BoxContainer
{
Align = AlignMode.Begin,
Orientation = LayoutOrientation.Vertical
};
unknownReagentContainer.AddChild(
new RichTextLabel
{
Text = Loc.GetString("health-analyzer-plus-window-unknown-reagents-text",
("amount", Math.Round(unknownReagents, 1).ToString("0.0"))
)
}
);
BloodstreamReagentListContainer.AddChild(unknownReagentContainer);
}
return;
}
// End DeltaV - Health Analyzer Plus
private Texture GetTexture(string texture)
{
var rsiPath = new ResPath("/Textures/Objects/Devices/health_analyzer.rsi");

View File

@ -7,7 +7,9 @@
<ScrollContainer
Margin="5 5 5 5"
ReturnMeasure="True"
VerticalExpand="True">
VerticalExpand="True"
VScrollBarHidden="True"
HScrollBarHidden="True"> <!-- DeltaV - Hide the scroll bars -->
<ui:HealthAnalyzerControl
Name="HealthAnalyzer"

View File

@ -88,9 +88,9 @@ public sealed partial class CryoPodWindow : FancyWindow
// Health analyzer
var maybePatient = _entityManager.GetEntity(msg.Health.TargetEntity);
var hasPatient = msg.Health.TargetEntity.HasValue;
var hasDamage = hasPatient && msg.HasDamage;
// var hasDamage = hasPatient && msg.HasDamage; // DeltaV - Health Analyzer Plus
NoDamageText.Visible = (hasPatient && !hasDamage);
NoDamageText.Visible = false; //(hasPatient && !hasDamage); // DeltaV - Health Analyzer Plus
HealthSection.Visible = hasPatient;
EjectPatientButton.Disabled = !hasPatient;

View File

@ -1,9 +1,8 @@
<controls:FancyWindow xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:customControls="clr-namespace:Content.Client.Administration.UI.CustomControls"
xmlns:chassisSpriteControls="clr-namespace:Content.Client._CD.Silicons.Borgs.UI"
Title="{Loc 'borg-select-type-menu-title'}"
SetSize="600 480">
SetSize="550 300">
<BoxContainer Orientation="Vertical">
<BoxContainer Orientation="Horizontal" VerticalExpand="True">
<!-- Left pane: selection of borg type -->
@ -30,9 +29,6 @@
<RichTextLabel Name="DescriptionLabel" VerticalExpand="True" VerticalAlignment="Top" />
</BoxContainer>
</Control>
<chassisSpriteControls:ChassisSpriteSelection Name="ChassisSpriteSelection"/> <!-- CD change -->
<controls:ConfirmButton Name="ConfirmTypeButton" Text="{Loc 'borg-select-type-menu-confirm'}"
Disabled="True" HorizontalAlignment="Right"
MinWidth="200" />

View File

@ -1,7 +1,6 @@
using System.Linq;
using Content.Client.UserInterface.Controls;
using Content.Client.UserInterface.Systems.Guidebook;
using Content.Shared._CD.Silicons; // CosmicDrift
using Content.Shared.Guidebook;
using Content.Shared.Silicons.Borgs;
using Content.Shared.Silicons.Borgs.Components;
@ -30,7 +29,6 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
private BorgTypePrototype? _selectedBorgType;
public event Action<ProtoId<BorgTypePrototype>>? ConfirmedBorgType;
public event Action<EntityPrototype?>? ConfirmedBorgSubtype; // CosmicDrift event - borg subtypes
private static readonly List<ProtoId<GuideEntryPrototype>> GuidebookEntries = new() { "Cyborgs", "Robotics" };
@ -58,13 +56,6 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
ConfirmTypeButton.OnPressed += ConfirmButtonPressed;
HelpGuidebookIds = GuidebookEntries;
// Start CosmicDrift Changes - borg subtypes
ChassisSpriteSelection.SubtypeSelected += () =>
{
ConfirmTypeButton.Disabled = false;
};
// End CosmicDrift Changes - borg subtypes
}
private void UpdateInformation(BorgTypePrototype prototype)
@ -96,14 +87,6 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
NameLabel.Text = PrototypeName(prototype);
DescriptionLabel.Text = Loc.GetString($"borg-type-{prototype.ID}-desc");
ChassisView.SetPrototype(prototype.DummyPrototype);
// Start CosmicDrift Changes - borg subtypes
if (_selectedBorgType != null)
{
ConfirmTypeButton.Disabled = true;
ChassisSpriteSelection.Update(_selectedBorgType);
}
// End CosmicDrift Changes - borg subtypes
}
private void ConfirmButtonPressed(BaseButton.ButtonEventArgs obj)
@ -111,7 +94,6 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
if (_selectedBorgType == null)
return;
ConfirmedBorgSubtype?.Invoke(ChassisSpriteSelection.SubtypePrototype); // CosmicDrift
ConfirmedBorgType?.Invoke(_selectedBorgType);
}

View File

@ -1,6 +1,4 @@
using Content.Shared._CD.Silicons; // CosmicDrift
using Content.Shared._CD.Silicons.Borgs; // CosmicDrift
using Content.Shared.Silicons.Borgs.Components;
using Content.Shared.Silicons.Borgs.Components;
using JetBrains.Annotations;
using Robust.Client.UserInterface;
@ -28,6 +26,5 @@ public sealed class BorgSelectTypeUserInterface : BoundUserInterface
_menu = this.CreateWindow<BorgSelectTypeMenu>();
_menu.ConfirmedBorgType += prototype => SendPredictedMessage(new BorgSelectTypeMessage(prototype));
_menu.ConfirmedBorgSubtype += subtypePrototype => SendPredictedMessage(new BorgSelectSubtypeMessage(subtypePrototype?.ID)); // CosmicDrift - borg subtypes
}
}

View File

@ -1,12 +1,9 @@
using Content.Client.PDA; // DeltaV
using Content.Shared._CD.Silicons.Borgs; // CosmicDrift
using Content.Client.PDA; // DeltaV
using Content.Shared.Movement.Components;
using Content.Shared.Silicons.Borgs;
using Content.Shared.Silicons.Borgs.Components;
using Robust.Client.GameObjects;
using Robust.Client.ResourceManagement; // CosmicDrift
using Robust.Shared.Serialization.TypeSerializers.Implementations; // CosmicDrift
using Robust.Shared.Timing; // CosmicDrift
using Robust.Shared.Serialization; // DeltaV
namespace Content.Client.Silicons.Borgs;
@ -20,7 +17,6 @@ public sealed partial class BorgSwitchableTypeSystem : SharedBorgSwitchableTypeS
[Dependency] private readonly BorgSystem _borgSystem = default!;
[Dependency] private readonly AppearanceSystem _appearance = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private readonly IGameTiming _timing = default!; // CosmicDrift - borg subtypes
public override void Initialize()
{
@ -44,20 +40,15 @@ public sealed partial class BorgSwitchableTypeSystem : SharedBorgSwitchableTypeS
Entity<BorgSwitchableTypeComponent> entity,
BorgTypePrototype prototype)
{
// Begin Afterlight Addition - added checks to stop sprite state errors
if (!_timing.IsFirstTimePredicted)
return;
if (TryComp<BorgSwitchableSubtypeComponent>(entity, out var subtype) &&
subtype.BorgSubtype != null)
{
var ev = new TypeTryingToUpdateVisualsEvent();
RaiseLocalEvent(entity, ref ev);
return;
}
// End Afterlight Additions - added checks to stop sprite state errors
// Begin DeltaV Additions
if (prototype.ClientComponents is {} add)
EntityManager.AddComponents(entity, add);
// End DeltaV Additions
if (TryComp(entity, out SpriteComponent? sprite))
{
// Begin DeltaV Additions - work around engine bug with AddComponents
((ISerializationHooks) sprite).AfterDeserialization();
// End DeltaV Additions
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.Body, prototype.SpriteBodyState);
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.LightStatus, prototype.SpriteToggleLightState);
}
@ -85,26 +76,6 @@ public sealed partial class BorgSwitchableTypeSystem : SharedBorgSwitchableTypeS
}
// DeltaV - borg pdas
// Start CosmicDrift Changes - borg subtypes
if (prototype.SpriteBodyMovementState is { } movementState)
{
var spriteMovement = EnsureComp<SpriteMovementComponent>(entity);
spriteMovement.NoMovementLayers.Clear();
spriteMovement.NoMovementLayers["movement"] = new PrototypeLayerData
{
State = prototype.SpriteBodyState,
};
spriteMovement.MovementLayers.Clear();
spriteMovement.MovementLayers["movement"] = new PrototypeLayerData
{
State = movementState,
};
}
else
{
RemComp<SpriteMovementComponent>(entity);
}
// End CosmicDrift Changes - borg subtypes
base.UpdateEntityAppearance(entity, prototype);
}
}

View File

@ -1,102 +0,0 @@
using System.Linq;
using Content.Client.Silicons.Borgs;
using Content.Shared._CD.Silicons.Borgs;
using Content.Shared.Movement.Components;
using Content.Shared.Silicons.Borgs.Components;
using Robust.Client.GameObjects;
using Robust.Shared.Prototypes;
namespace Content.Client._CD.Silicons.Borgs;
/// <summary>
/// Primarily handles the appearance aspects of the borg subtype.
/// </summary>
public sealed class BorgSwitchableSubtypeSystem : SharedBorgSwitchableSubtypeSystem
{
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private readonly BorgSystem _borg = default!;
[Dependency] private readonly AppearanceSystem _appearance = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<BorgSwitchableSubtypeComponent, ComponentStartup>(OnComponentStartup);
SubscribeLocalEvent<BorgSwitchableSubtypeComponent, AfterAutoHandleStateEvent>(OnAutoHandleEvent);
}
private void OnAutoHandleEvent(Entity<BorgSwitchableSubtypeComponent> ent, ref AfterAutoHandleStateEvent args)
{
SelectBorgSubtype(ent);
}
private void OnComponentStartup(Entity<BorgSwitchableSubtypeComponent> ent, ref ComponentStartup args)
{
SelectBorgSubtype(ent);
}
protected override void UpdateEntityAppearance(Entity<BorgSwitchableSubtypeComponent> entity, EntityPrototype borgSubtypePrototype)
{
// LOT of copy pasted code from BorgSwitchableTypeSystem, but is probably necessary unless the upstream code
// is refactored
if (!borgSubtypePrototype.TryGetComponent<BorgSubtypeDefinitionComponent>(out var borgSubtype, ComponentFactory))
return;
// get our required components
var (owner, _) = entity;
if (!TryComp<SpriteComponent>(entity, out var chassisSprite))
return;
// remove all existing layers
for (int i = chassisSprite.AllLayers.Count() - 1; i >= 0; i--)
{
_sprite.RemoveLayer((entity, chassisSprite), i);
}
for (int i = 0; i < borgSubtype.LayerData.Length; i++)
{
var layerData = borgSubtype.LayerData[i];
layerData.RsiPath = borgSubtype.SpritePath?.ToString();
if (borgSubtype.Offset != null)
layerData.Offset = borgSubtype.Offset;
_sprite.AddLayer((owner, chassisSprite), layerData, i);
}
if (TryComp<BorgChassisComponent>(entity, out var chassis))
{
_borg.SetMindStates(
(entity.Owner, chassis),
borgSubtype.SpriteHasMindState,
borgSubtype.SpriteNoMindState);
if (TryComp(entity, out AppearanceComponent? appearance))
{
// Queue update so state changes apply.
_appearance.QueueUpdate(entity, appearance);
}
}
if (borgSubtype.SpriteBodyMovementState is { } movementState)
{
var spriteMovement = EnsureComp<SpriteMovementComponent>(entity);
spriteMovement.NoMovementLayers.Clear();
spriteMovement.NoMovementLayers["movement"] = new PrototypeLayerData
{
State = borgSubtype.SpriteBodyState,
};
spriteMovement.MovementLayers.Clear();
spriteMovement.MovementLayers["movement"] = new PrototypeLayerData
{
State = movementState,
};
}
else
{
RemComp<SpriteMovementComponent>(entity);
}
base.UpdateEntityAppearance(entity, borgSubtypePrototype);
}
}

View File

@ -1,23 +0,0 @@
<Control xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls">
<BoxContainer Name="MainContainer"
Orientation="Vertical"
SeparationOverride="4"
Visible="False">
<controls:StripeBack>
<Label Text="{Loc 'cd-borg-select-subtype-flavour-text'}"
StyleClasses="LabelSubText"
HorizontalAlignment="Center"
Margin="0 12"/>
</controls:StripeBack>
<ScrollContainer Name="OptionsScrollContainer"
HScrollEnabled="True"
VScrollEnabled="False"
MinHeight="96">
<BoxContainer Name="OptionsContainer"
Orientation="Horizontal"
SeparationOverride="4"/>
</ScrollContainer>
</BoxContainer>
</Control>

View File

@ -1,99 +0,0 @@
using Content.Shared.Silicons.Borgs;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes;
namespace Content.Client._CD.Silicons.Borgs.UI;
[GenerateTypedNameReferences]
public sealed partial class ChassisSpriteSelection : Control
{
[Dependency] private readonly IComponentFactory _componentFactory = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
public EntityPrototype? SubtypePrototype;
public event Action? SubtypeSelected;
private const int PrototypeViewSize = 2;
private static readonly ProtoId<EntityCategoryPrototype> _borgSubtypeCategory = "BorgSubtype";
public ChassisSpriteSelection()
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
}
public void Update(BorgTypePrototype borgTypePrototype)
{
MainContainer.Visible = true;
OptionsContainer.RemoveAllChildren();
var buttonGroup = new ButtonGroup();
List<Button> buttons = new List<Button>();
buttons.Add(CreateDefaultSubtypeButton(borgTypePrototype, buttonGroup));
foreach (var ent in _prototype.Categories.GetValueRefOrNullRef(_borgSubtypeCategory))
{
if (!ent.TryGetComponent<Shared._CD.Silicons.Borgs.BorgSubtypeDefinitionComponent>(out var subtype, _componentFactory))
continue;
// Only add subtypes of the current selected 'main' borg type (engineering, medical, etc.)
if (subtype.ParentType != borgTypePrototype.ID)
continue;
var button = new Button
{
ToolTip = Loc.GetString($"al-borg-{borgTypePrototype.ID}-subtype-{ent.Name.Replace(' ', '-').ToLower()}-name"),
Group = buttonGroup,
MinHeight = 32,
};
button.OnPressed += _ =>
{
SubtypePrototype = ent;
SubtypeSelected?.Invoke();
};
button.AddChild(CreateEntityPrototypeView(subtype.DummyPrototype));
buttons.Add(button);
}
foreach (var button in buttons)
{
OptionsContainer.AddChild(button);
}
}
private Button CreateDefaultSubtypeButton(BorgTypePrototype borgTypePrototype, ButtonGroup group)
{
var button = new Button
{
ToolTip = "default",
Group = group,
MinHeight = 32,
};
button.OnPressed += _ =>
{
SubtypePrototype = null;
SubtypeSelected?.Invoke();
};
button.AddChild(CreateEntityPrototypeView(borgTypePrototype.DummyPrototype));
return button;
}
private EntityPrototypeView CreateEntityPrototypeView(EntProtoId entProtoId)
{
var entPrototypeView = new EntityPrototypeView();
entPrototypeView.SetPrototype(entProtoId);
entPrototypeView.Scale *= PrototypeViewSize;
return entPrototypeView;
}
}

View File

@ -23,6 +23,7 @@ using Content.Server.Body.Systems;
// Begin DeltaV
using Content.Server._DV.MedicalRecords;
using Content.Shared._DV.MedicalRecords;
using Content.Shared.Chemistry.Components;
// End DeltaV
namespace Content.Server.Medical;
@ -269,9 +270,11 @@ public sealed partial class HealthAnalyzerSystem : EntitySystem // DeltaV - Made
var bleeding = false;
var unrevivable = false;
Solution? bloodSolution = null; // DeltaV - Health Analyzer Plus
if (TryComp<BloodstreamComponent>(entity, out var bloodstream) &&
_solutionContainerSystem.ResolveSolution(entity, bloodstream.BloodSolutionName,
ref bloodstream.BloodSolution, out var bloodSolution))
ref bloodstream.BloodSolution, out bloodSolution)) // DeltaV - Health Analyzer Plus
{
bloodAmount = _bloodstreamSystem.GetBloodLevel(entity);
bleeding = bloodstream.BleedAmount > 0;
@ -287,6 +290,7 @@ public sealed partial class HealthAnalyzerSystem : EntitySystem // DeltaV - Made
null,
bleeding,
unrevivable,
bloodSolution, // DeltaV - Health Analyzer Plus
_medicalRecords.GetMedicalRecords(entity) // DeltaV - Medical Records
);
}

View File

@ -125,12 +125,12 @@ public sealed class ProjectileSystem : SharedProjectileSystem
RaiseLocalEvent(projectile, ref pierceEv);
// If the object won't be destroyed, it "tanks" the penetration hit.
if (damage.GetTotal() < damageRequired)
if (damage.GetTotal() < damageRequired && !pierceEv.Pierced) // DeltaV - Addition of the NT-3
{
return false;
}
if (!projectile.Comp.ProjectileSpent)
if (!projectile.Comp.ProjectileSpent && !pierceEv.Pierced) // DeltaV - Addition of the NT-3
{
projectile.Comp.PenetrationAmount += damageRequired;
// The projectile has dealt enough damage to be spent.
@ -139,7 +139,7 @@ public sealed class ProjectileSystem : SharedProjectileSystem
return false;
}
if (projectile.Comp.ProjectileSpent && pierceEv.Pierced) // DeltaV - Addition of the NT-3
if (projectile.Comp.ProjectileSpent)
{
return true;
}

View File

@ -1,43 +0,0 @@
using Content.Shared._CD.Silicons.Borgs;
using Content.Shared.Inventory;
namespace Content.Server._CD.Silicons.Borgs;
/// <summary>
/// Server-side logic that shouldn't be exposed to the client.
/// </summary>
public sealed class BorgSwitchableSubstypeSystem : SharedBorgSwitchableSubtypeSystem
{
[Dependency] private readonly InventorySystem _inventorySystem = default!;
protected override void SelectBorgSubtype(Entity<BorgSwitchableSubtypeComponent> ent)
{
if (ent.Comp.BorgSubtype == null)
return;
if (!Prototypes.Index(ent.Comp.BorgSubtype.Value)
.TryGetComponent<BorgSubtypeDefinitionComponent>(out var borgSubtype, ComponentFactory))
return;
// Configure special components
if (Prototypes.TryIndex(ent.Comp.BorgSubtype, out var previousPrototype) &&
previousPrototype.TryGetComponent<BorgSubtypeDefinitionComponent>(out var previousSubtype, ComponentFactory))
{
if (previousSubtype.AddComponents is { } removeComponents)
EntityManager.RemoveComponents(ent, removeComponents);
}
if (borgSubtype.AddComponents is { } addComponents)
{
EntityManager.AddComponents(ent, addComponents);
}
// inventory template configuration (hats spacing)
if (TryComp(ent, out InventoryComponent? inventory))
{
_inventorySystem.SetTemplateId((ent.Owner, inventory), borgSubtype.InventoryTemplateId);
}
base.SelectBorgSubtype(ent);
}
}

View File

@ -1,4 +1,5 @@
using Content.Shared.Tag;
using Content.Shared.Whitelist;
using Robust.Shared.Prototypes;
namespace Content.Server._DV.Projectiles.Components;
@ -21,10 +22,14 @@ public sealed partial class PiercingProjectileComponent : Component
public float PierceCounter;
/// <summary>
/// The tag that will cause the piercing bullet to increment it's <see cref="PierceCounter"/>.
/// The whitelist for checking what increments the <see cref="PierceCounter"/>.
/// </summary>
/// <example>
/// If this has the tag "Wall" in it, any entity with the tag "Wall" will increment <see cref="PierceCounter"/>
/// upon being hit.
/// </example>
[DataField]
public List<ProtoId<TagPrototype>> PierceBlockTag = ["Wall", "Window"];
public EntityWhitelist PierceCounterWhitelist;
/// <summary>
/// The number of entities it is allowed to pierce before being deleted.

View File

@ -3,7 +3,7 @@ using Content.Shared.FixedPoint;
namespace Content.Server._DV.Projectiles.Events;
/// <summary>
/// Raised when a piercing projectile hits an entity that doesn't follow upstream piercing rules.
/// Raised when a piercing projectile that doesn't follow upstream piercing rules hits an entity.
/// </summary>
[ByRefEvent]
public record struct ProjectilePierceEvent(EntityUid Target, FixedPoint2 RequiredDamage, bool Pierced = false);

View File

@ -1,29 +1,33 @@
using Content.Server._DV.Projectiles.Components;
using Content.Server._DV.Projectiles.Events;
using Content.Shared.Tag;
using Content.Shared.Whitelist;
namespace Content.Server._DV.Projectiles.Systems;
public sealed class PiercingProjectileSystem : EntitySystem
{
[Dependency] private readonly TagSystem _tagSystem = default!;
[Dependency] private readonly EntityWhitelistSystem _whitelist = default!;
// Mobs return a required Damage amount of Float.MaxValue. Therefore, we need to check for absurdly high values.
private readonly int _indestructibleNumber = 20000000;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PiercingProjectileComponent, ProjectilePierceEvent>(OnPierce);
}
private void OnPierce(Entity<PiercingProjectileComponent> bullet, ref ProjectilePierceEvent args)
{
// If the target doesn't have any tags to stop the bullet from piercing, it's automatically true.
if (!_tagSystem.HasAnyTag(args.Target, bullet.Comp.PierceBlockTag))
if (_whitelist.IsWhitelistFail(bullet.Comp.PierceCounterWhitelist, args.Target))
{
args.Pierced = true;
return;
}
// If it does have the tag to stop it and enough health to count as "strongly armored", it'll block the bullet.
if (bullet.Comp.HealthThreshold < args.RequiredDamage)
if (bullet.Comp.HealthThreshold < args.RequiredDamage && args.RequiredDamage < _indestructibleNumber)
return;
if (bullet.Comp.Direction == null) // Get the direction of the bullet to determine which walls count.

View File

@ -392,7 +392,6 @@ public abstract partial class SharedBuckleSystem
if (TryComp<PhysicsComponent>(buckle, out var physics))
_physics.ResetDynamics(buckle, physics);
// TOOD: DV - This fails when you try to buckle the entity you're carrying to something. Figure out why later.
DebugTools.AssertEqual(xform.ParentUid, strap.Owner);
}

View File

@ -2,8 +2,7 @@ using Content.Shared.Armor; // DeltaV - Addition of HandHeldArmor
using Content.Shared.Atmos;
using Content.Shared.Camera;
using Content.Shared.Cuffs;
using Content.Shared.Damage; // DeltaV End - Addition of HandHeldArmor
using Content.Shared.Damage.Systems; // DeltaV End - Addition of HandHeldArmor
using Content.Shared.Damage.Systems; // DeltaV - Addition of HandHeldArmor
using Content.Shared.Hands.Components;
using Content.Shared.Movement.Systems;
using Content.Shared.Projectiles;

View File

@ -1,4 +1,4 @@
using Content.Shared._DV.Overlays;
using Content.Shared._DV.Overlays; // DeltaV
using Content.Shared._DV.Psionics.Events; // DeltaV
using Content.Shared.Armor;
using Content.Shared.Atmos;
@ -85,13 +85,15 @@ public partial class InventorySystem
SubscribeLocalEvent<InventoryComponent, WieldAttemptEvent>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, UnwieldAttemptEvent>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, IngestionAttemptEvent>(RefRelayInventoryEvent);
// DeltaV Start - Psionic Events
// DeltaV Start
// Psionic Events
SubscribeLocalEvent<InventoryComponent, DispelledEvent>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, PsionicPowerUseAttemptEvent>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, TargetedByPsionicPowerEvent>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, NoosphericFryEvent>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, WeightlessnessChangedEvent>(RefRelayInventoryEvent); // Heavy Clothing
// DeltaV End - Psionic Events
// Heavy Clothing
SubscribeLocalEvent<InventoryComponent, WeightlessnessChangedEvent>(RefRelayInventoryEvent);
// DeltaV End
// Eye/vision events
SubscribeLocalEvent<InventoryComponent, CanSeeAttemptEvent>(RelayInventoryEvent);

View File

@ -1,4 +1,5 @@
using Content.Shared._DV.MedicalRecords; // DeltaV - Medical Records
using Content.Shared.Chemistry.Components; // DeltaV - Health Analyzer Plus
using Robust.Shared.Serialization;
namespace Content.Shared.MedicalScanner;
@ -29,11 +30,12 @@ public struct HealthAnalyzerUiState
public bool? ScanMode;
public bool? Bleeding;
public bool? Unrevivable;
public readonly Solution? BloodSolution; // DeltaV - Health Analyzer Plus
public MedicalRecord? MedicalRecord; // DeltaV - Medical Records
public HealthAnalyzerUiState() {}
public HealthAnalyzerUiState(NetEntity? targetEntity, float temperature, float bloodLevel, bool? scanMode, bool? bleeding, bool? unrevivable, MedicalRecord? medicalRecord = null) // DeltaV - Medical Records
public HealthAnalyzerUiState(NetEntity? targetEntity, float temperature, float bloodLevel, bool? scanMode, bool? bleeding, bool? unrevivable, Solution? bloodSolution, MedicalRecord? medicalRecord = null) // DeltaV - Health Analyzer Plus, Medical Records
{
TargetEntity = targetEntity;
Temperature = temperature;
@ -41,6 +43,7 @@ public struct HealthAnalyzerUiState
ScanMode = scanMode;
Bleeding = bleeding;
Unrevivable = unrevivable;
BloodSolution = bloodSolution; // DeltaV - Health Analyzer Plus
MedicalRecord = medicalRecord; // DeltaV - Medical Records
}
}

View File

@ -1,4 +1,5 @@
using Content.Shared.Access.Components;
using Content.Shared.Access.Systems; // DeltaV
using Content.Shared.Administration.Logs;
using Content.Shared.Database;
using Content.Shared.Doors.Components;
@ -19,6 +20,7 @@ namespace Content.Shared.Remotes.EntitySystems;
public abstract class SharedDoorRemoteSystem : EntitySystem
{
[Dependency] private readonly SharedAirlockSystem _airlock = default!;
[Dependency] private readonly AccessReaderSystem _accessReader = default!; // DeltaV
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedDoorSystem _doorSystem = default!;
[Dependency] private readonly SharedElectrocutionSystem _electrify = default!;
@ -96,6 +98,19 @@ public abstract class SharedDoorRemoteSystem : EntitySystem
else if (entity.Comp.RequireTagWhitelist)
return;
// Begin DeltaV - Emergency access only bypasses open/close; bolting and toggling emergency access still require actual access.
if (entity.Comp.Mode != OperatingMode.OpenClose
&& accessComponent != null
&& !_accessReader.IsAllowed(accessTarget, args.Target.Value, accessComponent))
{
if (isAirlock)
_doorSystem.Deny(args.Target.Value, doorComp, user: args.User, predicted: true);
_popup.PopupClient(Loc.GetString("door-remote-denied"), args.User, args.User);
return;
}
// End DeltaV
switch (entity.Comp.Mode)
{
case OperatingMode.OpenClose:

View File

@ -1,4 +1,3 @@
using Content.Shared._CD.Silicons.Borgs; // CosmicDrift - borg subtypes
using Content.Shared.Actions;
using Content.Shared.Interaction;
using Content.Shared.Interaction.Components;
@ -97,10 +96,6 @@ public abstract partial class SharedBorgSwitchableTypeSystem : EntitySystem // D
_userInterface.CloseUi((ent.Owner, null), BorgSwitchableTypeUiKey.SelectBorgType);
UpdateEntityAppearance(ent);
// AL - event for subtype system, always runs at end of borg type code
var ev = new AfterBorgTypeSelectEvent();
RaiseLocalEvent(ent, ref ev);
}
protected void UpdateEntityAppearance(Entity<BorgSwitchableTypeComponent> entity)
@ -125,25 +120,24 @@ public abstract partial class SharedBorgSwitchableTypeSystem : EntitySystem // D
{
footstepModifier.FootstepSoundCollection = prototype.FootstepCollection;
}
// Start CosmicDrift Changes - Moved to BorgSwitchableTypeSystem.cs
// if (prototype.SpriteBodyMovementState is { } movementState)
// {
// var spriteMovement = EnsureComp<SpriteMovementComponent>(entity);
// spriteMovement.NoMovementLayers.Clear();
// spriteMovement.NoMovementLayers["movement"] = new PrototypeLayerData
// {
// State = prototype.SpriteBodyState,
// };
// spriteMovement.MovementLayers.Clear();
// spriteMovement.MovementLayers["movement"] = new PrototypeLayerData
// {
// State = movementState,
// };
// }
// else
// {
// RemComp<SpriteMovementComponent>(entity);
// }
// End CosmicDrift Changes - Moved to BorgSwitchableTypeSystem.cs
if (prototype.SpriteBodyMovementState is { } movementState)
{
var spriteMovement = EnsureComp<SpriteMovementComponent>(entity);
spriteMovement.NoMovementLayers.Clear();
spriteMovement.NoMovementLayers["movement"] = new PrototypeLayerData
{
State = prototype.SpriteBodyState,
};
spriteMovement.MovementLayers.Clear();
spriteMovement.MovementLayers["movement"] = new PrototypeLayerData
{
State = movementState,
};
}
else
{
RemComp<SpriteMovementComponent>(entity);
}
}
}

View File

@ -1,6 +1,5 @@
using Content.Shared.Examine;
using Content.Shared.Mobs;
using Content.Shared.Mobs.Systems;
using Content.Shared.Stealth.Components;
using Robust.Shared.GameStates;
using Robust.Shared.Timing;

View File

@ -1,28 +0,0 @@
using Content.Shared.Prototypes;
using Robust.Shared.Prototypes;
namespace Content.Shared._CD.Prototypes;
public sealed class ALPrototypeSystem : EntitySystem
{
[Dependency] private readonly IComponentFactory _compFactory = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
public IEnumerable<(EntityPrototype Prototype, T Component)> EnumerateComponents<T>() where T : IComponent, new()
{
foreach (var entity in _prototype.EnumeratePrototypes<EntityPrototype>())
{
if (entity.TryGetComponent(out T? comp, _compFactory))
yield return (entity, comp);
}
}
public IEnumerable<EntityPrototype> EnumerateEntities<T>() where T : IComponent, new()
{
foreach (var entity in _prototype.EnumeratePrototypes<EntityPrototype>())
{
if (entity.HasComponent<T>(_compFactory))
yield return entity;
}
}
}

View File

@ -1,77 +0,0 @@
using System.Numerics;
using Content.Shared.Inventory;
using Content.Shared.Silicons.Borgs;
using Content.Shared.Silicons.Borgs.Components;
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
namespace Content.Shared._CD.Silicons.Borgs;
/// <summary>
/// Information relating to a borg's subtype. Should be mostly cosmetic.
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
[EntityCategory("BorgSubtype")]
public sealed partial class BorgSubtypeDefinitionComponent : Component
{
private static ProtoId<SoundCollectionPrototype> DefaultFootsteps = new("FootstepBorg"); // DeltaV - Removed Readonly
/// <summary>
/// <inheritdoc cref="BorgTypePrototype.InventoryTemplateId"/>
/// </summary>
[DataField, AutoNetworkedField] public ProtoId<InventoryTemplatePrototype> InventoryTemplateId = "borgShort";
/// <summary>
/// The parent borg type of this subtype.
/// </summary>
[DataField(required: true), AutoNetworkedField]
public string ParentType;
/// <summary>
/// <inheritdoc cref="BorgTypePrototype.AddComponents"/>
/// </summary>
[DataField] public ComponentRegistry? AddComponents;
/// <summary>
/// Sprite path that the prototype's layer data will reference.
/// </summary>
[DataField, AutoNetworkedField] public ResPath? SpritePath;
/// <summary>
/// The visual layer data for the subtype.
/// At the minimum should have definitions for each value of <see cref="BorgVisualLayers"/>.
/// </summary>
[DataField(required: true), AutoNetworkedField]
public PrototypeLayerData[] LayerData;
[DataField(required: true), AutoNetworkedField]
public string SpriteHasMindState;
[DataField(required: true), AutoNetworkedField]
public string SpriteNoMindState;
[DataField, AutoNetworkedField] public string? SpriteBodyState;
[DataField, AutoNetworkedField] public Vector2? Offset;
[DataField(required: true), AutoNetworkedField]
public EntProtoId DummyPrototype;
[DataField, AutoNetworkedField] public string PetSuccessString = "petting-success-generic-cyborg";
[DataField, AutoNetworkedField] public string PetFailureString = "petting-failure-generic-cyborg";
/// <summary>
/// Sound specifier for footstep sounds created by this subtype.
/// </summary>
[DataField, AutoNetworkedField]
public SoundSpecifier FootstepCollection { get; set; } = new SoundCollectionSpecifier(DefaultFootsteps);
/// <summary>
/// <inheritdoc cref="BorgTypePrototype.SpriteBodyMovementState"/>
/// </summary>
[DataField, AutoNetworkedField]
public string? SpriteBodyMovementState { get; set; }
}

View File

@ -1,18 +0,0 @@
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
namespace Content.Shared._CD.Silicons.Borgs;
/// <summary>
/// Component given to borgs that should be able to select subtypes inside of the borg type selection menu.
/// </summary>
[RegisterComponent, NetworkedComponent]
[AutoGenerateComponentState(true)]
public sealed partial class BorgSwitchableSubtypeComponent : Component
{
/// <summary>
/// The <see cref="BorgSubtypeDefinitionComponent"/> of this chassis.
/// </summary>
[DataField, AutoNetworkedField]
public ProtoId<EntityPrototype>? BorgSubtype;
}

View File

@ -1,100 +0,0 @@
using Content.Shared.Interaction;
using Content.Shared.Interaction.Components;
using Content.Shared.Movement.Components;
using Content.Shared.Silicons.Borgs;
using Content.Shared.Silicons.Borgs.Components;
using Robust.Shared.Prototypes;
namespace Content.Shared._CD.Silicons.Borgs;
/// <summary>
/// Shared behaviour for borg switchable subtype logic.
/// Essentially a reimplementation of <see cref="SharedBorgSwitchableTypeSystem"/> specifically for cosmetic functions.
/// </summary>
public abstract class SharedBorgSwitchableSubtypeSystem : EntitySystem
{
[Dependency] private readonly InteractionPopupSystem _interactionPopup = default!;
[Dependency] protected readonly IPrototypeManager Prototypes = default!;
[Dependency] protected readonly IComponentFactory ComponentFactory = default!;
public override void Initialize()
{
SubscribeLocalEvent<BorgSwitchableSubtypeComponent, MapInitEvent>(OnMapInit); // make sure that our subtype is selected first
SubscribeLocalEvent<BorgSwitchableSubtypeComponent, AfterBorgTypeSelectEvent>(OnBorgTypeSelect);
SubscribeLocalEvent<BorgSwitchableSubtypeComponent, TypeTryingToUpdateVisualsEvent>(OnBorgTypeUpdatingVisuals);
Subs.BuiEvents<BorgSwitchableTypeComponent>(BorgSwitchableTypeUiKey.SelectBorgType,
sub =>
{
sub.Event<BorgSelectSubtypeMessage>(SelectSubtypeMessageHandler);
});
base.Initialize();
}
private void OnBorgTypeUpdatingVisuals(Entity<BorgSwitchableSubtypeComponent> ent, ref TypeTryingToUpdateVisualsEvent args)
{
if (!ent.Comp.BorgSubtype.HasValue)
return;
Dirty(ent);
SelectBorgSubtype(ent);
}
private void OnMapInit(Entity<BorgSwitchableSubtypeComponent> ent, ref MapInitEvent args)
{
if (ent.Comp.BorgSubtype != null)
{
SelectBorgSubtype(ent);
}
}
private void OnBorgTypeSelect(Entity<BorgSwitchableSubtypeComponent> ent, ref AfterBorgTypeSelectEvent args)
{
if (!ent.Comp.BorgSubtype.HasValue)
return;
UpdateEntityAppearance(ent);
Dirty(ent);
}
protected virtual void SelectBorgSubtype(Entity<BorgSwitchableSubtypeComponent> ent)
{
UpdateEntityAppearance(ent);
}
private void UpdateEntityAppearance(Entity<BorgSwitchableSubtypeComponent> entity)
{
if (!Prototypes.TryIndex(entity.Comp.BorgSubtype, out var subtypePrototype))
return;
UpdateEntityAppearance(entity, subtypePrototype);
}
protected virtual void UpdateEntityAppearance(Entity<BorgSwitchableSubtypeComponent> entity,
EntityPrototype borgSubtypePrototype)
{
if (!borgSubtypePrototype.TryGetComponent<BorgSubtypeDefinitionComponent>(out var borgSubtype, ComponentFactory))
return;
if (TryComp(entity, out InteractionPopupComponent? popup))
{
_interactionPopup.SetInteractSuccessString((entity.Owner, popup), borgSubtype.PetSuccessString);
_interactionPopup.SetInteractFailureString((entity.Owner, popup), borgSubtype.PetFailureString);
}
if (TryComp(entity, out FootstepModifierComponent? footstepModifier))
{
footstepModifier.FootstepSoundCollection = borgSubtype.FootstepCollection;
}
}
private void SelectSubtypeMessageHandler(EntityUid uid, BorgSwitchableTypeComponent borgSwitchableTypeComponent, BorgSelectSubtypeMessage args)
{
if (!TryComp<BorgSwitchableSubtypeComponent>(uid, out var subtypeComp))
return;
subtypeComp.BorgSubtype = args.Subtype;
Dirty(uid, subtypeComp);
}
}

View File

@ -1,16 +0,0 @@
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
namespace Content.Shared._CD.Silicons.Borgs;
[Serializable, NetSerializable]
public sealed class BorgSelectSubtypeMessage(ProtoId<EntityPrototype>? subtype) : BoundUserInterfaceMessage
{
public ProtoId<EntityPrototype>? Subtype = subtype;
}
[ByRefEvent]
public record struct AfterBorgTypeSelectEvent;
[ByRefEvent]
public record struct TypeTryingToUpdateVisualsEvent;

View File

@ -1,5 +1,6 @@
using Content.Shared._DV.Body.Components;
using Content.Shared._DV.Body.Events;
using Content.Shared.Buckle;
using Content.Shared.DoAfter;
using Content.Shared.Mobs.Components;
using Content.Shared.Mobs.Systems;
@ -13,6 +14,7 @@ public sealed class CPRSystem : EntitySystem
[Dependency] private readonly MobStateSystem _mobStateSystem = default!;
[Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!;
[Dependency] private readonly SharedPopupSystem _popupSystem = default!;
[Dependency] private readonly SharedBuckleSystem _buckle = default!;
public override void Initialize()
{
@ -85,7 +87,7 @@ public sealed class CPRSystem : EntitySystem
{
Act = () => StartCPR(user, target, cprComp.TimeLength),
Text = Loc.GetString("cpr-verb-start"),
Priority = 2,
Priority = _buckle.IsBuckled(target) ? 3 : 1, // Higher priority if they are buckled. Otherwise, this conflicts with trying to carry.
Disabled = alreadyAffected,
Message = alreadyAffected ? Loc.GetString("cpr-verb-disabled-description") : Loc.GetString("cpr-verb-description"),
};

View File

@ -30,6 +30,7 @@ using System.Numerics;
using Content.Shared._DV.Polymorph;
using Content.Shared._Floof.OfferItem;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Buckle;
namespace Content.Shared._DV.Carrying;
@ -70,7 +71,7 @@ public sealed class CarryingSystem : EntitySystem
SubscribeLocalEvent<BeingCarriedComponent, GettingInteractedWithAttemptEvent>(OnInteractedWith);
SubscribeLocalEvent<BeingCarriedComponent, PullAttemptEvent>(OnPullAttempt);
SubscribeLocalEvent<BeingCarriedComponent, StartClimbEvent>(OnDrop);
SubscribeLocalEvent<BeingCarriedComponent, BuckledEvent>(OnDrop);
SubscribeLocalEvent<BeingCarriedComponent, BuckledEvent>(OnBuckle);
SubscribeLocalEvent<BeingCarriedComponent, UnbuckledEvent>(OnDrop);
SubscribeLocalEvent<BeingCarriedComponent, StrappedEvent>(OnDrop);
SubscribeLocalEvent<BeingCarriedComponent, UnstrappedEvent>(OnDrop);
@ -220,6 +221,13 @@ public sealed class CarryingSystem : EntitySystem
DropCarried(ent.Comp.Carrier, ent);
}
private void OnBuckle(Entity<BeingCarriedComponent> ent, ref BuckledEvent args)
{
// Buckling to a bed already handles the reparenting to the entity that the carried
// entity is buckled to, and then relays the BuckledEvent, so don't reparent to the grid.
DropCarried(ent.Comp.Carrier, ent, attachToGrid: false);
}
private void OnRemoved(Entity<BeingCarriedComponent> ent, ref ComponentRemove args)
{
/*
@ -327,9 +335,9 @@ public sealed class CarryingSystem : EntitySystem
return true;
}
public void DropCarried(EntityUid carrier, EntityUid carried)
public void DropCarried(EntityUid carrier, EntityUid carried, bool attachToGrid = true)
{
Drop(carried);
Drop(carried, attachToGrid);
CleanupCarrier(carrier, carried);
}
@ -341,12 +349,15 @@ public sealed class CarryingSystem : EntitySystem
_movementSpeed.RefreshMovementSpeedModifiers(carrier);
}
private void Drop(EntityUid carried)
private void Drop(EntityUid carried, bool attachToGrid = true)
{
RemComp<BeingCarriedComponent>(carried);
RemComp<KnockedDownComponent>(carried); // TODO SHITMED: make sure this doesnt let you make someone with no legs walk
_actionBlocker.UpdateCanMove(carried);
_transform.AttachToGridOrMap(carried);
// Some systems will handle re-parenting and then throw an event, and this changes the parent when it should not
if (attachToGrid)
_transform.AttachToGridOrMap(carried);
_standingState.Stand(carried);
}

View File

@ -0,0 +1,9 @@
- files: ["shadowkin_female_scream.ogg"]
license: "CC-BY-SA-3.0"
copyright: "Edited and composited by MajorMoth. Re-encoded to Ogg Vorbis."
source: "https://freesound.org/people/AlesiaDavina/sounds/722718/"
- files: ["shadowkin_male_scream.ogg"]
license: "CC-BY-SA-3.0"
copyright: "Edited and composited by MajorMoth. Re-encoded to Ogg Vorbis."
source: "https://freesound.org/people/AlesiaDavina/sounds/722718/"

View File

@ -0,0 +1,14 @@
- files: ["shadowkin_speak_say.ogg"]
license: "CC-BY-SA-3.0"
copyright: "Edited and composited by MajorMoth. Re-encoded to Ogg Vorbis."
source: "https://freesound.org/people/JKata/sounds/632414/"
- files: ["shadowkin_speak_ask.ogg"]
license: "CC-BY-SA-3.0"
copyright: "Edited and composited by MajorMoth. Re-encoded to Ogg Vorbis."
source: "https://freesound.org/people/templeofhades/sounds/95516/"
- files: ["shadowkin_speak_exclaim.ogg"]
license: "CC-BY-SA-3.0"
copyright: "Edited and composited by MajorMoth. Re-encoded to Ogg Vorbis."
source: "https://freesound.org/people/taure/sounds/376392/"

View File

@ -348,5 +348,13 @@ Entries:
id: 38
time: '2026-07-19T16:18:47.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6317
- author: ShepardToTheStars
changes:
- message: '`entities` and a lot of other basic QUERY commare are now a DEBUG-level
commands.'
type: Tweak
id: 39
time: '2026-07-24T17:27:48.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6351
Name: DeltaVAdmin
Order: 5

View File

@ -1,114 +1,4 @@
Entries:
- author: snowywinters
changes:
- message: Captain's armored winter coat a alternative to the carapace
type: Add
- message: Changed the defense of captain's EVA suit and carapace
type: Tweak
id: 2092
time: '2026-01-23T19:31:48.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5227
- author: pootslap
changes:
- message: Listening Post Operatives only have the ability to hear binary comms
now. They can no longer talk on binary.
type: Tweak
id: 2093
time: '2026-01-23T19:35:58.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5243
- author: MilonPL
changes:
- message: The traits points bar will now show up correctly.
type: Fix
id: 2094
time: '2026-01-24T20:55:31.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5275
- author: MilonPL
changes:
- message: The uncloneable trait no longer prevents your character from getting
revived by defibrillators.
type: Fix
id: 2095
time: '2026-01-24T21:29:58.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5273
- author: Halo3moth
changes:
- message: The energy magnums "magnum" rounds no longer pierce windows
type: Fix
id: 2096
time: '2026-01-25T13:48:54.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5270
- author: Toby222
changes:
- message: Added buttons for build info and credits to the escape menu
type: Tweak
id: 2097
time: '2026-01-25T14:42:09.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5260
- author: MilonPL
changes:
- message: Added the "Marked as Protected" trait which makes you immune to becoming
a target objective.
type: Add
id: 2098
time: '2026-01-25T16:30:18.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5274
- author: AeraAuling
changes:
- message: Shadow damage no longer removes all your blood immediately
type: Tweak
id: 2099
time: '2026-01-25T16:31:20.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5268
- author: ShepardToTheStars
changes:
- message: You can now toggle your hardsuit helmet on over your hat or beret!
type: Add
id: 2100
time: '2026-01-25T16:31:55.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5263
- author: Pharaz4
changes:
- message: Bingus can no longer drink the **ENTIRE** keg.
type: Fix
- message: You can eat rice dishes with chopsticks now.
type: Add
- message: Fixed Smartfridge visuals always showing their wire panels open.
type: Fix
- message: Projectiles and Mr. Butlertion are now insulated against wizardry.
type: Fix
- message: Wording fix to initial infected's prompt. It now states that they can
explicitly kill people.
type: Fix
id: 2101
time: '2026-01-25T16:31:39.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5278
- author: MantasDab360, whatston3, ShepardToTheStars
changes:
- message: Chemical Dispenser can now toggle between auto labeling!
type: Add
id: 2102
time: '2026-01-25T16:46:12.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5261
- author: keekee38
changes:
- message: a new compact submachine gun for security should be shipping in soon!
type: Add
- message: added machine pistol magazines to the security techfab's recipes.
type: Tweak
- message: added rubber SMG mags to the security techfab.
type: Tweak
id: 2103
time: '2026-01-26T10:46:23.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5212
- author: Halo3moth
changes:
- message: Security long coats have been resprited to be more in line with other
security gear. (we ran out of red dye)
type: Tweak
id: 2104
time: '2026-01-27T05:50:41.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5288
- author: EmberAstra
changes:
- message: Plasteel can now be printed at the Engineering Techfab.
@ -4359,4 +4249,124 @@
id: 2592
time: '2026-07-21T18:44:49.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6358
- author: EmberAstra
changes:
- message: Cosmic Cult's Entropic Blades are now smaller (2x4 spaces)
type: Tweak
id: 2593
time: '2026-07-23T03:17:02.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6371
- author: turtlemutt
changes:
- message: Gave Lighthouse new doorbells and pagers. Have fun harassing departments!
type: Tweak
id: 2594
time: '2026-07-23T16:29:30.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6088
- author: ShepardToTheStars
changes:
- message: Buckling someone while they are being carried should work as intended
now.
type: Fix
- message: Picking someone up that is criticla will have priority over CPR unless
they are buckled to something.
type: Tweak
id: 2595
time: '2026-07-23T20:07:04.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6375
- author: ManuDemoen
changes:
- message: Emergency access no longer allows anyone with a remote to bolt the door
and checks if the remote has access to bolt.
type: Fix
id: 2596
time: '2026-07-24T17:28:01.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6141
- author: pootslap
changes:
- message: Monkeys now make sounds when using emotes!
type: Add
id: 2597
time: '2026-07-24T17:28:47.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5928
- author: keekee38
changes:
- message: The WT550 once again fires at 5.5 rounds a second and has 30-round magazines.
type: Tweak
id: 2598
time: '2026-07-24T17:34:48.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6364
- author: SirWarock
changes:
- message: The NT-3 cannot be parcel-wrapped anymore!
type: Tweak
- message: Adjusted the wielding sprites of the NT-3 to look less wrong.
type: Fix
- message: The NT-3 can pierce things again.
type: Fix
id: 2599
time: '2026-07-24T17:39:18.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5653
- author: ShepardToTheStars
changes:
- message: The additional borg chassis from Cosmic Drift has been reverted due to
implementation issues.
type: Remove
id: 2600
time: '2026-07-27T13:48:14.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6385
- author: JustAnOrange, Stxcking
changes:
- message: Added 6 departmental bomber jackets and 3 non-departmental ones, they're
zippable! They can be found in your loadout option or in the clothing drobes!
type: Add
id: 2601
time: '2026-07-27T16:43:20.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6220
- author: CalliganSierre
changes:
- message: Ported TheDen Shadowkin scream, laugh, and talk sounds for Shadekin.
(CC-BY-SA-3.0 MajorMoth)
type: Add
- message: Shadekin now use custom laughs and speech voice instead of Slime-person
sounds for those lines.
type: Tweak
- message: Shadekin are assigned Felinid Growl, Hiss, and Purr emotes as is consistent
with most other servers.
type: Tweak
id: 2602
time: '2026-07-27T19:26:38.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6370
- author: starabsurddark-png
changes:
- message: Increased the resistances of the Durathread Vest to 50% Blunt, Slash
and 20% Heat
type: Tweak
- message: Reduced the resistances of the Plate Carrier to 10% Blunt
type: Tweak
id: 2603
time: '2026-07-29T12:18:54.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6311
- author: ShepardToTheStars, rebe83
changes:
- message: Felinid's sink claws ability delay has been reduced from 3s to 0.5s.
type: Tweak
- message: Felinids now get a unique icon on their alert bar when they protract
their claws.
type: Add
id: 2604
time: '2026-07-29T15:42:01.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6376
- author: ShepardToTheStars
changes:
- message: Remote Medical Tracking has been added to the Biochemical research tree
as a T3 technology. It allows you to print crew monitors and crew monitoring
server boards!
type: Add
- message: The crew monitoring crate from Logistics now requires medical access
to unlock instead of epistemics.
type: Tweak
id: 2605
time: '2026-07-30T17:30:47.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6272
Order: 1

File diff suppressed because one or more lines are too long

View File

@ -1,4 +0,0 @@
cd-borg-select-subtype-flavour-text = Available cosmetic subtypes
# medical
al-borg-medical-subtype-qualified-doctor-name = qualified doctor

View File

@ -17,3 +17,6 @@ alerts-resurrecting-desc = You are currently dead, but will resurrect soon.
alert-heavy-clothing-name = You're [color=yellow]heavy[/color]
alert-heavy-clothing-desc = Heavy gear is weighing you down, rendering you [color=yellow]immune[/color] to space wind and slippery surfaces!
alerts-sunk-claws-name = Claws Protracted
alerts-sunk-claws-desc = You're digging your claws into the ground. You can't slip but it is hard to move.

View File

@ -1,33 +0,0 @@
# engineering
al-borg-engineering-subtype-standard-engineering-cyborg-name = standard engineering
al-borg-engineering-subtype-generic-engineering-cyborg-name = generic engineering
al-borg-engineering-subtype-antique-engineering-cyborg-name = antique engineering
# generic
al-borg-generic-subtype-generic-cyborg-name = generic
# janitor
al-borg-janitor-subtype-standard-janitor-cyborg-name = standard janitor
al-borg-janitor-subtype-generic-janitor-cyborg-name = generic janitor
al-borg-janitor-subtype-mopbot-cyborg-name = mopbot
al-borg-janitor-subtype-vest-janitor-cyborg-name = janitor vest
# medical
al-borg-medical-subtype-generic-medical-cyborg-name = generic medical
al-borg-medical-subtype-standard-medical-cyborg-name = standard medical
al-borg-medical-subtype-doctor-medical-cyborg-name = doctor
# salvage
al-borg-mining-subtype-standard-salvage-cyborg-name = standard salvage
al-borg-mining-subtype-generic-salvage-cyborg-name = generic salvage
# security
al-borg-security-subtype-standard-security-cyborg-name = standard security
al-borg-security-subtype-generic-security-cyborg-name = generic security
# service
al-borg-service-subtype-standard-service-cyborg-name = standard service
al-borg-service-subtype-generic-service-cyborg-name = generic service
al-borg-service-subtype-waitress-service-cyborg-name = waitress
al-borg-service-subtype-brobot-service-cyborg-name = brobot
al-borg-service-subtype-maximilium-service-cyborg-name = maximilium

View File

@ -0,0 +1,10 @@
health-analyzer-plus-window-entity-blood-level-quantity-text = {$percent}
health-analyzer-plus-window-entity-total-damage-text = Total Damage: {$amount}
health-analyzer-plus-window-entity-total-reagents-text = Bloodstream: {$amount}u
health-analyzer-plus-window-reagent-text = [color={$reagentColor}]█[/color] {$reagentName}: {$amount}u
health-analyzer-plus-window-unknown-reagents-text = Unknown Reagents: {$amount}u
health-analyzer-plus-window-no-damage-text = No damage detected
health-analyzer-plus-window-no-reagents-text = No reagents detected

View File

@ -20,6 +20,7 @@ research-technology-service-borg-module = Advanced Service Borg Modules
# Biochemical
research-technology-basic-augmentation = Basic Augmentation
research-technology-implanted-tools = Implanted Tools
research-technology-medical-tracking = Remote Medical Tracking
# Arsenal
research-technology-exotic-ammunition = Exotic Ammunition

View File

@ -1,2 +0,0 @@
ent-MagazinePistolSubMachineGunTopMounted =
.desc = Unconventional 20-round top feeding magazine for the WT550 SMG. Intended to hold general-purpose kinetic ammunition.

File diff suppressed because it is too large Load Diff

View File

@ -27,6 +27,7 @@
- category: Thirst
- alertType: Magboots
- alertType: Rooted
- alertType: ClawsProtracted # DeltaV - Felinid Claws
- alertType: Pacified
- alertType: Stealthy
- alertType: Offer # Floofstation - port from EE

View File

@ -43,9 +43,9 @@
icon:
sprite: Structures/Machines/server.rsi
state: server
product: CrateCrewMonitoring
product: CrateCrewMonitoringDV # DeltaV - Was CrateCrewMonitoring
cost: 2000
category: cargoproduct-category-name-epistemics # DeltaV - Science renamed to Epistemics
category: cargoproduct-category-name-medical # DeltaV - Was science, now medical
group: market
- type: cargoProduct

View File

@ -21,6 +21,7 @@
ClothingHeadsetCargo: 3
ClothingOuterWinterCargo: 2
ClothingOuterWinterMiner: 2
ClothingOuterCoatBomberLogistic: 2 # DeltaV - Department Bombers
ClothingNeckScarfStripedBrown: 3
ClothingShoesBootsWinterCargo: 2
ClothingShoesBootsSalvage: 3 # DeltaV - Cargo clothing expansion

View File

@ -15,6 +15,7 @@
ClothingHeadHatHardhatOrange: 3
ClothingHeadsetEngineering: 3
ClothingOuterWinterEngi: 2
ClothingOuterCoatBomberEngineering: 2 # DeltaV - Department Bombers
ClothingNeckScarfStripedOrange: 3
ClothingShoesBootsWinterEngi: 2
contrabandInventory:

View File

@ -12,6 +12,7 @@
ClothingHeadBandBotany: 3
ClothingHeadsetService: 2
ClothingOuterWinterHydro: 2
ClothingOuterCoatBomberService: 2 # DeltaV - Department Bombers
ClothingShoesBootsWinterHydro: 2 # DeltaV - Add departmental winter boots
contrabandInventory:
ToyFigurineBotanist: 1

View File

@ -9,7 +9,7 @@
ClothingBeltMedical: 4
ClothingHeadHatBeretMedic: 4
ClothingHeadNurseHat: 4
# Begin Delta-V additions
# Begin DeltaV additions
ClothingHeadHatBeretMedical: 4
ClothingHeadHatBeretParamedic: 2
ClothingUniformMedicalApron: 2
@ -21,11 +21,12 @@
ClothingUniformParamedicJumper: 2
ClothingUniformJumpskirtParamedicJumper: 2
ClothingOuterCoatParamedicJacket: 1
ClothingOuterCoatBomberMedical: 2
ClothingOuterExplorerCoat: 1
ClothingOuterCoatLabMedical: 2
ClothingOuterCoatLabLong: 4
ClothingOuterCoatLabLongMedical: 2
# End Delta-V additions
# End DeltaV additions
ClothingOuterCoatLab: 4
ClothingShoesColorWhite: 4
ClothingHandsGlovesLatex: 4
@ -36,30 +37,30 @@
UniformScrubsColorGreen: 4
UniformScrubsColorBlue: 4
UniformScrubsColorPurple: 4
# Begin Delta-V additions
# Begin DeltaV additions
UniformScrubsColorBlack: 4
UniformScrubsColorCyan: 4
UniformScrubsColorPink: 4
UniformScrubsColorRainbow: 4
UniformScrubsColorWhite: 4
# End Delta-v additions
# End DeltaV additions
ClothingHeadHatSurgcapGreen: 4
ClothingHeadHatSurgcapBlue: 4
ClothingHeadHatSurgcapPurple: 4
# Begin Delta-V additions
# Begin DeltaV additions
ClothingHeadHatSurgcapBlack: 4
ClothingHeadHatSurgcapCyan: 4
ClothingHeadHatSurgcapPink: 4
ClothingHeadHatSurgcapRainbow: 4
ClothingHeadHatSurgcapWhite: 4
# End Delta-v additions
# End DeltaV additions
ClothingShoesBootsWinterMed: 2
contrabandInventory:
# Begin Delta-V additions
# Begin DeltaV additions
UniformScrubsColorCybersun: 1
ClothingHeadHatSurgcapCybersun: 1
ClothingOuterCoatCybersunWindbreaker: 1
# End Delta-V additions
# End DeltaV additions
ClothingUniformJumpskirtOfLife: 1
ToyFigurineMedicalDoctor: 1
ToyFigurineParamedic: 1

View File

@ -19,7 +19,8 @@
ClothingHeadHatBeretRND: 3 # DeltaV - Remove Specific Role Timers
ClothingHeadTinfoil: 2 # Nyanotrasen - Tinfoil hats for Epistemics
ClothingShoesBootsWinterSci: 2
ClothingOuterCoatBomberEpistemic: 2 # DeltaV - Department Bombers
ClothingOuterExplorerCoat: 3 # DeltaV
contrabandInventory:
ClothingUniformCybersunRND: 1 # DeltaV
ToyFigurineResearchDirector: 1
ToyFigurineResearchDirector: 1

View File

@ -4,54 +4,59 @@
ClothingBackpackSecurity: 3
ClothingBackpackSatchelSecurity: 3
ClothingBackpackDuffelSecurity: 3
# ClothingUniformJumpsuitSec: 3 # DeltaV - moved*
# ClothingUniformJumpsuitSec: 3 # DeltaV - *Moved
ClothingShoesBootsJack: 3
ClothingHeadHatBeretSecurity: 3
ClothingHeadHatBeretSecurityGrey: 3 # DeltaV - add grey security beret to secdrobe
ClothingHeadHatBeretCadet: 3 # DeltaV - add cadet beret to secdrobe
ClothingHeadHatCapSec: 3 # DeltaV - add security cap to secdrobe
ClothingMaskNeckGaiter: 3 # DeltaV - add neck gaiters to secdrobe
# ClothingMaskGasSecurity: 3 # DeltaV - 1984 secmasks from secdrobe, you can make them in the lathe now.
# ClothingHeadHatSecsoft: 3 # DeltaV - removed from SecDrobe due to inconsistency with art direction
# ClothingHeadBandRed: 3 # DeltaV - removed for incongruency
# ClothingMaskNeckGaiterRed: 3 # DeltaV - removed
# Begin DeltaV Additions
ClothingHeadHatBeretSecurityGrey: 3
ClothingHeadHatBeretCorpsman: 3
ClothingHeadHatBeretCadet: 3
ClothingHeadHatCapSec: 3
ClothingMaskNeckGaiter: 3
# End DeltaV Additions
# Begin DeltaV Removal
# ClothingHeadHatSecsoft: 3
# ClothingHeadBandRed: 3
# ClothingMaskNeckGaiterRed: 3
# End DeltaV Removal
ClothingHandsGlovesColorBlack: 3
ClothingHandsGlovesFingerless: 3
ClothingUniformJumpsuitSec: 3 # DeltaV - *moved
ClothingUniformJumpskirtSec: 3
ClothingUniformJumpskirtSec: 3 # DeltaV - *Moved
ClothingUniformJumpsuitSecGrey: 3
ClothingUniformJumpskirtSecGrey: 3
ClothingUniformJumpsuitSecWhite: 3 # DeltaV - Was ClothingUniformJumpsuitSecBlue
ClothingUniformJumpsuitSecSummer: 3 # DeltaV - add summer security uniform
ClothingUniformJumpskirtSecWhite: 3 # DeltaV - new skirt sprited, added to secdrobe. Was ClothingUniformJumpskirtSecBlue
ClothingUniformJumpsuitSecFormal: 1 # DeltaV - add formal uniform to secdrobe
ClothingUniformJumpskirtSecFormal: 1 # DeltaV - add formal uniform to secdrobe
# ClothingUniformJumpsuitSecBlue: 3 # DelatV - Replaced by ClothingUniformJumpsuitSecWhite
# Begin DeltaV Additions
ClothingUniformJumpsuitSecWhite: 3
ClothingUniformJumpskirtSecWhite: 3
ClothingUniformJumpsuitSecSummer: 3
ClothingUniformJumpsuitSecFormal: 1
ClothingUniformJumpskirtSecFormal: 1
ClothingUniformJumpsuitBrigmedic: 2
ClothingUniformJumpskirtBrigmedic: 2
ClothingUniformJumpsuitBrigmedicTurtle: 2
ClothingUniformJumpskirtBrigmedicTurtle: 2
ClothingOuterStasecSweater: 2
ClothingOuterCoatBomberSecurity: 2
ClothingLongcoatSecurity: 2
ClothingLongcoatBrigmedic: 2
ClothingOuterCoatStasec: 2
ClothingOuterCoatStasecCorpsman: 2
ClothingUniformJumpsuitPrisoner: 3
ClothingUniformJumpskirtPrisoner: 3
ClothingHeadsetPrison: 3
# End DeltaV Additions
ClothingHeadsetSecurity: 3
ClothingHeadHatBeretCorpsman: 2 # DeltaV - added corpsman uniform to secdrobe
ClothingUniformJumpsuitBrigmedic: 2 # DeltaV - added corpsman uniform to secdrobe
ClothingUniformJumpskirtBrigmedic: 2 # DeltaV - added corpsman uniform to secdrobe
ClothingUniformJumpsuitBrigmedicTurtle: 2 # DeltaV - added corpsman uniform to secdrobe
ClothingUniformJumpskirtBrigmedicTurtle: 2 # DeltaV - added corpsman uniform to secdrobe
ClothingUniformJumpsuitPrisoner: 3 # DeltaV - added prison jumpsuits
ClothingUniformJumpskirtPrisoner: 3 # DeltaV - added prison jumpskirts
ClothingHeadsetPrison: 3 # DeltaV - prison headsets in secdrobe
ClothingOuterStasecSweater: 2 # DeltaV - add sweaters to secdrobe
ClothingLongcoatSecurity: 2 # DeltaV - Longcoats
ClothingLongcoatBrigmedic: 2 # DeltaV - Longcoats
ClothingOuterCoatStasec: 2 # DeltaV - replace ClothingOuterWinterSec
ClothingOuterCoatStasecCorpsman: 2 # DeltaV - added corpsman uniform to secdrobe
# ClothingOuterWinterSec: 2 # DeltaV - removed this
## ClothingOuterArmorBasic: 2 # DeltaV - moved body armour from SecDrobe to SecTech
## ClothingOuterArmorBasicSlim: 2
ClothingNeckScarfStripedBlue: 3 # DeltaV - blue instead of red scarf. Was ClothingNeckScarfStripedRed
# ClothingOuterArmorBasicSlim: 2 # DeltaV - this was gone at one point no idea where it went
# ClothingOuterWinterSec: 2 # DeltaV - Replaced by ClothingOuterCoatStasec
# ClothingOuterArmorBasic: 2 # DeltaV - Moved to SecTech
ClothingNeckScarfStripedBlue: 3 # DeltaV - Was ClothingNeckScarfStripedRed
# ClothingOuterArmorBasicSlim: 2 # DeltaV - Removed
ClothingEyesBlindfold: 1
ClothingShoesBootsCombat: 1
ClothingShoesBootsWinterSec: 2
# ClothingHeadHelmetJustice: 1 # DeltaV - lrp
# ClothingHeadHelmetJustice: 1 # DeltaV - Removed
contrabandInventory:
# ClothingMaskClownSecurity: 1 # DeltaV - removed for incongruency
# ClothingMaskMimeSecurity: 1 # DeltaV - removed for same reasons as above
# ClothingMaskClownSecurity: 1 # DeltaV - Removed for incongruency
# ClothingMaskMimeSecurity: 1 # DeltaV - Removed for incongruency
ToyFigurineSecurity: 1
ToyFigurineWarden: 1
ToyFigurineHeadOfSecurity: 1

View File

@ -16,6 +16,7 @@
ClothingOuterFlannelBlue: 2
ClothingOuterFlannelGreen: 2
ClothingOuterCoatBomber: 3
ClothingOuterCoatBomberCheckered: 3 # DeltaV
ClothingHeadHatCanadaBeanie: 4
ClothingHeadHatSantahat: 2
ClothingHeadHatXmasCrown: 2
@ -65,3 +66,7 @@
emaggedInventory:
ClothingNeckScarfStripedSyndieGreen: 3
ClothingNeckScarfStripedSyndieRed: 3
# Begin DeltaV additions
ClothingOuterCoatBomberSyndicate: 1
ClothingOuterCoatBomberCybersun: 1
# End DeltaV additions

View File

@ -282,7 +282,6 @@
requiredMobState:
- Critical
- Dead
- type: BorgSwitchableSubtype # CosmicDrift
- type: entity
abstract: true

View File

@ -1613,6 +1613,16 @@
Blunt: 1
clumsySound:
path: /Audio/Animals/monkey_scream.ogg
#Begin DeltaV additions
- type: Vocal
sounds:
Male: MonkeySounds
Female: MonkeySounds
Unsexed: MonkeySounds
wilhelmProbability: 0.01
- type: BodyEmotes
soundsId: MonkeySounds
#End DeltaV additions
- type: entity
@ -1647,6 +1657,16 @@
- type: GhostTakeoverAvailable
- type: Loadout
prototypes: [SyndicateOperativeGearMonkey]
#Begin DeltaV additions
- type: Vocal
sounds:
Male: MonkeySounds
Female: MonkeySounds
Unsexed: MonkeySounds
wilhelmProbability: 0.01
- type: BodyEmotes
soundsId: MonkeySounds
#End DeltaV additions
- type: entity
id: MobMonkeySyndicateAgent

View File

@ -75,7 +75,7 @@
Arsenal: { color: "#dc373b" }
Experimental: { color: "#9a6ef0" }
CivilianServices: { color: "#7ecd48" }
Biochemical: { color: "#449ae6" } # DeltaV - Biochem tree
enum.TechDiskVisuals.Tier:
t2_marks:
2: { visible: true }

View File

@ -115,7 +115,7 @@
whitelist:
tags:
- CartridgePistol
capacity: 20 # DeltaV
capacity: 30
- type: Sprite
sprite: Objects/Weapons/Guns/Ammunition/Magazine/Pistol/smg_mag_top_mounted.rsi
layers:

View File

@ -246,7 +246,7 @@
- type: ChamberMagazineAmmoProvider
boltClosed: null
- type: Gun
fireRate: 5 # DeltaV - Was 5.5
fireRate: 5.5
minAngle: 2 # DeltaV - Was 1
maxAngle: 16 # DeltaV - Was 6
angleIncrease: 1.5

View File

@ -395,6 +395,8 @@
- LongcoatBlack
- LongcoatBrown
- LongcoatNanoTrasen
- BomberJacket
- BomberCheckered
- BlackWinterCoat
- PurpleWinterCoat
- RedWinterCoat
@ -724,6 +726,7 @@
loadouts:
- BotanistApron
- BotanistWintercoat
- BomberService # DeltaV
- type: loadoutGroup
id: BotanistJobTrinkets
@ -968,6 +971,7 @@
loadouts:
- QuartermasterLongcoat # DeltaV - Longcoats
- QuartermasterWintercoat
- BomberLogistic # DeltaV
- type: loadoutGroup
id: QuartermasterShoes
@ -1016,6 +1020,7 @@
minLimit: 0
loadouts:
- CargoTechnicianWintercoat
- BomberLogistic # DeltaV
- type: loadoutGroup
id: CargoTechnicianShoes
@ -1102,6 +1107,7 @@
loadouts:
- ChiefEngineerLongcoat # DeltaV - Longcoats
- ChiefEngineerWintercoat
- BomberEngineering # DeltaV
- type: loadoutGroup
id: ChiefEngineerShoes
@ -1176,6 +1182,7 @@
loadouts:
- StationEngineerOuterVest
- StationEngineerWintercoat
- BomberEngineering # DeltaV
- type: loadoutGroup
id: StationEngineerShoes
@ -1223,6 +1230,7 @@
minLimit: 0
loadouts:
- AtmosphericTechnicianWintercoat
- BomberEngineering # DeltaV
- type: loadoutGroup
id: AtmosphericTechnicianBackpack
@ -1302,6 +1310,7 @@
- MystaLabCoat # DeltaV
- ResearchDirectorLongcoat # DeltaV - Longcoats
- ResearchDirectorWintercoat
- BomberEpistemic # DeltaV
- type: loadoutGroup
id: ResearchDirectorShoes
@ -1367,6 +1376,7 @@
- LongLabCoat # DeltaV
- ScienceLabCoat
- ScienceWintercoat
- BomberEpistemic # DeltaV
- SeniorResearcherLabCoat
- type: loadoutGroup
@ -1704,6 +1714,7 @@
- ChiefMedicalOfficerLongcoat # DeltaV - Longcoats
- ChiefMedicalOfficerLongLabCoat # DeltaV - Medical Clothing Overhaul
- ChiefMedicalOfficerWintercoat
- BomberMedical # DeltaV
- type: loadoutGroup
id: ChiefMedicalOfficerNeck
@ -1799,6 +1810,7 @@
- LongLabCoat # DeltaV - Medical Clothing Overhaul
- MedicalLongLabCoat # DeltaV - Medical Clothing Overhaul
- MedicalDoctorWintercoat
- BomberMedical # DeltaV
- SeniorPhysicianLabCoat
- type: loadoutGroup

View File

@ -66,7 +66,7 @@
- Vocal
tags:
- Honker # DeltaV - let borgs, bots, and IPCs use it (And Motorkind)
- SiliconEmotes
# - SiliconEmotes # DeltaV - Honker does this.
chatMessages: ["chat-emote-msg-honk"]
chatTriggers:
- honk

View File

@ -1,142 +0,0 @@
# use these base subtypes to avoid some boilerplate
- type: entity
abstract: true
id: BorgSubtypeBase
name: borg subtype base
description: Default state for other subtypes to use.
categories: [ "BorgSubtype" ]
components:
- type: BorgSubtypeDefinition
# Visuals
layerData:
- state: borg
map: [ "enum.BorgVisualLayers.Body", "movement" ]
- state: borg_e
map: [ "enum.BorgVisualLayers.Light" ]
shader: unshaded
visible: false
- state: borg_l
shader: unshaded
map: [ "light","enum.BorgVisualLayers.LightStatus" ]
visible: false
spriteBodyState: borg
spriteHasMindState: borg_e
# if rsi has a specific no mind state sprite, use that instead (i.e. borg_e_r)
spriteNoMindState: borg_e
footstepCollection:
collection: FootstepBorg
# generic
- type: entity
parent: BorgSubtypeBase
abstract: true
id: BorgGenericSubtypeBase
name: borg generic subtype
components:
- type: BorgSubtypeDefinition
parentType: generic
dummyPrototype: BorgChassisGeneric
# mining (salvage)
- type: entity
parent: BorgSubtypeBase
abstract: true
id: BorgMiningSubtypeBase
name: borg mining subtype
components:
- type: BorgSubtypeDefinition
parentType: mining
# Entity prototype for preview in selection menu
dummyPrototype: BorgChassisMining
# engineering
- type: entity
parent: BorgSubtypeBase
abstract: true
id: BorgEngineerSubtypeBase
name: borg engineering subtype
components:
- type: BorgSubtypeDefinition
parentType: engineering
# Entity prototype for preview in selection menu
dummyPrototype: BorgChassisEngineer
# janitor
- type: entity
parent: BorgSubtypeBase
abstract: true
id: BorgJanitorSubtypeBase
name: borg janitor subtype
components:
- type: BorgSubtypeDefinition
parentType: janitor
# Entity prototype for preview in selection menu
dummyPrototype: BorgChassisJanitor
# medical
- type: entity
parent: BorgSubtypeBase
abstract: true
id: BorgMedicalSubtypeBase
name: borg medical subtype
components:
- type: BorgSubtypeDefinition
parentType: medical
# Description
dummyPrototype: BorgChassisMedical
# service
- type: entity
parent: BorgSubtypeBase
abstract: true
id: BorgServiceSubtypeBase
name: borg service subtype
components:
- type: BorgSubtypeDefinition
parentType: service
# Description
dummyPrototype: BorgChassisService
## Begin DeltaV Additions
# security
- type: entity
parent: BorgSubtypeBase
abstract: true
id: BorgSecuritySubtypeBase
name: borg security subtype
components:
- type: BorgSubtypeDefinition
parentType: security
# Description
dummyPrototype: BorgChassisSecurity
# salvage
- type: entity
parent: BorgSubtypeBase
abstract: true
id: BorgSalvageSubtypeBase
name: borg salvage subtype
components:
- type: BorgSubtypeDefinition
parentType: mining
# Description
dummyPrototype: BorgChassisSalvage
## End DeltaV Additions
- type: entityCategory
id: BorgSubtype
name: al-borg-subtypes
hideSpawnMenu: true

View File

@ -1,10 +0,0 @@
# Actual entity prototypes used for UI visuals and admin spawning
- type: entity
id: BorgChassisQualifiedDoctor
parent: BorgChassisSelectable
name: qualified doctor cyborg
components:
- type: BorgSwitchableType
selectedBorgType: medical
- type: BorgSwitchableSubtype
borgSubtype: MedicalQualifiedDoctorSubtype

View File

@ -1,11 +0,0 @@
# medical
- type: entity
parent: BorgMedicalSubtypeBase
id: MedicalQualifiedDoctorSubtype
name: qualified doctor
description: "A board-certified cyborg for all your medical needs."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisQualifiedDoctor
spritePath: _CD/Mobs/Silicon/Borg/Medical/qualified_doctor.rsi

View File

@ -0,0 +1,9 @@
- type: soundCollection
id: ShadowkinMaleScreams
files:
- /Audio/_DEN/Voice/Shadowkin/Emotes/shadowkin_male_scream.ogg
- type: soundCollection
id: ShadowkinFemaleScreams
files:
- /Audio/_DEN/Voice/Shadowkin/Emotes/shadowkin_female_scream.ogg

View File

@ -66,3 +66,87 @@
collection: Moo
Gulp: # Goob
path: /Audio/_Goobstation/Voice/Human/gulp.ogg
- type: emoteSounds
id: MaleShadowkin
params:
variation: 0.125
sounds:
Scream:
collection: ShadowkinMaleScreams
Laugh:
collection: MaleLaugh
Sneeze:
collection: MaleSneezes
Cough:
collection: MaleCoughs
Yawn:
collection: MaleYawn
Snore:
collection: Snores
Sigh:
collection: MaleSigh
Crying:
collection: MaleCry
Whistle:
collection: Whistles
Weh:
collection: Weh
Gasp:
collection: MaleGasp
DefaultDeathgasp:
collection: MaleDeathGasp
Marr:
path: /Audio/_Starlight/Voice/Shadekin/mar.ogg
Wurble:
path: /Audio/_Starlight/Voice/Shadekin/wurble.ogg
Hiss:
collection: FelinidHisses
Purr:
collection: FelinidPurrs
Growl:
collection: FelinidGrowls
Gulp: # Goob
path: /Audio/_Goobstation/Voice/Human/gulp.ogg
- type: emoteSounds
id: FemaleShadowkin
params:
variation: 0.125
sounds:
Scream:
collection: ShadowkinFemaleScreams
Laugh:
collection: FemaleLaugh
Sneeze:
collection: FemaleSneezes
Cough:
collection: FemaleCoughs
Yawn:
collection: FemaleYawn
Snore:
collection: Snores
Sigh:
collection: FemaleSigh
Crying:
collection: FemaleCry
Whistle:
collection: Whistles
Weh:
collection: Weh
Gasp:
collection: FemaleGasp
DefaultDeathgasp:
collection: FemaleDeathGasp
Marr:
path: /Audio/_Starlight/Voice/Shadekin/mar.ogg
Wurble:
path: /Audio/_Starlight/Voice/Shadekin/wurble.ogg
Hiss:
collection: FelinidHisses
Purr:
collection: FelinidPurrs
Growl:
collection: FelinidGrowls
Gulp: # Goob
path: /Audio/_Goobstation/Voice/Human/gulp.ogg

View File

@ -0,0 +1,8 @@
- type: speechSounds
id: Shadekin
saySound:
path: /Audio/_DEN/Voice/Shadowkin/Talk/shadowkin_speak_say.ogg
askSound:
path: /Audio/_DEN/Voice/Shadowkin/Talk/shadowkin_speak_ask.ogg
exclaimSound:
path: /Audio/_DEN/Voice/Shadowkin/Talk/shadowkin_speak_exclaim.ogg

View File

@ -20,4 +20,4 @@
icon: _DV/Actions/sinkclaws/claws-off.png
iconOn: _DV/Actions/sinkclaws/claws-on.png
itemIconStyle: NoItem
useDelay: 3
useDelay: 0.5

View File

@ -12,3 +12,9 @@
state: enabled
name: alert-heavy-clothing-name
description: alert-heavy-clothing-desc
- type: alert
id: ClawsProtracted
icons: [ _DV/Actions/sinkclaws/claws-on.png ]
name: alerts-sunk-claws-name
description: alerts-sunk-claws-desc

View File

@ -128,6 +128,7 @@
- type: NoShoesSilentFootsteps
- type: Rootable # DeltaV - add rooting claws
action: "ActionToggleRootableFelinid"
rootedAlert: ClawsProtracted
transferRate: 0
speedModifier: 0.1
rootSound: "/Audio/Nyanotrasen/Voice/Felinid/cat_growl1.ogg"

View File

@ -96,8 +96,8 @@
Head: OrganMotorkindHead
ArmLeft: OrganMotorkindFrontLeft
ArmRight: OrganMotorkindFrontRight
# HandRight: OrganHumanHandRight
# HandLeft: OrganHumanHandLeft
HandRight: OrganMotorkindHandRight
HandLeft: OrganMotorkindHandLeft
LegLeft: OrganMotorkindBackLeft
LegRight: OrganMotorkindBackRight
# FootLeft: OrganHumanFootLeft
@ -115,7 +115,7 @@
- type: HumanoidProfile
species: Motorkind
- type: ScaleVisuals
scale: 2, 2
speciesScale: 2, 2
- type: entity
name: Urist McQueen
@ -328,8 +328,8 @@
- state: windshield
- type: VisualOrgan
data:
sprite: _DV/Mobs/Species/Motorkind/organs.rsi
state: windshield
sprite: _DV/Mobs/Species/Motorkind/parts.rsi
state: eyes
- type: entity
parent: [ OrganMotorkindInternal ]
@ -387,3 +387,46 @@
heldPrefix: lungs
- type: Metabolizer
metabolizerTypes: [ Fuel ]
- type: entity
abstract: true
parent: OrganBase
id: OrganBaseInvisibleHand
name: invisible hand
components:
- type: Organ
category: HandRight
- type: HandOrgan
handID: right
data:
location: Right
- type: Sprite
state: r_hand
- type: entity
parent: [ OrganBaseInvisibleHand ]
id: OrganMotorkindHandLeft
components:
- type: Organ
category: HandLeft
- type: HandOrgan
handID: left
data:
location: Left
- type: Sprite
sprite: Mobs/Species/Human/parts.rsi
state: l_hand
- type: entity
parent: [ OrganBaseInvisibleHand ]
id: OrganMotorkindHandRight
components:
- type: Organ
category: HandRight
- type: HandOrgan
handID: right
data:
location: Right
- type: Sprite
sprite: Mobs/Species/Human/parts.rsi
state: r_hand

View File

@ -102,11 +102,12 @@
state: full
- type: Speech
allowedEmotes: ["Marr", "Wurble", "Hiss", "Growl", "Purr"]
speechSounds: Shadekin
- type: Vocal
sounds:
Male: MaleShadekin
Female: FemaleShadekin
Unsexed: MaleShadekin
Male: MaleShadowkin
Female: FemaleShadowkin
Unsexed: MaleShadowkin
- type: MeleeWeapon
soundHit:
collection: AlienClaw

View File

@ -58,3 +58,17 @@
entity_storage: !type:AllSelector
children:
- id: CrashCart
- type: entity
parent: CrateMedicalSecure
id: CrateCrewMonitoringDV
name: crew monitoring crate
description: Contains a flatpack of a crew monitoring server and a few crew monitoring computers. Requires Medical access to open.
components:
- type: EntityTableContainerFill
containers:
entity_storage: !type:AllSelector
children:
- id: CrewMonitoringServerFlatpack
- id: CrewMonitoringComputerFlatpack
amount: 3

View File

@ -65,6 +65,8 @@
- type: DisarmMalus
- type: Item
size: Huge
shape:
- 0,0,1,3
sprite: _DV/CosmicCult/Objects/cosmicsword-inhands.rsi
inhandVisuals:
left:

View File

@ -12,7 +12,7 @@
- type: Armor # Good against gunshots, decent against everything else. Balanced by reduced movement speed.
modifiers:
coefficients:
Blunt: 0.80
Blunt: 0.90
Slash: 0.80
Piercing: 0.50
Heat: 0.80
@ -42,10 +42,11 @@
- type: Armor # Good against stabs and knocks, offers minimal protection from gunshots and lasfire.
modifiers:
coefficients:
Blunt: 0.60
Slash: 0.60
Blunt: 0.50
Slash: 0.50
Piercing: 0.90
Heat: 0.90
Heat: 0.80
staminaMeleeDamageCoefficient: 0.6
- type: StaminaResistance
damageCoefficient: 0.9
- type: ExplosionResistance # Better than nothing against a blast or shockwave.

View File

@ -0,0 +1,175 @@
# Non-Departmental
- type: entity
parent: [ ClothingOuterStorageFoldableBase, ClothingOuterWinterCoat ]
id: ClothingOuterCoatBomberCheckered
name: checkered bomber jacket
description: A thick, well-worn vintage leather bomber jacket. It's dark blue, brandishing a checkerboard pattern on the back.
components:
- type: Sprite
sprite: _DV/Clothing/OuterClothing/Coats/Bombers/checkered.rsi
- type: Clothing
sprite: _DV/Clothing/OuterClothing/Coats/Bombers/checkered.rsi
- type: entity
parent: [ ClothingOuterStorageFoldableBaseOpened, ClothingOuterCoatBomberCheckered ]
id: ClothingOuterCoatBomberCheckeredOpened
categories: [ HideSpawnMenu ]
# Engineering
- type: entity
parent: [ ClothingOuterStorageFoldableBase, ClothingOuterWinterCoat ]
id: ClothingOuterCoatBomberEngineering
name: engineering bomber jacket
description: A thick, well-worn vintage leather bomber jacket brandishing engineering flair. It features a singularity patch on the back.
components:
- type: Sprite
sprite: _DV/Clothing/OuterClothing/Coats/Bombers/engi.rsi
- type: Clothing
sprite: _DV/Clothing/OuterClothing/Coats/Bombers/engi.rsi
- type: entity
parent: [ ClothingOuterStorageFoldableBaseOpened, ClothingOuterCoatBomberEngineering ]
id: ClothingOuterCoatBomberEngineeringOpened
categories: [ HideSpawnMenu ]
# Epistemic
- type: entity
parent: [ ClothingOuterStorageFoldableBase, ClothingOuterWinterCoat ]
id: ClothingOuterCoatBomberEpistemic
name: epistemic bomber jacket
description: A thick, well-worn vintage leather bomber jacket brandishing epistemics flair. It features an alien patch on the back.
components:
- type: Sprite
sprite: _DV/Clothing/OuterClothing/Coats/Bombers/epi.rsi
- type: Clothing
sprite: _DV/Clothing/OuterClothing/Coats/Bombers/epi.rsi
- type: entity
parent: [ ClothingOuterStorageFoldableBaseOpened, ClothingOuterCoatBomberEpistemic ]
id: ClothingOuterCoatBomberEpistemicOpened
categories: [ HideSpawnMenu ]
# Logistic
- type: entity
parent: [ ClothingOuterStorageFoldableBase, ClothingOuterWinterCoat ]
id: ClothingOuterCoatBomberLogistic
name: logistic bomber jacket
description: A thick, well-worn vintage leather bomber jacket brandishing logistics flair. It features a yellow band around the chest.
components:
- type: Sprite
sprite: _DV/Clothing/OuterClothing/Coats/Bombers/logi.rsi
- type: Clothing
sprite: _DV/Clothing/OuterClothing/Coats/Bombers/logi.rsi
- type: entity
parent: [ ClothingOuterStorageFoldableBaseOpened, ClothingOuterCoatBomberEpistemic ]
id: ClothingOuterCoatBomberLogisticOpened
categories: [ HideSpawnMenu ]
# Medical
- type: entity
parent: [ ClothingOuterStorageFoldableBase, ClothingOuterWinterCoat ]
id: ClothingOuterCoatBomberMedical
name: medical bomber jacket
description: A thick, well-worn vintage leather bomber jacket brandishing medical flair. It features a medical Cross patch on the back.
components:
- type: Sprite
sprite: _DV/Clothing/OuterClothing/Coats/Bombers/med.rsi
- type: Clothing
sprite: _DV/Clothing/OuterClothing/Coats/Bombers/med.rsi
- type: entity
parent: [ ClothingOuterStorageFoldableBaseOpened, ClothingOuterCoatBomberMedical ]
id: ClothingOuterCoatBomberMedicalOpened
categories: [ HideSpawnMenu ]
# Security
- type: entity
parent: [ ClothingOuterStorageFoldableBase, ClothingOuterArmoredWinterCoat ]
id: ClothingOuterCoatBomberSecurity
name: security bomber jacket
description: An armored, well-worn vintage leather bomber jacket brandishing security flair. It features a shield patch on the back.
components:
- type: Sprite
sprite: _DV/Clothing/OuterClothing/Coats/Bombers/sec.rsi
- type: Clothing
sprite: _DV/Clothing/OuterClothing/Coats/Bombers/sec.rsi
- type: entity
parent: [ ClothingOuterStorageFoldableBaseOpened, ClothingOuterCoatBomberSecurity ]
id: ClothingOuterCoatBomberSecurityOpened
categories: [ HideSpawnMenu ]
# Service
- type: entity
parent: [ ClothingOuterStorageFoldableBase, ClothingOuterWinterCoat ]
id: ClothingOuterCoatBomberService
name: service bomber jacket
description: A thick, well-worn vintage leather bomber jacket brandishing service flair. It features blue hook-and-loop fastener around the waist, but it seems to be non-functional.
components:
- type: Sprite
sprite: _DV/Clothing/OuterClothing/Coats/Bombers/service.rsi
- type: Clothing
sprite: _DV/Clothing/OuterClothing/Coats/Bombers/service.rsi
- type: entity
parent: [ ClothingOuterStorageFoldableBaseOpened, ClothingOuterCoatBomberService ]
id: ClothingOuterCoatBomberServiceOpened
categories: [ HideSpawnMenu ]
# Syndicate
- type: entity
parent: [ ClothingOuterStorageFoldableBase, ClothingOuterWinterCoat ]
id: ClothingOuterCoatBomberSyndicate
name: syndicate bomber jacket
description: A sturdy, well-worn vintage leather bomber jacket brandishing syndicate flair. It's totally legal, officer! I swear!
components:
- type: Sprite
sprite: _DV/Clothing/OuterClothing/Coats/Bombers/syndi.rsi
- type: Clothing
sprite: _DV/Clothing/OuterClothing/Coats/Bombers/syndi.rsi
- type: Armor # Same as Cybersun Windbreaker but cold instead of heat
modifiers:
coefficients:
Blunt: 0.95
Slash: 0.95
Piercing: 0.95
Cold: 0.75
- type: entity
parent: [ ClothingOuterStorageFoldableBaseOpened, ClothingOuterCoatBomberSyndicate ]
id: ClothingOuterCoatBomberSyndicateOpened
categories: [ HideSpawnMenu ]
- type: entity
parent: ClothingOuterCoatBomberSyndicate
id: ClothingOuterCoatBomberCybersun
name: cybersun bomber jacket
description: A sturdy, well-worn vintage leather bomber jacket brandishing Cybersun flair. The fur seems to be glowing. The wonders of modern science.
components:
- type: Sprite
sprite: _DV/Clothing/OuterClothing/Coats/Bombers/cybersun.rsi
layers:
- state: icon
- state: icon-unshaded
shader: unshaded
- type: Clothing
sprite: _DV/Clothing/OuterClothing/Coats/Bombers/cybersun.rsi
clothingVisuals:
outerClothing:
- state: equipped-OUTERCLOTHING
- state: unshaded
shader: unshaded
- type: entity
parent: [ ClothingOuterStorageFoldableBaseOpened, ClothingOuterCoatBomberCybersun ]
id: ClothingOuterCoatBomberCybersunOpened
categories: [ HideSpawnMenu ]

View File

@ -108,3 +108,10 @@
- type: Tag
tags:
- K9Armor
- type: Armor
modifiers:
coefficients:
Blunt: 0.6
Slash: 0.6
Piercing: 0.9
Heat: 0.9

View File

@ -1,213 +0,0 @@
# region Engineering
- type: entity
parent: BorgEngineerSubtypeBase
id: EngineerStandardSubtype
name: standard engineering cyborg
description: "A standard cyborg for all your engineering needs."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisEngineeringStandard
spritePath: _DV/Mobs/Silicon/Cyborgs/Engineering/standard.rsi
- type: entity
parent: BorgEngineerSubtypeBase
id: EngineerGenericSubtype
name: generic engineering cyborg
description: "A generic cyborg for all your engineering needs."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisEngineeringGeneric
spritePath: _DV/Mobs/Silicon/Cyborgs/Engineering/generic.rsi
- type: entity
parent: BorgEngineerSubtypeBase
id: EngineerAntiqueSubtype
name: antique engineering cyborg
description: "An antique engineering cyborg, looks like it has patched up hundreds of meteor holes."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisEngineeringAntique
spritePath: _DV/Mobs/Silicon/Cyborgs/Engineering/antique.rsi
# region Generic
- type: entity
parent: BorgGenericSubtypeBase
id: GenericGenericSubtype
name: generic cyborg
description: "A generic cyborg, it's extra generic looking."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisGenericGeneric
spritePath: _DV/Mobs/Silicon/Cyborgs/Generic/generic.rsi
# region Janitor
- type: entity
parent: BorgJanitorSubtypeBase
id: JanitorStandardSubtype
name: standard janitor cyborg
description: "A standard cyborg for all your janitorial needs."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisJanitorStandard
spritePath: _DV/Mobs/Silicon/Cyborgs/Janitor/standard.rsi
- type: entity
parent: BorgJanitorSubtypeBase
id: JanitorGenericSubtype
name: generic janitor cyborg
description: "A generic cyborg for all your janitorial needs."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisJanitorGeneric
spritePath: _DV/Mobs/Silicon/Cyborgs/Janitor/generic.rsi
- type: entity
parent: BorgJanitorSubtypeBase
id: JanitorMopbotSubtype
name: mopbot cyborg
description: "A bot with a mop, call it Mopbot."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisJanitorMopbot
spritePath: _DV/Mobs/Silicon/Cyborgs/Janitor/mopbot.rsi
- type: entity
parent: BorgJanitorSubtypeBase
id: JanitorVestSubtype
name: vest janitor cyborg
description: "A janitor cyborg with a high-visibility vest."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisJanitorVest
spritePath: _DV/Mobs/Silicon/Cyborgs/Janitor/vest.rsi
# region Medical
- type: entity
parent: BorgMedicalSubtypeBase
id: MedicalStandardSubtype
name: standard medical cyborg
description: "A standard cyborg for all your medical needs."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisMedicalStandard
spritePath: _DV/Mobs/Silicon/Cyborgs/Medical/standard.rsi
- type: entity
parent: BorgMedicalSubtypeBase
id: MedicalGenericSubtype
name: generic medical cyborg
description: "A generic cyborg for all your medical needs."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisMedicalGeneric
spritePath: _DV/Mobs/Silicon/Cyborgs/Medical/generic.rsi
- type: entity
parent: BorgMedicalSubtypeBase
id: MedicalDoctorSubtype
name: doctor medical cyborg
description: "A cyborg in a white coat for all your medical needs."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisMedicalDoctor
spritePath: _DV/Mobs/Silicon/Cyborgs/Medical/doctor.rsi
# region Salvage
- type: entity
parent: BorgSalvageSubtypeBase
id: SalvageStandardSubtype
name: standard salvage cyborg
description: "A standard cyborg for all your salvage needs."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisSalvageStandard
spritePath: _DV/Mobs/Silicon/Cyborgs/Salvage/standard.rsi
- type: entity
parent: BorgSalvageSubtypeBase
id: SalvageGenericSubtype
name: generic salvage cyborg
description: "A generic cyborg for all your salvage needs."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisSalvageGeneric
spritePath: _DV/Mobs/Silicon/Cyborgs/Salvage/generic.rsi
# region Security
- type: entity
parent: BorgSecuritySubtypeBase
id: SecurityStandardSubtype
name: standard security cyborg
description: "A standard cyborg for all your security needs."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisSecurityStandard
spritePath: _DV/Mobs/Silicon/Cyborgs/Security/standard.rsi
- type: entity
parent: BorgSecuritySubtypeBase
id: SecurityGenericSubtype
name: generic security cyborg
description: "A generic cyborg for all your security needs."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisSecurityGeneric
spritePath: _DV/Mobs/Silicon/Cyborgs/Security/generic.rsi
# region Service
- type: entity
parent: BorgServiceSubtypeBase
id: ServiceStandardSubtype
name: standard service cyborg
description: "A standard cyborg for all your service needs."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisServiceStandard
spritePath: _DV/Mobs/Silicon/Cyborgs/Service/standard.rsi
- type: entity
parent: BorgServiceSubtypeBase
id: ServiceGenericSubtype
name: generic service cyborg
description: "A generic cyborg for all your service needs."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisServiceGeneric
spritePath: _DV/Mobs/Silicon/Cyborgs/Service/generic.rsi
- type: entity
parent: BorgServiceSubtypeBase
id: ServiceWaitressSubtype
name: waitress service cyborg
description: "A service cyborg in a waitress uniform."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisServiceWaitress
spritePath: _DV/Mobs/Silicon/Cyborgs/Service/waitress.rsi
- type: entity
parent: BorgServiceSubtypeBase
id: ServiceBrobotSubtype
name: brobot service cyborg
description: "Suh dude!?"
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisServiceBrobot
spritePath: _DV/Mobs/Silicon/Cyborgs/Service/brobot.rsi
- type: entity
parent: BorgServiceSubtypeBase
id: ServiceMaximiliumSubtype
name: maximilium service cyborg
description: "A rather distinguished service cyborg."
components:
- type: BorgSubtypeDefinition
dummyPrototype: BorgChassisServiceMaximilium
spritePath: _DV/Mobs/Silicon/Cyborgs/Service/maximilium.rsi

View File

@ -1,216 +0,0 @@
# region Engineering
- type: entity
id: BorgChassisEngineeringStandard
parent: BorgChassisSelectable
name: standard engineering cyborg
components:
- type: ShowAccessReaderSettings
- type: BorgSwitchableType
selectedBorgType: engineering
- type: BorgSwitchableSubtype
borgSubtype: EngineerStandardSubtype
- type: entity
id: BorgChassisEngineeringGeneric
parent: BorgChassisSelectable
name: generic engineering cyborg
components:
- type: ShowAccessReaderSettings
- type: BorgSwitchableType
selectedBorgType: engineering
- type: BorgSwitchableSubtype
borgSubtype: EngineerGenericSubtype
- type: entity
id: BorgChassisEngineeringAntique
parent: BorgChassisSelectable
name: antique engineering cyborg
components:
- type: ShowAccessReaderSettings
- type: BorgSwitchableType
selectedBorgType: engineering
- type: BorgSwitchableSubtype
borgSubtype: EngineerAntiqueSubtype
# region Generic
- type: entity
id: BorgChassisGenericGeneric
parent: BorgChassisSelectable
name: generic cyborg
components:
- type: BorgSwitchableType
selectedBorgType: generic
- type: BorgSwitchableSubtype
borgSubtype: GenericGenericSubtype
# region Janitor
- type: entity
id: BorgChassisJanitorStandard
parent: BorgChassisSelectable
name: standard janitor cyborg
components:
- type: BorgSwitchableType
selectedBorgType: janitor
- type: BorgSwitchableSubtype
borgSubtype: JanitorStandardSubtype
- type: entity
id: BorgChassisJanitorGeneric
parent: BorgChassisSelectable
name: generic janitor cyborg
components:
- type: BorgSwitchableType
selectedBorgType: janitor
- type: BorgSwitchableSubtype
borgSubtype: JanitorGenericSubtype
- type: entity
id: BorgChassisJanitorMopbot
parent: BorgChassisSelectable
name: mopbot cyborg
components:
- type: BorgSwitchableType
selectedBorgType: janitor
- type: BorgSwitchableSubtype
borgSubtype: JanitorMopbotSubtype
- type: entity
id: BorgChassisJanitorVest
parent: BorgChassisSelectable
name: vest janitor cyborg
components:
- type: BorgSwitchableType
selectedBorgType: janitor
- type: BorgSwitchableSubtype
borgSubtype: JanitorVestSubtype
# region Medical
- type: entity
id: BorgChassisMedicalStandard
parent: BorgChassisSelectable
name: standard medical cyborg
components:
- type: BorgSwitchableType
selectedBorgType: medical
- type: BorgSwitchableSubtype
borgSubtype: MedicalStandardSubtype
- type: entity
id: BorgChassisMedicalGeneric
parent: BorgChassisSelectable
name: generic medical cyborg
components:
- type: BorgSwitchableType
selectedBorgType: medical
- type: BorgSwitchableSubtype
borgSubtype: MedicalGenericSubtype
- type: entity
id: BorgChassisMedicalDoctor
parent: BorgChassisSelectable
name: doctor medical cyborg
components:
- type: BorgSwitchableType
selectedBorgType: medical
- type: BorgSwitchableSubtype
borgSubtype: MedicalDoctorSubtype
# region Salvage
- type: entity
id: BorgChassisSalvageStandard
parent: BorgChassisSelectable
name: standard salvage cyborg
components:
- type: BorgSwitchableType
selectedBorgType: mining
- type: BorgSwitchableSubtype
borgSubtype: SalvageStandardSubtype
- type: entity
id: BorgChassisSalvageGeneric
parent: BorgChassisSelectable
name: generic salvage cyborg
components:
- type: BorgSwitchableType
selectedBorgType: mining
- type: BorgSwitchableSubtype
borgSubtype: SalvageGenericSubtype
# region Security
- type: entity
id: BorgChassisSecurityStandard
parent: BorgChassisSelectable
name: standard security cyborg
components:
- type: BorgSwitchableType
selectedBorgType: security
- type: BorgSwitchableSubtype
borgSubtype: SecurityStandardSubtype
- type: entity
id: BorgChassisSecurityGeneric
parent: BorgChassisSelectable
name: generic security cyborg
components:
- type: BorgSwitchableType
selectedBorgType: security
- type: BorgSwitchableSubtype
borgSubtype: SecurityGenericSubtype
# region Service
- type: entity
id: BorgChassisServiceStandard
parent: BorgChassisSelectable
name: standard service cyborg
components:
- type: BorgSwitchableType
selectedBorgType: service
- type: BorgSwitchableSubtype
borgSubtype: ServiceStandardSubtype
- type: entity
id: BorgChassisServiceGeneric
parent: BorgChassisSelectable
name: generic service cyborg
components:
- type: BorgSwitchableType
selectedBorgType: service
- type: BorgSwitchableSubtype
borgSubtype: ServiceGenericSubtype
- type: entity
id: BorgChassisServiceWaitress
parent: BorgChassisSelectable
name: waitress service cyborg
components:
- type: BorgSwitchableType
selectedBorgType: service
- type: BorgSwitchableSubtype
borgSubtype: ServiceWaitressSubtype
- type: entity
id: BorgChassisServiceBrobot
parent: BorgChassisSelectable
name: brobot service cyborg
components:
- type: BorgSwitchableType
selectedBorgType: service
- type: BorgSwitchableSubtype
borgSubtype: ServiceBrobotSubtype
- type: entity
id: BorgChassisServiceMaximilium
parent: BorgChassisSelectable
name: maximilium service cyborg
components:
- type: BorgSwitchableType
selectedBorgType: service
- type: BorgSwitchableSubtype
borgSubtype: ServiceMaximiliumSubtype

View File

@ -11,4 +11,8 @@
Structural: 20
penetrationThreshold: 200 # This is irrelevant - As long as it's above 0.
- type: PiercingProjectile
pierceCounterWhitelist:
tags:
- Wall
- Window
healthThreshold: 200 # Normal walls have a threshold of 200.

View File

@ -1,7 +1,7 @@
- type: entity
name: NT-3
parent: BaseItem # The base LightMachineGun had unwanted components.
id: WeaponLightMachinegGunNT3
name: NT-3
description: An ancient weapon from the old wars, refurbished and rebranded for NT's strongest stations.
components:
- type: Sprite
@ -18,7 +18,7 @@
- type: Item
size: Ginormous
shape:
- 0,0,4,3
- 0,0,6,3
- type: Clothing
sprite: _DV/Objects/Weapons/Guns/LMGs/NT-3.rsi
quickEquip: false
@ -44,6 +44,7 @@
soundEmpty:
path: /Audio/Weapons/Guns/Empty/lmg_empty.ogg
- type: GunBipod
setupDelay: 2
minAngle: -12
maxAngle: -20
angleDecay: 4
@ -78,3 +79,6 @@
price: 500
- type: UseDelay
delay: 1
- type: Tag
tags:
- ParcelWrapBlacklist

View File

@ -35,3 +35,9 @@
id: InventoryAssociatePDA
equipment:
id: InventoryAssociatePDA
# OuterClothing
- type: loadout
id: BomberLogistic
equipment:
outerClothing: ClothingOuterCoatBomberLogistic

View File

@ -3,3 +3,9 @@
id: BotanistJumpskirtOveralls
equipment:
jumpsuit: ClothingUniformJumpskirtOveralls
# OuterClothing
- type: loadout
id: BomberService
equipment:
outerClothing: ClothingOuterCoatBomberService

View File

@ -678,6 +678,16 @@
equipment:
outerClothing: ClothingOuterFlannelGreen
- type: loadout
id: BomberJacket
equipment:
outerClothing: ClothingOuterCoatBomberCheckered
- type: loadout
id: BomberCheckered
equipment:
outerClothing: ClothingOuterCoatBomber
# Shoes
## Green Shoes
- type: loadout

View File

@ -19,3 +19,8 @@
id: StationEngineerWintercoat
equipment:
outerClothing: ClothingOuterWinterEngi
- type: loadout
id: BomberEngineering
equipment:
outerClothing: ClothingOuterCoatBomberEngineering

View File

@ -26,7 +26,6 @@
head: ClothingHeadHatBeretMedical
# Jumpsuit
- type: loadout
id: MedicalApronJumpsuit
equipment:
@ -58,7 +57,6 @@
jumpsuit: ClothingUniformJumpskirtMedicalVest
# OuterClothing
- type: loadout
id: MedicalLabCoat
equipment:
@ -73,3 +71,8 @@
id: LongLabCoat
equipment:
outerClothing: ClothingOuterCoatLabLong
- type: loadout
id: BomberMedical
equipment:
outerClothing: ClothingOuterCoatBomberMedical

View File

@ -10,7 +10,6 @@
id: XenoarchPDA
# Jumpsuits
- type: loadout
id: FormalScientistJumpsuit
equipment:
@ -20,3 +19,9 @@
id: FormalScientistJumpskirt
equipment:
jumpsuit: ClothingUniformJumpskirtScientistFormal
# OuterClothing
- type: loadout
id: BomberEpistemic
equipment:
outerClothing: ClothingOuterCoatBomberEpistemic

View File

@ -150,6 +150,11 @@
equipment:
outerClothing: ClothingLongcoatSecurity
- type: loadout
id: BomberSecurity
equipment:
outerClothing: ClothingOuterCoatBomberSecurity
# Gloves
- type: loadout

View File

@ -232,6 +232,7 @@
minLimit: 0
loadouts:
- CargoTechnicianWintercoat
- BomberLogistic
- type: loadoutGroup
id: CargoAssistantShoes
@ -300,6 +301,7 @@
loadouts:
- LongcoatBrigmedic
- StasecWinterCoatCorpsman
- BomberSecurity
- PlateCarrier
- DuraVest
- ArmorVestSlim
@ -491,6 +493,7 @@
- StasecSweater
- LongcoatSecurity
- StasecWinterCoat
- BomberSecurity
- ArmorVestSlim
## Warden
@ -502,6 +505,7 @@
- DuraVest
- WardenLongcoat
- StasecWinterCoatWarden
- BomberSecurity
- ArmorVestSlim
# - WardenArmoredWinterCoat #Disabled during bluesec testing
@ -517,6 +521,7 @@
- HeadOfSecurityTrenchcoat
- ArmorVestSlim
- HeadofSecurityWinterCoat
- BomberSecurity
## Detective
- type: loadoutGroup
@ -538,6 +543,7 @@
loadouts:
- LongcoatSecurity
- StasecWinterCoatDet
- BomberSecurity
- PlateCarrier
- DuraVest
- DetPlatedCoat
@ -565,6 +571,7 @@
- PsychologistWinterCoat
- WinterCoatPlaid
- PsychologistCoatBomber
- BomberMedical
- PsychologistSweater
- type: loadoutGroup

View File

@ -30,6 +30,7 @@
id: MedicalBoardsDeltaV
recipes:
- CrewMonitoringComputerCircuitboard
- CrewMonitoringServerMachineCircuitboard
- CloningConsoleComputerCircuitboard
- MedicalScannerMachineCircuitboard
- CloningPodMachineCircuitboard

View File

@ -1,5 +1,11 @@
# Atmos
#MARK: Atmos
- type: latheRecipe
parent: [ BaseCircuitboardRecipe, BaseEngineeringMachineRecipeCategory ]
id: KitchenFreezerMachineCircuitBoard
result: KitchenFreezerMachineCircuitBoard
#MARK: Medical
- type: latheRecipe
parent: [ BaseCircuitboardRecipe, BaseMedicalMachineRecipeCategory ]
id: CrewMonitoringServerMachineCircuitboard
result: CrewMonitoringServerMachineCircuitboard

View File

@ -1,6 +1,4 @@
# Tier 1
# Tier 2
#MARK: Tier 2
- type: technology
id: Cloning
@ -17,4 +15,18 @@
- MedicalScannerMachineCircuitboard
- CloningPodMachineCircuitboard
# Tier 3
#MARK: Tier 3
- type: technology
id: MedicalTracking
name: research-technology-medical-tracking
icon:
sprite: Objects/Specific/Medical/handheldcrewmonitor.rsi
state: scanner
discipline: Biochemical
tier: 3
cost: 15000
recipeUnlocks:
- HandheldCrewMonitor
- CrewMonitoringServerMachineCircuitboard
- CrewMonitoringComputerCircuitboard

View File

@ -739,6 +739,70 @@
Mew:
collection: FelinidMews
- type: emoteSounds
id: MonkeySounds
sounds:
Clap:
collection: Claps
params:
pitch: 1.3
ClapSingle:
collection: ClapSingle
Snap:
collection: Snaps
Salute:
collection: Salutes
Laugh:
path: /Audio/Animals/ferret_happy.ogg
params:
variation: 0.125
Cough:
path: /Audio/Effects/Diseases/monkey2.ogg
params:
pitch: 0.9
variation: 0.125
Whistle:
collection: Whistles
Sigh:
collection: MaleSigh
params:
variation: 0.125
Scream:
path: /Audio/Animals/monkey_scream.ogg
params:
variation: 0.125
Yawn:
path: /Audio/Animals/monkey_scream.ogg
params:
pitch: 0.6
variation: 0.125
volume: -4
Crying:
path: /Audio/Animals/ferret_happy.ogg
params:
pitch: 0.8
Snore:
collection: Snores
Weh:
collection: Weh
Hew:
collection: Hew
Honk:
collection: BikeHorn
Gasp:
collection: MaleGasp
params:
pitch: 1.3
DefaultDeathgasp:
collection: DeathGasp
Gulp:
path: /Audio/_Goobstation/Voice/Human/gulp.ogg
params:
pitch: 1.3
variation: 0.125
Blink: # Imp
collection: Blinks # Imp
- type: emoteSounds
id: SyntheticEmoteSounds
params:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 881 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 477 B

Some files were not shown because too many files have changed in this diff Show More