Merge remote-tracking branch 'refs/remotes/wizards/master'

This commit is contained in:
VigersRay 2024-06-17 18:46:10 +03:00
commit e3d0eb3821
36 changed files with 369 additions and 639 deletions

View file

@ -1,5 +1,6 @@
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Numerics;
using Content.Client.Inventory;
using Content.Shared.Clothing;
using Content.Shared.Clothing.Components;
@ -116,6 +117,7 @@ public sealed class ClientClothingSystem : ClothingSystem
i++;
}
item.MappedLayer = key;
args.Layers.Add((key, layer));
}
}
@ -156,13 +158,9 @@ public sealed class ClientClothingSystem : ClothingSystem
// species specific
if (speciesId != null && rsi.TryGetState($"{state}-{speciesId}", out _))
{
state = $"{state}-{speciesId}";
}
else if (!rsi.TryGetState(state, out _))
{
return false;
}
var layer = new PrototypeLayerData();
layer.RsiPath = rsi.Path.ToString();
@ -290,6 +288,8 @@ public sealed class ClientClothingSystem : ClothingSystem
if (layerData.Color != null)
sprite.LayerSetColor(key, layerData.Color.Value);
if (layerData.Scale != null)
sprite.LayerSetScale(key, layerData.Scale.Value);
}
else
index = sprite.LayerMapReserveBlank(key);

View file

@ -0,0 +1,48 @@
using Content.Shared.Clothing;
using Content.Shared.Clothing.Components;
using Content.Shared.Clothing.EntitySystems;
using Content.Shared.Foldable;
using Content.Shared.Item;
using Robust.Client.GameObjects;
namespace Content.Client.Clothing;
public sealed class FlippableClothingVisualizerSystem : VisualizerSystem<FlippableClothingVisualsComponent>
{
[Dependency] private readonly SharedItemSystem _itemSys = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<FlippableClothingVisualsComponent, GetEquipmentVisualsEvent>(OnGetVisuals, after: [typeof(ClothingSystem)]);
SubscribeLocalEvent<FlippableClothingVisualsComponent, FoldedEvent>(OnFolded);
}
private void OnFolded(Entity<FlippableClothingVisualsComponent> ent, ref FoldedEvent args)
{
_itemSys.VisualsChanged(ent);
}
private void OnGetVisuals(Entity<FlippableClothingVisualsComponent> ent, ref GetEquipmentVisualsEvent args)
{
if (!TryComp(ent, out SpriteComponent? sprite) ||
!TryComp(ent, out ClothingComponent? clothing))
return;
if (clothing.MappedLayer == null ||
!AppearanceSystem.TryGetData<bool>(ent, FoldableSystem.FoldedVisuals.State, out var folding) ||
!sprite.LayerMapTryGet(folding ? ent.Comp.FoldingLayer : ent.Comp.UnfoldingLayer, out var idx))
return;
// add each layer to the visuals
var spriteLayer = sprite[idx];
foreach (var layer in args.Layers)
{
if (layer.Item1 != clothing.MappedLayer)
continue;
layer.Item2.Scale = spriteLayer.Scale;
}
}
}

View file

@ -0,0 +1,16 @@
namespace Content.Client.Clothing;
/// <summary>
/// Communicates folded layers data (currently only Scale to handle flipping)
/// to the wearer clothing sprite layer
/// </summary>
[RegisterComponent]
[Access(typeof(FlippableClothingVisualizerSystem))]
public sealed partial class FlippableClothingVisualsComponent : Component
{
[DataField]
public string FoldingLayer = "foldedLayer";
[DataField]
public string UnfoldingLayer = "unfoldedLayer";
}

View file

@ -134,7 +134,7 @@ public sealed partial class RoboticsConsoleWindow : FancyWindow
BorgInfo.SetMessage(text);
// how the turntables
DisableButton.Disabled = !data.HasBrain;
DisableButton.Disabled = !(data.HasBrain && data.CanDisable);
DestroyButton.Disabled = _timing.CurTime < _console.Comp1.NextDestroy;
}

View file

@ -43,9 +43,6 @@ public sealed class RandomSpriteSystem : SharedRandomSpriteSystem
if (!Resolve(uid, ref clothing, false))
return;
if (clothing.ClothingVisuals == null)
return;
foreach (var slotPair in clothing.ClothingVisuals)
{
foreach (var keyColorPair in component.Selected)

View file

@ -1,7 +1,7 @@
namespace Content.Server.Explosion.Components;
/// <summary>
/// Disallows starting the timer by hand, must be stuck or triggered by a system.
/// Disallows starting the timer by hand, must be stuck or triggered by a system using <c>StartTimer</c>.
/// </summary>
[RegisterComponent]
public sealed partial class AutomatedTimerComponent : Component

View file

@ -26,13 +26,7 @@ public sealed partial class TriggerSystem
if (!component.StartOnStick)
return;
HandleTimerTrigger(
uid,
args.User,
component.Delay,
component.BeepInterval,
component.InitialBeepDelay,
component.BeepSound);
StartTimer((uid, component), args.User);
}
private void OnExamined(EntityUid uid, OnUseTimerTriggerComponent component, ExaminedEvent args)
@ -54,14 +48,7 @@ public sealed partial class TriggerSystem
args.Verbs.Add(new AlternativeVerb()
{
Text = Loc.GetString("verb-start-detonation"),
Act = () => HandleTimerTrigger(
uid,
args.User,
component.Delay,
component.BeepInterval,
component.InitialBeepDelay,
component.BeepSound
),
Act = () => StartTimer((uid, component), args.User),
Priority = 2
});
}
@ -174,13 +161,7 @@ public sealed partial class TriggerSystem
if (component.DoPopup)
_popupSystem.PopupEntity(Loc.GetString("trigger-activated", ("device", uid)), args.User, args.User);
HandleTimerTrigger(
uid,
args.User,
component.Delay,
component.BeepInterval,
component.InitialBeepDelay,
component.BeepSound);
StartTimer((uid, component), args.User);
args.Handled = true;
}

View file

@ -265,6 +265,18 @@ namespace Content.Server.Explosion.EntitySystems
comp.TimeRemaining += amount;
}
/// <summary>
/// Start the timer for triggering the device.
/// </summary>
public void StartTimer(Entity<OnUseTimerTriggerComponent?> ent, EntityUid? user)
{
if (!Resolve(ent, ref ent.Comp, false))
return;
var comp = ent.Comp;
HandleTimerTrigger(ent, user, comp.Delay, comp.BeepInterval, comp.InitialBeepDelay, comp.BeepSound);
}
public void HandleTimerTrigger(EntityUid uid, EntityUid? user, float delay, float beepInterval, float? initialBeepDelay, SoundSpecifier? beepSound)
{
if (delay <= 0)

View file

@ -179,7 +179,7 @@ public sealed class TegSystem : EntitySystem
component.LastGeneration = electricalEnergy;
// Turn energy (at atmos tick rate) into wattage.
var power = electricalEnergy * _atmosphere.AtmosTickRate;
var power = electricalEnergy / args.dt;
// Add ramp factor. This magics slight power into existence, but allows us to ramp up.
supplier.MaxSupply = power * component.RampFactor;

View file

@ -1,5 +1,6 @@
using Content.Shared.DeviceNetwork;
using Content.Shared.Emag.Components;
using Content.Shared.Movement.Components;
using Content.Shared.Popups;
using Content.Shared.Robotics;
using Content.Shared.Silicons.Borgs.Components;
@ -26,6 +27,9 @@ public sealed partial class BorgSystem
var query = EntityQueryEnumerator<BorgTransponderComponent, BorgChassisComponent, DeviceNetworkComponent, MetaDataComponent>();
while (query.MoveNext(out var uid, out var comp, out var chassis, out var device, out var meta))
{
if (comp.NextDisable is {} nextDisable && now >= nextDisable)
DoDisable((uid, comp, chassis, meta));
if (now < comp.NextBroadcast)
continue;
@ -33,13 +37,16 @@ public sealed partial class BorgSystem
if (_powerCell.TryGetBatteryFromSlot(uid, out var battery))
charge = battery.CurrentCharge / battery.MaxCharge;
var hasBrain = chassis.BrainEntity != null && !comp.FakeDisabled;
var canDisable = comp.NextDisable == null && !comp.FakeDisabling;
var data = new CyborgControlData(
comp.Sprite,
comp.Name,
meta.EntityName,
charge,
chassis.ModuleCount,
chassis.BrainEntity != null);
hasBrain,
canDisable);
var payload = new NetworkPayload()
{
@ -52,6 +59,24 @@ public sealed partial class BorgSystem
}
}
private void DoDisable(Entity<BorgTransponderComponent, BorgChassisComponent, MetaDataComponent> ent)
{
ent.Comp1.NextDisable = null;
if (ent.Comp1.FakeDisabling)
{
ent.Comp1.FakeDisabled = true;
ent.Comp1.FakeDisabling = false;
return;
}
if (ent.Comp2.BrainEntity is not {} brain)
return;
var message = Loc.GetString(ent.Comp1.DisabledPopup, ("name", Name(ent, ent.Comp3)));
Popup.PopupEntity(message, ent);
_container.Remove(brain, ent.Comp2.BrainContainer);
}
private void OnPacketReceived(Entity<BorgTransponderComponent> ent, ref DeviceNetworkPacketEvent args)
{
var payload = args.Data;
@ -61,28 +86,28 @@ public sealed partial class BorgSystem
if (command == RoboticsConsoleConstants.NET_DISABLE_COMMAND)
Disable(ent);
else if (command == RoboticsConsoleConstants.NET_DESTROY_COMMAND)
Destroy(ent.Owner);
Destroy(ent);
}
private void Disable(Entity<BorgTransponderComponent, BorgChassisComponent?> ent)
{
if (!Resolve(ent, ref ent.Comp2) || ent.Comp2.BrainEntity is not {} brain)
if (!Resolve(ent, ref ent.Comp2) || ent.Comp2.BrainEntity == null || ent.Comp1.NextDisable != null)
return;
// this won't exactly be stealthy but if you are malf its better than actually disabling you
// update ui immediately
ent.Comp1.NextBroadcast = _timing.CurTime;
// pretend the borg is being disabled forever now
if (CheckEmagged(ent, "disabled"))
return;
ent.Comp1.FakeDisabling = true;
else
Popup.PopupEntity(Loc.GetString(ent.Comp1.DisablingPopup), ent);
var message = Loc.GetString(ent.Comp1.DisabledPopup, ("name", Name(ent)));
Popup.PopupEntity(message, ent);
_container.Remove(brain, ent.Comp2.BrainContainer);
ent.Comp1.NextDisable = _timing.CurTime + ent.Comp1.DisableDelay;
}
private void Destroy(Entity<ExplosiveComponent?> ent)
private void Destroy(Entity<BorgTransponderComponent> ent)
{
if (!Resolve(ent, ref ent.Comp))
return;
// this is stealthy until someone realises you havent exploded
if (CheckEmagged(ent, "destroyed"))
{
@ -91,7 +116,12 @@ public sealed partial class BorgSystem
return;
}
_explosion.TriggerExplosive(ent, ent.Comp, delete: false);
var message = Loc.GetString(ent.Comp.DestroyingPopup, ("name", Name(ent)));
Popup.PopupEntity(message, ent);
_trigger.StartTimer(ent.Owner, user: null);
// prevent a shitter borg running into people
RemComp<InputMoverComponent>(ent);
}
private bool CheckEmagged(EntityUid uid, string name)

View file

@ -43,8 +43,8 @@ public sealed partial class BorgSystem : SharedBorgSystem
[Dependency] private readonly ActionsSystem _actions = default!;
[Dependency] private readonly AlertsSystem _alerts = default!;
[Dependency] private readonly DeviceNetworkSystem _deviceNetwork = default!;
[Dependency] private readonly ExplosionSystem _explosion = default!;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly TriggerSystem _trigger = default!;
[Dependency] private readonly HandsSystem _hands = default!;
[Dependency] private readonly MetaDataSystem _metaData = default!;
[Dependency] private readonly SharedMindSystem _mind = default!;

View file

@ -62,7 +62,14 @@ public sealed class MeteorSwarmSystem : GameRuleSystem<MeteorSwarmComponent>
: new Random(uid.Id).NextAngle();
var offset = angle.RotateVec(new Vector2((maximumDistance - minimumDistance) * RobustRandom.NextFloat() + minimumDistance, 0));
var subOffset = RobustRandom.NextAngle().RotateVec(new Vector2( (playableArea.TopRight - playableArea.Center).Length() / 2 * RobustRandom.NextFloat(), 0));
// the line at which spawns occur is perpendicular to the offset.
// This means the meteors are less likely to bunch up and hit the same thing.
var subOffsetAngle = RobustRandom.Prob(0.5f)
? angle + Math.PI / 2
: angle - Math.PI / 2;
var subOffset = subOffsetAngle.RotateVec(new Vector2( (playableArea.TopRight - playableArea.Center).Length() / 3 * RobustRandom.NextFloat(), 0));
var spawnPosition = new MapCoordinates(center + offset + subOffset, mapId);
var meteor = Spawn(spawnProto, spawnPosition);
var physics = Comp<PhysicsComponent>(meteor);

View file

@ -16,9 +16,14 @@ namespace Content.Shared.Clothing.Components;
public sealed partial class ClothingComponent : Component
{
[DataField("clothingVisuals")]
[Access(typeof(ClothingSystem), typeof(InventorySystem), Other = AccessPermissions.ReadExecute)] // TODO remove execute permissions.
public Dictionary<string, List<PrototypeLayerData>> ClothingVisuals = new();
/// <summary>
/// The name of the layer in the user that this piece of clothing will map to
/// </summary>
[DataField]
public string? MappedLayer;
[ViewVariables(VVAccess.ReadWrite)]
[DataField("quickEquip")]
public bool QuickEquip = true;
@ -121,4 +126,3 @@ public sealed partial class ClothingUnequipDoAfterEvent : DoAfterEvent
public override DoAfterEvent Clone() => this;
}

View file

@ -241,9 +241,6 @@ public abstract class ClothingSystem : EntitySystem
public void SetLayerColor(ClothingComponent clothing, string slot, string mapKey, Color? color)
{
if (clothing.ClothingVisuals == null)
return;
foreach (var layer in clothing.ClothingVisuals[slot])
{
if (layer.MapKeys == null)
@ -257,9 +254,6 @@ public abstract class ClothingSystem : EntitySystem
}
public void SetLayerState(ClothingComponent clothing, string slot, string mapKey, string state)
{
if (clothing.ClothingVisuals == null)
return;
foreach (var layer in clothing.ClothingVisuals[slot])
{
if (layer.MapKeys == null)

View file

@ -33,32 +33,32 @@ public sealed class FoldableClothingSystem : EntitySystem
private void OnFolded(Entity<FoldableClothingComponent> ent, ref FoldedEvent args)
{
if (TryComp<ClothingComponent>(ent.Owner, out var clothingComp) &&
TryComp<ItemComponent>(ent.Owner, out var itemComp))
if (!TryComp<ClothingComponent>(ent.Owner, out var clothingComp) ||
!TryComp<ItemComponent>(ent.Owner, out var itemComp))
return;
if (args.IsFolded)
{
if (args.IsFolded)
{
if (ent.Comp.FoldedSlots.HasValue)
_clothingSystem.SetSlots(ent.Owner, ent.Comp.FoldedSlots.Value, clothingComp);
if (ent.Comp.FoldedSlots.HasValue)
_clothingSystem.SetSlots(ent.Owner, ent.Comp.FoldedSlots.Value, clothingComp);
if (ent.Comp.FoldedEquippedPrefix != null)
_clothingSystem.SetEquippedPrefix(ent.Owner, ent.Comp.FoldedEquippedPrefix, clothingComp);
if (ent.Comp.FoldedEquippedPrefix != null)
_clothingSystem.SetEquippedPrefix(ent.Owner, ent.Comp.FoldedEquippedPrefix, clothingComp);
if (ent.Comp.FoldedHeldPrefix != null)
_itemSystem.SetHeldPrefix(ent.Owner, ent.Comp.FoldedHeldPrefix, false, itemComp);
}
else
{
if (ent.Comp.UnfoldedSlots.HasValue)
_clothingSystem.SetSlots(ent.Owner, ent.Comp.UnfoldedSlots.Value, clothingComp);
if (ent.Comp.FoldedHeldPrefix != null)
_itemSystem.SetHeldPrefix(ent.Owner, ent.Comp.FoldedHeldPrefix, false, itemComp);
}
else
{
if (ent.Comp.UnfoldedSlots.HasValue)
_clothingSystem.SetSlots(ent.Owner, ent.Comp.UnfoldedSlots.Value, clothingComp);
if (ent.Comp.FoldedEquippedPrefix != null)
_clothingSystem.SetEquippedPrefix(ent.Owner, null, clothingComp);
if (ent.Comp.FoldedEquippedPrefix != null)
_clothingSystem.SetEquippedPrefix(ent.Owner, null, clothingComp);
if (ent.Comp.FoldedHeldPrefix != null)
_itemSystem.SetHeldPrefix(ent.Owner, null, false, itemComp);
if (ent.Comp.FoldedHeldPrefix != null)
_itemSystem.SetHeldPrefix(ent.Owner, null, false, itemComp);
}
}
}
}

View file

@ -36,7 +36,7 @@ public sealed partial class RoboticsConsoleComponent : Component
/// Radio message sent when destroying a borg.
/// </summary>
[DataField]
public LocId DestroyMessage = "robotics-console-cyborg-destroyed";
public LocId DestroyMessage = "robotics-console-cyborg-destroying";
/// <summary>
/// Cooldown on destroying borgs to prevent complete abuse.

View file

@ -97,6 +97,13 @@ public record struct CyborgControlData
[DataField]
public bool HasBrain;
/// <summary>
/// Whether the borg can currently be disabled if the brain is installed,
/// if on cooldown then can't queue up multiple disables.
/// </summary>
[DataField]
public bool CanDisable;
/// <summary>
/// When this cyborg's data will be deleted.
/// Set by the console when receiving the packet.
@ -104,7 +111,7 @@ public record struct CyborgControlData
[DataField(customTypeSerializer: typeof(TimeOffsetSerializer))]
public TimeSpan Timeout = TimeSpan.Zero;
public CyborgControlData(SpriteSpecifier? chassisSprite, string chassisName, string name, float charge, int moduleCount, bool hasBrain)
public CyborgControlData(SpriteSpecifier? chassisSprite, string chassisName, string name, float charge, int moduleCount, bool hasBrain, bool canDisable)
{
ChassisSprite = chassisSprite;
ChassisName = chassisName;
@ -112,6 +119,7 @@ public record struct CyborgControlData
Charge = charge;
ModuleCount = moduleCount;
HasBrain = hasBrain;
CanDisable = canDisable;
}
}

View file

@ -23,12 +23,25 @@ public sealed partial class BorgTransponderComponent : Component
public string Name = string.Empty;
/// <summary>
/// Popup shown to everyone when a borg is disabled.
/// Popup shown to everyone after a borg is disabled.
/// Gets passed a string "name".
/// </summary>
[DataField]
public LocId DisabledPopup = "borg-transponder-disabled-popup";
/// <summary>
/// Popup shown to the borg when it is being disabled.
/// </summary>
[DataField]
public LocId DisablingPopup = "borg-transponder-disabling-popup";
/// <summary>
/// Popup shown to everyone when a borg is being destroyed.
/// Gets passed a string "name".
/// </summary>
[DataField]
public LocId DestroyingPopup = "borg-transponder-destroying-popup";
/// <summary>
/// How long to wait between each broadcast.
/// </summary>
@ -40,4 +53,28 @@ public sealed partial class BorgTransponderComponent : Component
/// </summary>
[DataField(customTypeSerializer: typeof(TimeOffsetSerializer))]
public TimeSpan NextBroadcast = TimeSpan.Zero;
/// <summary>
/// When to next disable the borg.
/// </summary>
[DataField(customTypeSerializer: typeof(TimeOffsetSerializer))]
public TimeSpan? NextDisable;
/// <summary>
/// How long to wait to disable the borg after RD has ordered it.
/// </summary>
[DataField]
public TimeSpan DisableDelay = TimeSpan.FromSeconds(5);
/// <summary>
/// Pretend that the borg cannot be disabled due to being on delay.
/// </summary>
[DataField]
public bool FakeDisabling;
/// <summary>
/// Pretend that the borg has no brain inserted.
/// </summary>
[DataField]
public bool FakeDisabled;
}

View file

@ -1,50 +1,4 @@
Entries:
- author: Flareguy
changes:
- message: Removed SCAF armor.
type: Remove
id: 6261
time: '2024-03-31T02:01:28.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/26566
- author: lzk228
changes:
- message: Syndicate duffelbag storage increased from 8x5 to 9x5.
type: Tweak
id: 6262
time: '2024-03-31T02:21:31.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/26565
- author: Velcroboy
changes:
- message: Changed plastic flaps to be completely constructable/deconstructable
type: Tweak
id: 6263
time: '2024-03-31T02:24:39.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/26341
- author: Flareguy
changes:
- message: Security glasses have been moved from research to roundstart gear. All
officers now start with them instead of sunglasses by default.
type: Tweak
- message: You can now craft security glasses.
type: Add
id: 6264
time: '2024-03-31T03:00:45.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/26487
- author: brainfood1183
changes:
- message: Toilets can now be connected to the disposal system.
type: Add
id: 6265
time: '2024-03-31T03:21:18.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/22133
- author: DrMelon
changes:
- message: Syndicate Uplinks now have a searchbar to help those dirty, rotten antagonists
find appropriate equipment more easily!
type: Tweak
id: 6266
time: '2024-03-31T04:09:15.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/24287
- author: chromiumboy
changes:
- message: Additional construction options have been added to the Rapid Construction
@ -3859,3 +3813,48 @@
id: 6760
time: '2024-06-16T11:57:57.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/25155
- author: Futuristic
changes:
- message: RandomSentience event was removed
type: Remove
id: 6761
time: '2024-06-16T23:24:29.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/28982
- author: notafet
changes:
- message: Adjust TEG power generation levels.
type: Tweak
id: 6762
time: '2024-06-17T01:13:33.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29112
- author: Cojoke-dot, AJCM-git
changes:
- message: You can now flip your eyepatches to the other eye! Yarrrrr!
type: Add
id: 6763
time: '2024-06-17T03:21:29.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/26277
- author: deltanedas
changes:
- message: Borgs now have a 10 second beeping timer that paralyzes them when being
exploded with the robotics console and a 5 second delay when being disabled
with it.
type: Tweak
id: 6764
time: '2024-06-17T03:30:10.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27876
- author: EmoGarbage404
changes:
- message: Changed meteor swarm spawning to be less clumped up and favor hitting
multiple areas more.
type: Tweak
id: 6765
time: '2024-06-17T05:20:47.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29057
- author: Ubaser
changes:
- message: Added new reptilian horns, "Demonic".
type: Add
id: 6766
time: '2024-06-17T10:53:47.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29022

View file

@ -21,5 +21,7 @@ borg-ui-module-counter = {$actual}/{$max}
# Transponder
borg-transponder-disabled-popup = A brain shoots out the top of {$name}!
borg-transponder-disabling-popup = Your transponder begins to lock you out of the chassis!
borg-transponder-destroying-popup = The self destruct of {$name} starts beeping!
borg-transponder-emagged-disabled-popup = Your transponder's lights go out!
borg-transponder-emagged-destroyed-popup = Your transponder's fuse blows!

View file

@ -93,6 +93,9 @@ marking-LizardHornsMyrsore = Lizard Horns (Myrsore)
marking-LizardHornsBighorn-horns_bighorn = Lizard Horns (Bighorn)
marking-LizardHornsBighorn = Lizard Horns (Bighorn)
marking-LizardHornsDemonic-horns_demonic = Lizard Horns (Demonic)
marking-LizardHornsDemonic = Lizard Horns (Demonic)
marking-LizardHornsKoboldEars-horns_kobold_ears = Lizard Ears (Kobold)
marking-LizardHornsKoboldEars = Lizard Ears (Kobold)

View file

@ -16,4 +16,4 @@ robotics-console-locked-message = Controls locked, swipe ID.
robotics-console-disable = Disable
robotics-console-destroy = Destroy
robotics-console-cyborg-destroyed = The cyborg {$name} has been remotely destroyed.
robotics-console-cyborg-destroying = {$name} is being remotely detonated!

View file

@ -465,85 +465,6 @@ entities:
- type: RadiationGridResistance
- type: GravityShake
shakeTimes: 10
- proto: ActionToggleLight
entities:
- uid: 4
components:
- type: Transform
parent: 3
- type: InstantAction
container: 3
- uid: 5
components:
- type: Transform
parent: 3
- type: InstantAction
container: 3
- uid: 12
components:
- type: Transform
parent: 11
- type: InstantAction
container: 11
- uid: 13
components:
- type: Transform
parent: 11
- type: InstantAction
container: 11
- uid: 22
components:
- type: Transform
parent: 21
- type: InstantAction
container: 21
- uid: 23
components:
- type: Transform
parent: 21
- type: InstantAction
container: 21
- uid: 32
components:
- type: Transform
parent: 31
- type: InstantAction
container: 31
- uid: 33
components:
- type: Transform
parent: 31
- type: InstantAction
container: 31
- uid: 42
components:
- type: Transform
parent: 41
- type: InstantAction
container: 41
- uid: 43
components:
- type: Transform
parent: 41
- type: InstantAction
container: 41
- proto: ActionToggleSuitPiece
entities:
- uid: 51
components:
- type: Transform
parent: 50
- type: InstantAction
container: 50
entIcon: 52
- proto: ActionVendingThrow
entities:
- uid: 54
components:
- type: Transform
parent: 53
- type: InstantAction
container: 53
- proto: AirCanister
entities:
- uid: 55
@ -2604,27 +2525,8 @@ entities:
components:
- type: Transform
parent: 2
- type: HandheldLight
selfToggleActionEntity: 5
toggleActionEntity: 4
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot
showEnts: False
occludes: True
ent: 6
actions: !type:Container
showEnts: False
occludes: True
ents:
- 4
- 5
- type: Physics
canCollide: False
- type: ActionsContainer
- type: Actions
actions:
- 5
- type: InsideEntityStorage
- proto: ClothingMaskBreath
entities:
@ -2755,23 +2657,8 @@ entities:
- type: Transform
pos: 11.467667,-10.363369
parent: 1
- type: ToggleableClothing
clothingUid: 52
actionEntity: 51
- type: ContainerContainer
containers:
toggleable-clothing: !type:ContainerSlot
showEnts: False
occludes: True
ent: 52
actions: !type:Container
showEnts: False
occludes: True
ents:
- 51
- type: Physics
canCollide: False
- type: ActionsContainer
- proto: ClothingOuterSuitFire
entities:
- uid: 8
@ -3291,102 +3178,26 @@ entities:
components:
- type: Transform
parent: 10
- type: HandheldLight
selfToggleActionEntity: 13
toggleActionEntity: 12
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot
showEnts: False
occludes: True
ent: 14
actions: !type:Container
showEnts: False
occludes: True
ents:
- 12
- 13
- type: Physics
canCollide: False
- type: ActionsContainer
- type: Actions
actions:
- 13
- uid: 21
components:
- type: Transform
parent: 20
- type: HandheldLight
selfToggleActionEntity: 23
toggleActionEntity: 22
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot
showEnts: False
occludes: True
ent: 24
actions: !type:Container
showEnts: False
occludes: True
ents:
- 22
- 23
- type: Physics
canCollide: False
- type: ActionsContainer
- type: Actions
actions:
- 23
- uid: 31
components:
- type: Transform
parent: 30
- type: HandheldLight
selfToggleActionEntity: 33
toggleActionEntity: 32
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot
showEnts: False
occludes: True
ent: 34
actions: !type:Container
showEnts: False
occludes: True
ents:
- 32
- 33
- type: Physics
canCollide: False
- type: ActionsContainer
- type: Actions
actions:
- 33
- uid: 41
components:
- type: Transform
parent: 40
- type: HandheldLight
selfToggleActionEntity: 43
toggleActionEntity: 42
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot
showEnts: False
occludes: True
ent: 44
actions: !type:Container
showEnts: False
occludes: True
ents:
- 42
- 43
- type: Physics
canCollide: False
- type: ActionsContainer
- type: Actions
actions:
- 43
- proto: FoodBoxDonut
entities:
- uid: 583
@ -7517,17 +7328,6 @@ entities:
- type: Transform
pos: 16.5,-0.5
parent: 1
- type: VendingMachine
actionEntity: 54
- type: Actions
actions:
- 54
- type: ActionsContainer
- type: ContainerContainer
containers:
actions: !type:Container
ents:
- 54
- proto: VendingMachineWallMedical
entities:
- uid: 926

View file

@ -2855,14 +2855,6 @@ entities:
- type: GasTileOverlay
- type: RadiationGridResistance
- type: NavMap
- proto: ActionToggleLight
entities:
- uid: 7876
components:
- type: Transform
parent: 7875
- type: InstantAction
container: 7875
- proto: AirAlarm
entities:
- uid: 1942
@ -39104,22 +39096,8 @@ entities:
- type: Transform
pos: -43.645462,-17.224262
parent: 30
- type: HandheldLight
toggleActionEntity: 7876
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot
showEnts: False
occludes: True
ent: null
actions: !type:Container
showEnts: False
occludes: True
ents:
- 7876
- type: Physics
canCollide: True
- type: ActionsContainer
- proto: LemonSeeds
entities:
- uid: 8448

View file

@ -9395,14 +9395,6 @@ entities:
- type: Transform
pos: 31.477634,-79.4623
parent: 60
- proto: ActionToggleLight
entities:
- uid: 3189
components:
- type: Transform
parent: 19193
- type: InstantAction
container: 19193
- proto: AirAlarm
entities:
- uid: 249
@ -70806,20 +70798,6 @@ entities:
- type: Transform
pos: 20.983997,21.51571
parent: 60
- type: HandheldLight
toggleActionEntity: 3189
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot
showEnts: False
occludes: True
ent: null
actions: !type:Container
showEnts: False
occludes: True
ents:
- 3189
- type: ActionsContainer
- uid: 21240
components:
- type: Transform

View file

@ -4499,20 +4499,6 @@ entities:
- type: Transform
pos: 3.5402613,7.6028175
parent: 1
- proto: ActionToggleLight
entities:
- uid: 9312
components:
- type: Transform
parent: 12532
- type: InstantAction
container: 12532
- uid: 9313
components:
- type: Transform
parent: 12533
- type: InstantAction
container: 12533
- proto: AirAlarm
entities:
- uid: 8049
@ -35985,39 +35971,11 @@ entities:
- type: Transform
pos: 16.59333,23.726284
parent: 1
- type: HandheldLight
toggleActionEntity: 9312
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot
showEnts: False
occludes: True
ent: null
actions: !type:Container
showEnts: False
occludes: True
ents:
- 9312
- type: ActionsContainer
- uid: 12533
components:
- type: Transform
pos: 16.59333,23.476284
parent: 1
- type: HandheldLight
toggleActionEntity: 9313
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot
showEnts: False
occludes: True
ent: null
actions: !type:Container
showEnts: False
occludes: True
ents:
- 9313
- type: ActionsContainer
- proto: Floodlight
entities:
- uid: 7307

View file

@ -7773,14 +7773,6 @@ entities:
- type: Transform
pos: -19.30925,-35.362278
parent: 30
- proto: ActionToggleLight
entities:
- uid: 3117
components:
- type: Transform
parent: 5704
- type: InstantAction
container: 5704
- proto: AirAlarm
entities:
- uid: 6224
@ -98436,22 +98428,8 @@ entities:
- type: Transform
pos: 2.4391665,31.963726
parent: 30
- type: HandheldLight
toggleActionEntity: 3117
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot
showEnts: False
occludes: True
ent: null
actions: !type:Container
showEnts: False
occludes: True
ents:
- 3117
- type: Physics
canCollide: True
- type: ActionsContainer
- uid: 7472
components:
- type: Transform

View file

@ -9688,70 +9688,6 @@ entities:
- type: Transform
pos: 19.476593,-4.469906
parent: 21002
- proto: ActionToggleInternals
entities:
- uid: 23831
components:
- type: Transform
parent: 23830
- type: InstantAction
container: 23830
- uid: 23833
components:
- type: Transform
parent: 23832
- type: InstantAction
container: 23832
- uid: 23835
components:
- type: Transform
parent: 23834
- type: InstantAction
container: 23834
- uid: 23837
components:
- type: Transform
parent: 23836
- type: InstantAction
container: 23836
- uid: 23839
components:
- type: Transform
parent: 23838
- type: InstantAction
container: 23838
- uid: 28282
components:
- type: Transform
parent: 28281
- type: InstantAction
container: 28281
- uid: 28284
components:
- type: Transform
parent: 28283
- type: InstantAction
container: 28283
- proto: ActionToggleLight
entities:
- uid: 2263
components:
- type: Transform
parent: 2262
- type: InstantAction
container: 2262
- uid: 6624
components:
- type: Transform
parent: 6623
- type: InstantAction
container: 6623
- uid: 23803
components:
- type: Transform
parent: 23802
- type: InstantAction
container: 23802
- proto: AirAlarm
entities:
- uid: 5583
@ -74652,20 +74588,6 @@ entities:
- type: Transform
pos: -1.6524403,40.692146
parent: 2
- type: HandheldLight
toggleActionEntity: 23803
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot
showEnts: False
occludes: True
ent: null
actions: !type:Container
showEnts: False
occludes: True
ents:
- 23803
- type: ActionsContainer
- proto: ClothingHeadHelmetRiot
entities:
- uid: 4267
@ -86086,14 +86008,6 @@ entities:
- type: Transform
pos: -26.335854,15.494169
parent: 2
- type: GasTank
toggleActionEntity: 23839
- type: ActionsContainer
- type: ContainerContainer
containers:
actions: !type:Container
ents:
- 23839
- proto: DoubleEmergencyOxygenTankFilled
entities:
- uid: 23832
@ -86101,14 +86015,6 @@ entities:
- type: Transform
pos: -26.606686,15.712919
parent: 2
- type: GasTank
toggleActionEntity: 23833
- type: ActionsContainer
- type: ContainerContainer
containers:
actions: !type:Container
ents:
- 23833
- proto: Dresser
entities:
- uid: 22340
@ -87717,14 +87623,6 @@ entities:
- type: Transform
pos: -26.28377,14.921253
parent: 2
- type: GasTank
toggleActionEntity: 23837
- type: ActionsContainer
- type: ContainerContainer
containers:
actions: !type:Container
ents:
- 23837
- uid: 28423
components:
- type: Transform
@ -87747,40 +87645,16 @@ entities:
- type: Transform
pos: -26.481686,14.431669
parent: 2
- type: GasTank
toggleActionEntity: 23835
- type: ActionsContainer
- type: ContainerContainer
containers:
actions: !type:Container
ents:
- 23835
- uid: 28281
components:
- type: Transform
pos: 43.584152,5.432804
parent: 21002
- type: GasTank
toggleActionEntity: 28282
- type: ActionsContainer
- type: ContainerContainer
containers:
actions: !type:Container
ents:
- 28282
- uid: 28283
components:
- type: Transform
pos: 64.58009,6.520523
parent: 21002
- type: GasTank
toggleActionEntity: 28284
- type: ActionsContainer
- type: ContainerContainer
containers:
actions: !type:Container
ents:
- 28284
- uid: 28286
components:
- type: Transform
@ -87989,14 +87863,6 @@ entities:
- type: Transform
pos: -26.606686,14.921253
parent: 2
- type: GasTank
toggleActionEntity: 23831
- type: ActionsContainer
- type: ContainerContainer
containers:
actions: !type:Container
ents:
- 23831
- proto: ExtinguisherCabinetFilled
entities:
- uid: 5804
@ -134748,22 +134614,8 @@ entities:
- type: Transform
pos: -31.387814,-44.28387
parent: 2
- type: HandheldLight
toggleActionEntity: 2263
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot
showEnts: False
occludes: True
ent: null
actions: !type:Container
showEnts: False
occludes: True
ents:
- 2263
- type: Physics
canCollide: True
- type: ActionsContainer
- proto: LampGold
entities:
- uid: 1597
@ -134788,22 +134640,8 @@ entities:
- type: Transform
pos: 3.4081588,44.633736
parent: 2
- type: HandheldLight
toggleActionEntity: 6624
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot
showEnts: False
occludes: True
ent: null
actions: !type:Container
showEnts: False
occludes: True
ents:
- 6624
- type: Physics
canCollide: True
- type: ActionsContainer
- uid: 7981
components:
- type: Transform

View file

@ -3401,14 +3401,6 @@ entities:
- type: Transform
pos: -11.470391,11.486723
parent: 31
- proto: ActionToggleLight
entities:
- uid: 7544
components:
- type: Transform
parent: 9761
- type: InstantAction
container: 9761
- proto: AirAlarm
entities:
- uid: 5107
@ -48902,20 +48894,6 @@ entities:
- type: Transform
pos: -16.721703,-38.96948
parent: 31
- type: HandheldLight
toggleActionEntity: 7544
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot
showEnts: False
occludes: True
ent: null
actions: !type:Container
showEnts: False
occludes: True
ents:
- 7544
- type: ActionsContainer
- proto: LargeBeaker
entities:
- uid: 5074

View file

@ -10,3 +10,42 @@
- type: Item
size: Small
storedRotation: -90
- type: entity
parent: [ClothingEyesBase, BaseFoldable]
id: ClothingHeadEyeBaseFlippable
abstract: true
components:
- type: Appearance
- type: FlippableClothingVisuals
- type: Foldable
canFoldInsideContainer: true
unfoldVerbText: fold-flip-verb
foldVerbText: fold-flip-verb
- type: FoldableClothing
- type: Sprite
layers:
- map: [ "unfoldedLayer" ]
state: icon
- map: ["foldedLayer"]
state: icon
visible: false
scale: -1,1
- type: entity
parent: ClothingHeadEyeBaseFlippable
id: ClothingHeadEyeBaseFlipped
suffix: flipped
abstract: true
components:
- type: Foldable
folded: true
- type: Sprite
layers:
- map: [ "unfoldedLayer" ]
state: icon
visible: false
- map: ["foldedLayer"]
state: icon
visible: true
scale: -1,1

View file

@ -220,7 +220,7 @@
suffix: Syndicate
- type: entity
parent: ClothingEyesHudMedical
parent: [ClothingEyesHudMedical, ClothingHeadEyeBaseFlippable]
id: ClothingEyesEyepatchHudMedical
name: medical hud eyepatch
description: A heads-up display that scans the humanoids in view and provides accurate data about their health status. For true patriots.
@ -231,7 +231,12 @@
sprite: Clothing/Eyes/Hud/medpatch.rsi
- type: entity
parent: ClothingEyesHudSecurity
parent: [ClothingEyesEyepatchHudMedical, ClothingHeadEyeBaseFlipped]
id: ClothingEyesEyepatchHudMedicalFlipped
name: medical hud eyepatch
- type: entity
parent: [ClothingEyesHudSecurity, ClothingHeadEyeBaseFlippable]
id: ClothingEyesEyepatchHudSecurity
name: security hud eyepatch
description: A heads-up display that scans the humanoids in view and provides accurate data about their ID status and security records. For true patriots.
@ -242,7 +247,12 @@
sprite: Clothing/Eyes/Hud/secpatch.rsi
- type: entity
parent: ClothingEyesHudBeer
parent: [ClothingEyesEyepatchHudSecurity, ClothingHeadEyeBaseFlipped]
id: ClothingEyesEyepatchHudSecurityFlipped
name: security hud eyepatch
- type: entity
parent: [ClothingEyesHudBeer, ClothingHeadEyeBaseFlippable]
id: ClothingEyesEyepatchHudBeer
name: beer hud eyepatch
description: A pair of sunHud outfitted with apparatus to scan reagents, as well as providing an innate understanding of liquid viscosity while in motion. For true patriots.
@ -253,7 +263,12 @@
sprite: Clothing/Eyes/Hud/beerpatch.rsi
- type: entity
parent: ClothingEyesBase
parent: [ClothingEyesEyepatchHudBeer, ClothingHeadEyeBaseFlipped]
id: ClothingEyesEyepatchHudBeerFlipped
name: beer hud eyepatch
- type: entity
parent: [ClothingEyesHudDiagnostic, ClothingHeadEyeBaseFlippable]
id: ClothingEyesEyepatchHudDiag
name: diagnostic hud eyepatch
description: A heads-up display capable of analyzing the integrity and status of robotics and exosuits. Made out of see-borg-ium.
@ -262,7 +277,8 @@
sprite: Clothing/Eyes/Hud/diagpatch.rsi
- type: Clothing
sprite: Clothing/Eyes/Hud/diagpatch.rsi
- type: ShowHealthBars
damageContainers:
- Inorganic
- Silicon
- type: entity
parent: [ClothingEyesEyepatchHudDiag, ClothingHeadEyeBaseFlipped]
id: ClothingEyesEyepatchHudDiagFlipped
name: diagnostic hud eyepatch

View file

@ -1,16 +1,3 @@
- type: entity
parent: ClothingEyesBase
id: ClothingEyesEyepatch
name: eyepatch
description: Yarr.
components:
- type: Sprite
sprite: Clothing/Eyes/Misc/eyepatch.rsi
- type: Clothing
sprite: Clothing/Eyes/Misc/eyepatch.rsi
- type: EyeProtection
protectionTime: 5
- type: entity
parent: ClothingEyesBase
id: ClothingEyesBlindfold
@ -26,3 +13,21 @@
graph: Blindfold
node: blindfold
- type: FlashImmunity
- type: entity
parent: ClothingHeadEyeBaseFlippable
id: ClothingEyesEyepatch
name: eyepatch
description: Yarr.
components:
- type: Sprite
sprite: Clothing/Eyes/Misc/eyepatch.rsi
- type: Clothing
sprite: Clothing/Eyes/Misc/eyepatch.rsi
- type: EyeProtection
protectionTime: 5
- type: entity
parent: [ClothingEyesEyepatch, ClothingHeadEyeBaseFlipped]
id: ClothingEyesEyepatchFlipped
suffix: flipped

View file

@ -294,6 +294,15 @@
- sprite: Mobs/Customization/reptilian_parts.rsi
state: horns_bighorn
- type: marking
id: LizardHornsDemonic
bodyPart: HeadTop
markingCategory: HeadTop
speciesRestriction: [Reptilian]
sprites:
- sprite: Mobs/Customization/reptilian_parts.rsi
state: horns_demonic
- type: marking
id: LizardHornsKoboldEars
bodyPart: HeadTop

View file

@ -233,9 +233,20 @@
deviceNetId: Wireless
receiveFrequencyId: CyborgControl
transmitFrequencyId: RoboticsConsole
- type: OnUseTimerTrigger
delay: 10
examinable: false
beepSound:
path: /Audio/Effects/Cargo/buzz_two.ogg
params:
volume: -4
# prevent any funnies if someone makes a cyborg item...
- type: AutomatedTimer
- type: ExplodeOnTrigger
# explosion does most of its damage in the center and less at the edges
- type: Explosive
explosionType: Minibomb
deleteAfterExplosion: false # let damage threshold gib the borg
totalIntensity: 30
intensitySlope: 20
maxIntensity: 20

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "https://github.com/Skyrat-SS13/Skyrat-tg/tree/40e3cdbb15b8bc0d5ef2fb46133adf805bda5297, while Argali, Ayrshire, Myrsore and Bighorn are drawn by Ubaser, and Kobold Ears are drawn by Pigeonpeas. Body_underbelly made by Nairod(github) for SS14. Large drawn by Ubaser. Wagging tail by SonicDC. Splotch modified from Sharp by KittenColony(github). Frills neckfull come from: https://github.com/Bubberstation/Bubberstation/commit/8bc6b83404803466a560b694bf22ef3c0ac266a2",
"copyright": "https://github.com/Skyrat-SS13/Skyrat-tg/tree/40e3cdbb15b8bc0d5ef2fb46133adf805bda5297, while Argali, Ayrshire, Myrsore, Bighorn and Demonic are drawn by Ubaser, and Kobold Ears are drawn by Pigeonpeas. Body_underbelly made by Nairod(github) for SS14. Large drawn by Ubaser. Wagging tail by SonicDC. Splotch modified from Sharp by KittenColony(github). Frills neckfull come from: https://github.com/Bubberstation/Bubberstation/commit/8bc6b83404803466a560b694bf22ef3c0ac266a2",
"size": {
"x": 32,
"y": 32
@ -581,6 +581,10 @@
"name": "horns_bighorn",
"directions": 4
},
{
"name": "horns_demonic",
"directions": 4
},
{
"name": "horns_kobold_ears",
"directions": 4