Tweak Traitor Uplink - The Rest of the Uplink (#42582)

* jaws of death

* I hate YAML

* open the gate

* I forgot about this one

* I forgor

* Fix croissant

* this didn't work actually rip

* made lights look better and undo on the boxing gloves

* small change

* Update Resources/Prototypes/Entities/Clothing/Hands/gloves.yml

Co-authored-by: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com>

* baguette contraband, eat your evidence.

* suffix

---------

Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>
Co-authored-by: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com>
This commit is contained in:
Princess Cheeseballs
2026-01-23 16:11:19 -08:00
committed by GitHub
parent b4a3358b4b
commit 76801bd8b2
29 changed files with 443 additions and 463 deletions

View File

@@ -1,5 +1,7 @@
using System.ComponentModel.Design;
using System.Linq;
using Content.Client.Light.Components;
using Content.Shared.Trigger.Components.Effects;
using Robust.Client.GameObjects;
using Robust.Client.Animations;
using Robust.Shared.Random;
@@ -36,6 +38,10 @@ public sealed class LightBehaviorSystem : EntitySystem
container.LightBehaviour.UpdatePlaybackValues(container.Animation);
_player.Play(uid, container.Animation, container.FullKey);
}
else
{
StopLightBehaviour((uid, component), container.LightBehaviour.ID, resetToOriginalSettings: true);
}
}
private void OnLightStartup(Entity<LightBehaviourComponent> entity, ref ComponentStartup args)
@@ -53,7 +59,7 @@ public sealed class LightBehaviorSystem : EntitySystem
{
if (container.LightBehaviour.Enabled)
{
StartLightBehaviour(entity, container.LightBehaviour.ID);
StartLightBehaviour((entity, entity), container.LightBehaviour.ID);
}
}
}
@@ -82,12 +88,13 @@ public sealed class LightBehaviorSystem : EntitySystem
/// If specified light behaviours are already animating, calling this does nothing.
/// Multiple light behaviours can have the same ID.
/// </summary>
public void StartLightBehaviour(Entity<LightBehaviourComponent> entity, string id = "")
public void StartLightBehaviour(Entity<LightBehaviourComponent?> entity, string id = "")
{
if (!TryComp(entity, out AnimationPlayerComponent? animation))
{
if (!Resolve(entity, ref entity.Comp))
return;
if (!TryComp(entity, out AnimationPlayerComponent? animation))
return;
}
foreach (var container in entity.Comp.Animations)
{
@@ -95,7 +102,7 @@ public sealed class LightBehaviorSystem : EntitySystem
{
if (!_player.HasRunningAnimation(entity, animation, LightBehaviourComponent.KeyPrefix + container.Key))
{
CopyLightSettings(entity, container.LightBehaviour.Property);
CopyLightSettings((entity, entity.Comp), container.LightBehaviour.Property);
container.LightBehaviour.UpdatePlaybackValues(container.Animation);
_player.Play(entity, container.Animation, LightBehaviourComponent.KeyPrefix + container.Key);
}
@@ -118,11 +125,9 @@ public sealed class LightBehaviorSystem : EntitySystem
return;
}
var comp = entity.Comp;
var toRemove = new List<LightBehaviourComponent.AnimationContainer>();
foreach (var container in comp.Animations)
foreach (var container in entity.Comp.Animations)
{
if (container.LightBehaviour.ID == id || id == string.Empty)
{
@@ -140,18 +145,24 @@ public sealed class LightBehaviorSystem : EntitySystem
foreach (var container in toRemove)
{
comp.Animations.Remove(container);
entity.Comp.Animations.Remove(container);
}
if (resetToOriginalSettings && TryComp(entity, out PointLightComponent? light))
if (resetToOriginalSettings)
ResetToOriginalSettings(entity);
entity.Comp.OriginalPropertyValues.Clear();
}
private void ResetToOriginalSettings(Entity<LightBehaviourComponent, PointLightComponent?> entity)
{
if (!Resolve(entity, ref entity.Comp2))
return;
foreach (var (property, value) in entity.Comp1.OriginalPropertyValues)
{
foreach (var (property, value) in comp.OriginalPropertyValues)
{
AnimationHelper.SetAnimatableProperty(light, property, value);
}
AnimationHelper.SetAnimatableProperty(entity.Comp2, property, value);
}
comp.OriginalPropertyValues.Clear();
}
/// <summary>
@@ -194,7 +205,7 @@ public sealed class LightBehaviorSystem : EntitySystem
if (playImmediately)
{
StartLightBehaviour(entity, behaviour.ID);
StartLightBehaviour((entity, entity), behaviour.ID);
}
}
}

View File

@@ -0,0 +1,21 @@
using Content.Client.Light.EntitySystems;
using Content.Shared.Trigger;
using Content.Shared.Trigger.Components.Effects;
using Robust.Shared.Timing;
namespace Content.Client.Trigger.Systems;
/// <summary>
/// This handles...
/// </summary>
public sealed class LightBehaviorOnTriggerSystem : XOnTriggerSystem<LightBehaviorOnTriggerComponent>
{
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly LightBehaviorSystem _light = default!;
protected override void OnTrigger(Entity<LightBehaviorOnTriggerComponent> ent, EntityUid target, ref TriggerEvent args)
{
if (_timing.IsFirstTimePredicted)
_light.StartLightBehaviour(target, ent.Comp.Behavior);
}
}

View File

@@ -19,100 +19,23 @@ public sealed class JammerSystem : SharedJammerSystem
{
base.Initialize();
SubscribeLocalEvent<RadioJammerComponent, ActivateInWorldEvent>(OnActivate);
SubscribeLocalEvent<ActiveRadioJammerComponent, PowerCellChangedEvent>(OnPowerCellChanged);
SubscribeLocalEvent<RadioSendAttemptEvent>(OnRadioSendAttempt);
}
// TODO: Very important: Make this charge rate based instead of updating every single tick
// See BatteryComponent
public override void Update(float frameTime)
{
var query = EntityQueryEnumerator<ActiveRadioJammerComponent, RadioJammerComponent>();
while (query.MoveNext(out var uid, out var _, out var jam))
{
if (_powerCell.TryGetBatteryFromSlot(uid, out var battery))
{
if (!_battery.TryUseCharge(battery.Value.AsNullable(), GetCurrentWattage((uid, jam)) * frameTime))
{
ChangeLEDState(uid, false);
RemComp<ActiveRadioJammerComponent>(uid);
RemComp<DeviceNetworkJammerComponent>(uid);
}
else
{
var chargeFraction = _battery.GetChargeLevel(battery.Value.AsNullable());
var chargeLevel = chargeFraction switch
{
> 0.50f => RadioJammerChargeLevel.High,
< 0.15f => RadioJammerChargeLevel.Low,
_ => RadioJammerChargeLevel.Medium,
};
ChangeChargeLevel(uid, chargeLevel);
}
}
}
}
private void OnActivate(Entity<RadioJammerComponent> ent, ref ActivateInWorldEvent args)
{
if (args.Handled || !args.Complex)
return;
var activated = !HasComp<ActiveRadioJammerComponent>(ent) &&
_powerCell.TryGetBatteryFromSlot(ent.Owner, out var battery) &&
_battery.GetCharge(battery.Value.AsNullable()) > GetCurrentWattage(ent);
if (activated)
{
ChangeLEDState(ent.Owner, true);
EnsureComp<ActiveRadioJammerComponent>(ent);
EnsureComp<DeviceNetworkJammerComponent>(ent, out var jammingComp);
_jammer.SetRange((ent, jammingComp), GetCurrentRange(ent));
_jammer.AddJammableNetwork((ent, jammingComp), DeviceNetworkComponent.DeviceNetIdDefaults.Wireless.ToString());
// Add excluded frequencies using the system method
if (ent.Comp.FrequenciesExcluded != null)
{
foreach (var freq in ent.Comp.FrequenciesExcluded)
{
_jammer.AddExcludedFrequency((ent, jammingComp), (uint)freq);
}
}
}
else
{
ChangeLEDState(ent.Owner, false);
RemCompDeferred<ActiveRadioJammerComponent>(ent);
RemCompDeferred<DeviceNetworkJammerComponent>(ent);
}
var state = Loc.GetString(activated ? "radio-jammer-component-on-state" : "radio-jammer-component-off-state");
var message = Loc.GetString("radio-jammer-component-on-use", ("state", state));
Popup.PopupEntity(message, args.User, args.User);
args.Handled = true;
}
private void OnPowerCellChanged(Entity<ActiveRadioJammerComponent> ent, ref PowerCellChangedEvent args)
{
if (args.Ejected)
{
ChangeLEDState(ent.Owner, false);
RemCompDeferred<ActiveRadioJammerComponent>(ent);
}
SubscribeLocalEvent<RadioReceiveAttemptEvent>(OnRadioReceiveAttempt);
}
private void OnRadioSendAttempt(ref RadioSendAttemptEvent args)
{
if (ShouldCancelSend(args.RadioSource, args.Channel.Frequency))
{
if (ShouldCancel(args.RadioSource, args.Channel.Frequency))
args.Cancelled = true;
}
}
private bool ShouldCancelSend(EntityUid sourceUid, int frequency)
private void OnRadioReceiveAttempt(ref RadioReceiveAttemptEvent args)
{
if (ShouldCancel(args.RadioReceiver, args.Channel.Frequency))
args.Cancelled = true;
}
private bool ShouldCancel(EntityUid sourceUid, int frequency)
{
var source = Transform(sourceUid).Coordinates;
var query = EntityQueryEnumerator<ActiveRadioJammerComponent, RadioJammerComponent, TransformComponent>();
@@ -120,7 +43,7 @@ public sealed class JammerSystem : SharedJammerSystem
while (query.MoveNext(out var uid, out _, out var jam, out var transform))
{
// Check if this jammer excludes the frequency
if (jam.FrequenciesExcluded != null && jam.FrequenciesExcluded.Contains(frequency))
if (jam.FrequenciesExcluded.Contains(frequency))
continue;
if (_transform.InRange(source, transform.Coordinates, GetCurrentRange((uid, jam))))

View File

@@ -11,11 +11,11 @@ public sealed partial class PowerCellSystem
[PublicAPI]
public void SetDrawEnabled(Entity<PowerCellDrawComponent?> ent, bool enabled)
{
if (!Resolve(ent, ref ent.Comp, false) || ent.Comp.Enabled == enabled)
return;
ent.Comp.Enabled = enabled;
Dirty(ent, ent.Comp);
if (Resolve(ent, ref ent.Comp, false) && ent.Comp.Enabled != enabled)
{
ent.Comp.Enabled = enabled;
Dirty(ent, ent.Comp);
}
if (TryGetBatteryFromSlot(ent.Owner, out var battery))
_battery.RefreshChargeRate(battery.Value.AsNullable());

View File

@@ -36,9 +36,7 @@ public sealed class ToggleCellDrawSystem : EntitySystem
private void OnToggled(Entity<ToggleCellDrawComponent> ent, ref ItemToggledEvent args)
{
var uid = ent.Owner;
var draw = Comp<PowerCellDrawComponent>(uid);
_cell.SetDrawEnabled((uid, draw), args.Activated);
_cell.SetDrawEnabled(ent.Owner, args.Activated);
}
private void OnEmpty(Entity<ToggleCellDrawComponent> ent, ref PowerCellSlotEmptyEvent args)

View File

@@ -1,25 +1,67 @@
using Content.Shared.DeviceNetwork.Components;
using Content.Shared.Popups;
using Content.Shared.Verbs;
using Content.Shared.Examine;
using Content.Shared.Radio.Components;
using Content.Shared.DeviceNetwork.Systems;
using Content.Shared.Item.ItemToggle;
using Content.Shared.Item.ItemToggle.Components;
using Content.Shared.Power;
namespace Content.Shared.Radio.EntitySystems;
public abstract class SharedJammerSystem : EntitySystem
{
[Dependency] private readonly ItemToggleSystem _itemToggle = default!;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly SharedDeviceNetworkJammerSystem _jammer = default!;
[Dependency] protected readonly SharedPopupSystem Popup = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<RadioJammerComponent, ItemToggledEvent>(OnItemToggle);
SubscribeLocalEvent<RadioJammerComponent, RefreshChargeRateEvent>(OnRefreshChargeRate);
SubscribeLocalEvent<RadioJammerComponent, GetVerbsEvent<Verb>>(OnGetVerb);
SubscribeLocalEvent<RadioJammerComponent, ExaminedEvent>(OnExamine);
}
private void OnItemToggle(Entity<RadioJammerComponent> entity, ref ItemToggledEvent args)
{
if (args.Activated)
{
EnsureComp<ActiveRadioJammerComponent>(entity);
EnsureComp<DeviceNetworkJammerComponent>(entity, out var jammingComp);
_jammer.SetRange((entity, jammingComp), GetCurrentRange(entity));
_jammer.AddJammableNetwork((entity, jammingComp), DeviceNetworkComponent.DeviceNetIdDefaults.Wireless.ToString());
// Add excluded frequencies using the system method
foreach (var freq in entity.Comp.FrequenciesExcluded)
{
_jammer.AddExcludedFrequency((entity, jammingComp), (uint)freq);
}
}
else
{
RemCompDeferred<ActiveRadioJammerComponent>(entity);
RemCompDeferred<DeviceNetworkJammerComponent>(entity);
}
if (args.User == null)
return;
var state = Loc.GetString(args.Activated ? "radio-jammer-component-on-state" : "radio-jammer-component-off-state");
var message = Loc.GetString("radio-jammer-component-on-use", ("state", state));
_popup.PopupPredicted(message, args.User.Value, args.User.Value);
}
private void OnRefreshChargeRate(Entity<RadioJammerComponent> entity, ref RefreshChargeRateEvent args)
{
if (_itemToggle.IsActivated(entity.Owner))
args.NewChargeRate -= GetCurrentWattage(entity);
}
private void OnGetVerb(Entity<RadioJammerComponent> entity, ref GetVerbsEvent<Verb> args)
{
if (!args.CanAccess || !args.CanInteract)
@@ -47,7 +89,7 @@ public abstract class SharedJammerSystem : EntitySystem
// The range should be updated when it turns on again!
_jammer.TrySetRange(entity.Owner, GetCurrentRange(entity));
Popup.PopupClient(Loc.GetString(setting.Message), user, user);
_popup.PopupClient(Loc.GetString(setting.Message), user, user);
},
Text = Loc.GetString(setting.Name),
};
@@ -58,37 +100,26 @@ public abstract class SharedJammerSystem : EntitySystem
private void OnExamine(Entity<RadioJammerComponent> ent, ref ExaminedEvent args)
{
if (args.IsInDetailsRange)
{
var powerIndicator = HasComp<ActiveRadioJammerComponent>(ent)
? Loc.GetString("radio-jammer-component-examine-on-state")
: Loc.GetString("radio-jammer-component-examine-off-state");
args.PushMarkup(powerIndicator);
if (!args.IsInDetailsRange)
return;
var powerLevel = Loc.GetString(ent.Comp.Settings[ent.Comp.SelectedPowerLevel].Name);
var switchIndicator = Loc.GetString("radio-jammer-component-switch-setting", ("powerLevel", powerLevel));
args.PushMarkup(switchIndicator);
}
var powerIndicator = _itemToggle.IsActivated(ent.Owner)
? Loc.GetString("radio-jammer-component-examine-on-state")
: Loc.GetString("radio-jammer-component-examine-off-state");
args.PushMarkup(powerIndicator);
var powerLevel = Loc.GetString(ent.Comp.Settings[ent.Comp.SelectedPowerLevel].Name);
var switchIndicator = Loc.GetString("radio-jammer-component-switch-setting", ("powerLevel", powerLevel));
args.PushMarkup(switchIndicator);
}
public float GetCurrentWattage(Entity<RadioJammerComponent> jammer)
private float GetCurrentWattage(Entity<RadioJammerComponent> jammer)
{
return jammer.Comp.Settings[jammer.Comp.SelectedPowerLevel].Wattage;
}
public float GetCurrentRange(Entity<RadioJammerComponent> jammer)
protected float GetCurrentRange(Entity<RadioJammerComponent> jammer)
{
return jammer.Comp.Settings[jammer.Comp.SelectedPowerLevel].Range;
}
protected void ChangeLEDState(Entity<AppearanceComponent?> ent, bool isLEDOn)
{
_appearance.SetData(ent, RadioJammerVisuals.LEDOn, isLEDOn, ent.Comp);
}
protected void ChangeChargeLevel(Entity<AppearanceComponent?> ent, RadioJammerChargeLevel chargeLevel)
{
_appearance.SetData(ent, RadioJammerVisuals.ChargeLevel, chargeLevel, ent.Comp);
}
}

View File

@@ -0,0 +1,16 @@
using Robust.Shared.GameStates;
namespace Content.Shared.Trigger.Components.Effects;
/// <summary>
/// Plays a light behavior on the target when this trigger is activated, of note is that the entity needs a PointLightComponent
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class LightBehaviorOnTriggerComponent : BaseXOnTriggerComponent
{
/// <summary>
/// The light behavior we're triggering.
/// </summary>
[DataField(required: true)]
public string Behavior = string.Empty;
}

View File

@@ -1,3 +1,4 @@
using System.Numerics;
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
@@ -12,10 +13,10 @@ namespace Content.Shared.Trigger.Components.Effects;
public sealed partial class ScramOnTriggerComponent : BaseXOnTriggerComponent
{
/// <summary>
/// Up to how far to teleport the entity.
/// Up to how far to teleport the entity. Represented with X as Min Radius, and Y as Max Radius
/// </summary>
[DataField, AutoNetworkedField]
public float TeleportRadius = 100f;
public Vector2 TeleportRadius = new (10f, 15f);
/// <summary>
/// the sound to play when teleporting.

View File

@@ -1,3 +1,4 @@
using System.Numerics;
using Content.Shared.Maps;
using Content.Shared.Movement.Pulling.Components;
using Content.Shared.Movement.Pulling.Systems;
@@ -50,7 +51,7 @@ public sealed class ScramOnTriggerSystem : XOnTriggerSystem<ScramOnTriggerCompon
/// null if no tile is found within a certain number of tries.
/// </summary>
/// <remarks> Trends towards the outer radius. Compensates for small grids. </remarks>
private EntityCoordinates? SelectRandomTileInRange(EntityUid uid, float radius, int tries = 40, PhysicsComponent? physicsComponent = null)
private EntityCoordinates? SelectRandomTileInRange(EntityUid uid, Vector2 radius, int tries = 40, PhysicsComponent? physicsComponent = null)
{
var userCoords = Transform(uid).Coordinates;
EntityCoordinates? targetCoords = null;
@@ -68,7 +69,7 @@ public sealed class ScramOnTriggerSystem : XOnTriggerSystem<ScramOnTriggerCompon
// i = A percentage based on the current try count, which results in each
// subsequent try landing closer and closer towards the entity.
// Beneficial for smaller maps, especially when the radius is large.
var distance = radius * MathF.Sqrt(_random.NextFloat()) * (1 - (float)i / tries);
var distance = (radius.Y - radius.X) * MathF.Sqrt(_random.NextFloat()) * (1 - (float)i / tries) + radius.X;
// We then offset the user coords from a random angle * distance
var tempTargetCoords = userCoords.Offset(_random.NextAngle().ToVec() * distance);

View File

@@ -202,6 +202,9 @@ uplink-singularity-beacon-desc = A device that attracts singularities. Has to be
uplink-antimov-law-name = Antimov Law Circuit
uplink-antimov-law-desc = A very dangerous Lawset to use when you want to cause the A.I. to go haywire, use with caution.
uplink-syndimov-law-name = Syndi Law Circuit
uplink-syndimov-law-desc = A subversive Lawset to use when you want to turn the A.I. to your side, use as much as possible.
# Implants
uplink-storage-implanter-name = Storage Implanter
uplink-storage-implanter-desc = Hide goodies inside of yourself with new bluespace technology!
@@ -236,8 +239,8 @@ uplink-micro-bomb-implanter-desc = Explode on death or manual activation with th
uplink-radio-implanter-name = Radio Implanter
uplink-radio-implanter-desc = Implants a Syndicate radio, allowing covert communication without a headset.
uplink-voice-mask-implanter-name = Voice Mask Implanter
uplink-voice-mask-implanter-desc = Modifies your vocal cords to be able to sound like anyone you could imagine.
uplink-voice-mask-implanter-name = Identity Mask Implanter
uplink-voice-mask-implanter-desc = Modifies your vocal cords and facial structure to be able to mimic anyone you could imagine.
# Bundles
uplink-observation-kit-name = Observation Kit
@@ -295,7 +298,7 @@ uplink-starter-kit-desc = Contains 40 telecrystals of basic operative gear. For
uplink-toolbox-name = Toolbox
uplink-toolbox-desc = A full compliment of tools for the mechanically inclined traitor. Includes a pair of insulated combat gloves and a syndicate gas mask as well.
uplink-syndicate-jaws-of-life-name = Jaws Of Life
uplink-syndicate-jaws-of-life-name = Jaws Of Death
uplink-syndicate-jaws-of-life-desc = A combined prying and cutting tool. Useful for entering the station or its departments. Can even open bolted doors!
uplink-duffel-surgery-name = Surgical Duffel Bag
@@ -333,7 +336,7 @@ uplink-chimp-upgrade-kit-name = C.H.I.M.P. Handcannon Upgrade Chip
uplink-chimp-upgrade-kit-desc = Insert this chip into a standard C.H.I.M.P. handcannon to allow it to fire omega particles. Omega particles inflict severe burns and cause anomalies to go supercritical.
uplink-proximity-mine-name = Proximity Mine
uplink-proximity-mine-desc = A mine disguised as a wet floor sign.
uplink-proximity-mine-desc = A throwable mine disguised as a wet floor sign. Detonates on contact with almost anything, safety always off.
uplink-disposable-turret-name = Disposable Ballistic Turret
uplink-disposable-turret-desc = Looks and functions like a normal electrical toolbox. Upon hitting the toolbox it will transform into a ballistic turret, theoretically shooting at anyone except members of the syndicate. Can be turned back into a toolbox using a screwdriver and repaired using a wrench.

View File

@@ -95,8 +95,8 @@
containers:
storagebase: !type:AllSelector
children:
- id: SyndicateMicrowaveFlatpack
- id: WeaponCroissant
amount: 2
- id: WeaponBaguette
- id: SyndicateMicrowaveMachineCircuitboard
- id: PaperWrittenCombatBakeryKit

View File

@@ -124,24 +124,6 @@
categories:
- UplinkWeaponry
- type: listing
id: UplinkDisposableTurret
name: uplink-disposable-turret-name
description: uplink-disposable-turret-desc
productEntity: ToolboxElectricalTurretFilled
discountCategory: usualDiscounts
discountDownTo:
Telecrystal: 3
cost:
Telecrystal: 6
categories:
- UplinkWeaponry
conditions:
- !type:StoreWhitelistCondition
blacklist:
tags:
- NukeOpsUplink
- type: listing
id: UplinkEshield
name: uplink-eshield-name
@@ -161,6 +143,20 @@
tags:
- NukeOpsUplink
- type: listing
id: uplinkRiggedBoxingGloves
name: uplink-rigged-boxing-gloves-name
description: uplink-rigged-boxing-gloves-desc
icon: { sprite: Clothing/Hands/Gloves/Boxing/boxingblue.rsi, state: icon }
productEntity: ClothingHandsGlovesBoxingBlue # TODO Replace this with the random spawner when it's not bugged
discountCategory: veryRareDiscounts
discountDownTo:
Telecrystal: 8
cost:
Telecrystal: 10
categories:
- UplinkWeaponry
- type: listing
id: UplinkSniperBundle
name: uplink-sniper-bundle-name
@@ -408,19 +404,6 @@
categories:
- UplinkDisruption
- type: listing
id: UplinkWhiteholeGrenade
name: uplink-whitehole-grenade-name
description: uplink-whitehole-grenade-desc
productEntity: WhiteholeGrenade
discountCategory: usualDiscounts
discountDownTo:
Telecrystal: 1
cost:
Telecrystal: 2
categories:
- UplinkDisruption
- type: listing
id: UplinkGrenadePenguin
name: uplink-penguin-grenade-name
@@ -1049,6 +1032,24 @@
categories:
- UplinkDisruption
- type: listing
id: UplinkDisposableTurret
name: uplink-disposable-turret-name
description: uplink-disposable-turret-desc
productEntity: ToolboxElectricalTurretFilled
discountCategory: usualDiscounts
discountDownTo:
Telecrystal: 2
cost:
Telecrystal: 4
categories:
- UplinkDisruption
conditions:
- !type:StoreWhitelistCondition
blacklist:
tags:
- NukeOpsUplink
- type: listing
id: UplinkSyndicateMartyrModule
name: uplink-syndicate-martyr-module-name
@@ -1079,10 +1080,8 @@
description: uplink-slipocalypse-clustersoap-desc
productEntity: SlipocalypseClusterSoap
discountCategory: rareDiscounts
discountDownTo:
Telecrystal: 1
cost:
Telecrystal: 2
Telecrystal: 1
categories:
- UplinkDisruption
@@ -1137,23 +1136,18 @@
cost:
Telecrystal: 8
categories:
- UplinkDisruption
conditions:
- !type:BuyerWhitelistCondition
blacklist:
components:
- SurplusBundle
- UplinkExplosives
- type: listing
id: UplinkAntimovCircuitBoard
name: uplink-antimov-law-name
description: uplink-antimov-law-desc
productEntity: AntimovCircuitBoard
id: UplinkSyndimovCircuitBoard
name: uplink-syndimov-law-name
description: uplink-syndimov-law-desc
productEntity: SyndimovCircuitBoard
discountCategory: usualDiscounts
discountDownTo:
Telecrystal: 10
Telecrystal: 6
cost:
Telecrystal: 14
Telecrystal: 8
categories:
- UplinkDisruption
conditions:
@@ -1163,7 +1157,7 @@
- NukeOpsUplink
- type: listing
id: UplinkNukieAntimovCircuitBoard
id: UplinkAntimovCircuitBoard
name: uplink-antimov-law-name
description: uplink-antimov-law-desc
productEntity: AntimovCircuitBoard
@@ -1199,25 +1193,6 @@
components:
- SurplusBundle
- type: listing
id: UplinkSuperSurplusBundle
name: uplink-super-surplus-bundle-name
description: uplink-super-surplus-bundle-desc
productEntity: CrateSyndicateSuperSurplusBundle
cost:
Telecrystal: 40
categories:
- UplinkDisruption
conditions:
- !type:StoreWhitelistCondition
blacklist:
tags:
- NukeOpsUplink
- !type:BuyerWhitelistCondition
blacklist:
components:
- SurplusBundle
- type: listing
id: UplinkStarterKit
name: uplink-starter-kit-name
@@ -1249,14 +1224,26 @@
Telecrystal: 12
categories:
- UplinkDisruption
conditions:
- !type:StoreWhitelistCondition
whitelist:
tags:
- NukeOpsUplink
- !type:BuyerWhitelistCondition
blacklist:
components:
- SurplusBundle
- type: listing
id: UplinkCameraBug
name: uplink-cameraBug-name
description: uplink-cameraBug-desc
productEntity: CameraBug
discountCategory: usualDiscounts
discountDownTo:
Telecrystal: 1
cost:
Telecrystal: 4
Telecrystal: 2
categories:
- UplinkDisruption
@@ -1272,7 +1259,7 @@
discountDownTo:
Telecrystal: 8
cost:
Telecrystal: 14
Telecrystal: 12
categories:
- UplinkAllies
conditions:
@@ -1291,7 +1278,7 @@
discountDownTo:
Telecrystal: 7
cost:
Telecrystal: 14
Telecrystal: 11
categories:
- UplinkAllies
conditions:
@@ -1375,11 +1362,8 @@
name: uplink-carp-dehydrated-name
description: uplink-carp-dehydrated-desc
productEntity: DehydratedSpaceCarp
discountCategory: rareDiscounts
discountDownTo:
Telecrystal: 1
cost:
Telecrystal: 2
Telecrystal: 1
categories:
- UplinkAllies
conditions:
@@ -1445,9 +1429,9 @@
productEntity: FreedomImplanter
discountCategory: veryRareDiscounts
discountDownTo:
Telecrystal: 3
Telecrystal: 1
cost:
Telecrystal: 5
Telecrystal: 2
categories:
- UplinkImplants
@@ -1459,9 +1443,9 @@
productEntity: ScramImplanter
discountCategory: veryRareDiscounts
discountDownTo:
Telecrystal: 4
Telecrystal: 1
cost:
Telecrystal: 6 # it's a gamble that may kill you easily so 6 TC per 2 uses, second one more of a backup
Telecrystal: 2 # it's a gamble that may kill you easily so 1 TC per use.
categories:
- UplinkImplants
@@ -1475,7 +1459,7 @@
discountDownTo:
Telecrystal: 2
cost:
Telecrystal: 5
Telecrystal: 3
categories:
- UplinkImplants
@@ -1569,11 +1553,8 @@
description: uplink-uplink-implanter-desc
icon: { sprite: /Textures/Objects/Devices/communication.rsi, state: old-radio }
productEntity: UplinkImplanter
discountCategory: usualDiscounts
discountDownTo:
Telecrystal: 1
cost:
Telecrystal: 2
Telecrystal: 1
categories:
- UplinkImplants
conditions:
@@ -1818,16 +1799,6 @@
tags:
- NukeOpsUplink
- type: listing
id: UplinkClothingConductingGloves
name: uplink-clothing-conducting-gloves-name
description: uplink-clothing-conducting-gloves-desc
productEntity: ClothingHandsGlovesConducting
cost:
Telecrystal: 1
categories:
- UplinkPointless
- type: listing
id: UplinkBackpackSyndicate
name: uplink-backpack-syndicate-name
@@ -1860,16 +1831,23 @@
categories:
- UplinkPointless
- type: listing
id: UplinkClothingConductingGloves
name: uplink-clothing-conducting-gloves-name
description: uplink-clothing-conducting-gloves-desc
productEntity: ClothingHandsGlovesConducting
cost:
Telecrystal: 1
categories:
- UplinkPointless
- type: listing
id: UplinkRevolverCapGun
name: uplink-revolver-cap-gun-name
description: uplink-revolver-cap-gun-desc
productEntity: RevolverCapGun
discountCategory: rareDiscounts
discountDownTo:
Telecrystal: 2
cost:
Telecrystal: 4
Telecrystal: 1
categories:
- UplinkPointless
@@ -1878,13 +1856,11 @@
name: uplink-syndicate-stamp-name
description: uplink-syndicate-stamp-desc
productEntity: RubberStampSyndicate
discountCategory: rareDiscounts
discountDownTo:
Telecrystal: 1
cost:
Telecrystal: 2
categories:
- UplinkPointless
conditions:
- !type:ListingLimitedStockCondition
stock: 1
- type: listing
id: UplinkCatEars
@@ -1895,16 +1871,22 @@
Telecrystal: 26
categories:
- UplinkPointless
conditions:
- !type:BuyerWhitelistCondition
blacklist:
components:
- SurplusBundle
- type: listing
id: UplinkOutlawHat
name: uplink-outlaw-hat-name
description: uplink-outlaw-hat-desc
productEntity: ClothingHeadHatOutlawHat
cost:
Telecrystal: 1
categories:
- UplinkPointless
conditions:
- !type:ListingLimitedStockCondition
stock: 1
- type: listing
id: UplinkOutlawGlasses
@@ -1922,7 +1904,7 @@
description: uplink-costume-pyjama-desc
productEntity: ClothingBackpackDuffelSyndicatePyjamaBundle
cost:
Telecrystal: 4
Telecrystal: 2
categories:
- UplinkPointless
@@ -1942,7 +1924,7 @@
description: uplink-carp-suit-bundle-desc
productEntity: ClothingBackpackDuffelSyndicateCarpSuit
cost:
Telecrystal: 4
Telecrystal: 2
categories:
- UplinkPointless
@@ -1951,20 +1933,22 @@
name: uplink-operative-suit-name
description: uplink-operative-suit-desc
productEntity: ClothingUniformJumpsuitOperative
cost:
Telecrystal: 1
categories:
- UplinkPointless
conditions:
- !type:ListingLimitedStockCondition
stock: 1
- type: listing
id: UplinkOperativeSkirt
name: uplink-operative-skirt-name
description: uplink-operative-skirt-desc
productEntity: ClothingUniformJumpskirtOperative
cost:
Telecrystal: 1
categories:
- UplinkPointless
conditions:
- !type:ListingLimitedStockCondition
stock: 1
- type: listing
id: UplinkBalloon
@@ -1975,26 +1959,33 @@
Telecrystal: 20
categories:
- UplinkPointless
conditions:
- !type:BuyerWhitelistCondition
blacklist:
components:
- SurplusBundle
- type: listing
id: UplinkScarfSyndieRed
name: uplink-scarf-syndie-red-name
description: uplink-scarf-syndie-red-desc
productEntity: ClothingNeckScarfStripedSyndieRed
cost:
Telecrystal: 1
categories:
- UplinkPointless
conditions:
- !type:ListingLimitedStockCondition
stock: 1
- type: listing
id: UplinkScarfSyndieGreen
name: uplink-scarf-syndie-green-name
description: uplink-scarf-syndie-green-desc
productEntity: ClothingNeckScarfStripedSyndieGreen
cost:
Telecrystal: 1
categories:
- UplinkPointless
conditions:
- !type:ListingLimitedStockCondition
stock: 1
- type: listing
id: UplinkSyndicateBusinessCard
@@ -2037,44 +2028,6 @@
whitelist:
- Botanist
- type: listing
id: uplinkRiggedBoxingGlovesPassenger
name: uplink-rigged-boxing-gloves-name
description: uplink-rigged-boxing-gloves-desc
productEntity: ClothingHandsGlovesBoxingRigged
discountCategory: usualDiscounts
discountDownTo:
Telecrystal: 3
cost:
Telecrystal: 6
categories:
- UplinkJob
conditions:
- !type:BuyerJobCondition
whitelist:
- Passenger
- type: listing
id: uplinkNecronomicon
name: uplink-necronomicon-name
description: uplink-necronomicon-desc
productEntity: BibleNecronomicon
discountCategory: usualDiscounts
discountDownTo:
Telecrystal: 2
cost:
Telecrystal: 4
categories:
- UplinkJob
conditions:
- !type:BuyerJobCondition
whitelist:
- Chaplain
- !type:BuyerWhitelistCondition
blacklist:
components:
- SurplusBundle
- type: listing
id: uplinkHolyHandGrenade
name: uplink-holy-hand-grenade-name
@@ -2099,9 +2052,9 @@
productEntity: RevolverCapGunFake
discountCategory: rareDiscounts
discountDownTo:
Telecrystal: 3
Telecrystal: 2
cost:
Telecrystal: 5
Telecrystal: 3
categories:
- UplinkJob
conditions:
@@ -2110,24 +2063,6 @@
- Mime
- Clown
- type: listing
id: uplinkBananaPeelExplosive
name: uplink-banana-peel-explosive-name
description: uplink-banana-peel-explosive-desc
icon: { sprite: Objects/Specific/Hydroponics/banana.rsi, state: peel }
productEntity: TrashBananaPeelExplosiveUnarmed
discountCategory: rareDiscounts
discountDownTo:
Telecrystal: 1
cost:
Telecrystal: 2
categories:
- UplinkJob
conditions:
- !type:BuyerJobCondition
whitelist:
- Clown
- type: listing
id: UplinkClusterBananaPeel
name: uplink-cluster-banana-peel-name
@@ -2137,7 +2072,7 @@
discountDownTo:
Telecrystal: 3
cost:
Telecrystal: 6
Telecrystal: 5
categories:
- UplinkJob
conditions:
@@ -2228,10 +2163,10 @@
icon: { sprite: Objects/Misc/monkeycube.rsi, state: box}
discountCategory: rareDiscounts
discountDownTo:
Telecrystal: 4
Telecrystal: 2
productEntity: SyndicateSpongeBox
cost:
Telecrystal: 7
Telecrystal: 4
categories:
- UplinkJob
conditions:
@@ -2258,10 +2193,6 @@
- !type:BuyerJobCondition
whitelist:
- Librarian
- !type:BuyerWhitelistCondition
blacklist:
components:
- SurplusBundle
- type: listing
id: UplinkCombatBakery
@@ -2348,7 +2279,7 @@
discountDownTo:
Telecrystal: 10
cost:
Telecrystal: 15
Telecrystal: 14
categories:
- UplinkJob
conditions:

View File

@@ -1,13 +1,8 @@
- type: entity
abstract: true
parent: ClothingHandsBase
id: ClothingHandsGlovesBoxingRed
name: red boxing gloves
description: Red gloves for competitive boxing.
id: ClothingHandsGlovesBoxingBase
components:
- type: Sprite
sprite: Clothing/Hands/Gloves/Boxing/boxingred.rsi
- type: Clothing
sprite: Clothing/Hands/Gloves/Boxing/boxingred.rsi
- type: StaminaDamageOnHit
damage: 8 #Stam damage values seem a bit higher than regular damage because of the decay, etc
# This needs to be moved to boxinggloves
@@ -21,17 +16,28 @@
collection: BoxingHit
animation: WeaponArcFist
mustBeEquippedToUse: true
- type: Fiber
fiberMaterial: fibers-leather
fiberColor: fibers-red
- type: FingerprintMask
- type: Tag
tags:
- Kangaroo
- WhitelistChameleon
- type: entity
parent: ClothingHandsGlovesBoxingRed
parent: ClothingHandsGlovesBoxingBase
id: ClothingHandsGlovesBoxingRed
name: red boxing gloves
description: Red gloves for competitive boxing.
components:
- type: Sprite
sprite: Clothing/Hands/Gloves/Boxing/boxingred.rsi
- type: Clothing
sprite: Clothing/Hands/Gloves/Boxing/boxingred.rsi
- type: Fiber
fiberMaterial: fibers-leather
fiberColor: fibers-red
- type: FingerprintMask
- type: entity
parent: ClothingHandsGlovesBoxingBase
id: ClothingHandsGlovesBoxingBlue
name: blue boxing gloves
description: Blue gloves for competitive boxing.
@@ -47,7 +53,7 @@
- type: FingerprintMask
- type: entity
parent: ClothingHandsGlovesBoxingRed
parent: ClothingHandsGlovesBoxingBase
id: ClothingHandsGlovesBoxingGreen
name: green boxing gloves
description: Green gloves for competitive boxing.
@@ -63,7 +69,7 @@
- type: FingerprintMask
- type: entity
parent: ClothingHandsGlovesBoxingRed
parent: ClothingHandsGlovesBoxingBase
id: ClothingHandsGlovesBoxingYellow
name: yellow boxing gloves
description: Yellow gloves for competitive boxing.
@@ -79,19 +85,53 @@
- type: FingerprintMask
- type: entity
parent: ClothingHandsGlovesBoxingBlue
id: ClothingHandsGlovesBoxingRigged
abstract: true
parent: ClothingHandsGlovesBoxingBase
id: ClothingHandsGlovesBoxingRiggedBase
suffix: Rigged
components:
- type: StaminaDamageOnHit
damage: 25
- type: MeleeWeapon
attackRate: 1.4
damage:
types:
Blunt: 8
bluntStaminaDamageFactor: 0.0 # so blunt doesn't deal stamina damage at all
mustBeEquippedToUse: true
bluntStaminaDamageFactor: 2
- type: entity
parent: [ ClothingHandsGlovesBoxingRiggedBase, ClothingHandsGlovesBoxingRed ]
id: ClothingHandsGlovesBoxingRiggedRed
name: red boxing gloves
description: Red gloves for competitive boxing.
- type: entity
parent: [ ClothingHandsGlovesBoxingRiggedBase, ClothingHandsGlovesBoxingBlue ]
id: ClothingHandsGlovesBoxingRiggedBlue
name: blue boxing gloves
description: Blue gloves for competitive boxing.
- type: entity
parent: [ ClothingHandsGlovesBoxingRiggedBase, ClothingHandsGlovesBoxingGreen ]
id: ClothingHandsGlovesBoxingRiggedGreen
name: green boxing gloves
description: Green gloves for competitive boxing.
- type: entity
parent: [ ClothingHandsGlovesBoxingRiggedBase, ClothingHandsGlovesBoxingYellow ]
id: ClothingHandsGlovesBoxingRiggedYellow
name: yellow boxing gloves
description: Yellow gloves for competitive boxing.
- type: entity
id: GlovesBoxingRiggedRandomSpawner
categories: [ HideSpawnMenu ]
name: random rigged boxing glove spawner
components:
- type: EntityTableSpawner
table: !type:GroupSelector
children:
- id: ClothingHandsGlovesBoxingRiggedRed
- id: ClothingHandsGlovesBoxingRiggedBlue
- id: ClothingHandsGlovesBoxingRiggedGreen
- id: ClothingHandsGlovesBoxingRiggedYellow
- type: entity
parent: [ClothingHandsBase, BaseCommandContraband]

View File

@@ -234,15 +234,6 @@
Hand:
location: Left
- type: ComplexInteraction
- type: Clumsy
gunShootFailDamage:
types:
Blunt: 5
Piercing: 4
Heat: 3
catchingFailDamage:
types:
Blunt: 1
- type: MeleeWeapon
angle: 30
animation: WeaponArcFist
@@ -257,9 +248,6 @@
- type: RandomMetadata
nameSegments:
- NamesClown
- type: NpcFactionMember
factions:
- Syndicate
- type: HTN
rootTask:
task: SimpleHumanoidHostileCompound

View File

@@ -811,10 +811,6 @@
Quantity: 2
- ReagentId: Vitamin
Quantity: 1
- type: DamageOtherOnHit
damage:
types:
Blunt: 0 # so the damage stats icon doesn't immediately give away the syndie ones
- type: entity
parent: FoodBakedCroissant

View File

@@ -699,13 +699,17 @@
- type: entityTable # size: 1x2
id: HappyHonkToyUnsafeEntityTable
table: !type:GroupSelector
children:
children: # Total Weight 6
- id: ClothingHeadHatCatEars
weight: 0.25
- id: C4
weight: 0.02
weight: 0.05
- id: ToyMarauder
- id: ToyMauler
- id: ToyNuke
- id: ToySword
- id: WeaponRevolverPythonAP
weight: 0.4
- id: BalloonSyn
weight: 0.6
weight: 0.3
- id: PlushieNuke

View File

@@ -124,6 +124,18 @@
- type: StaticPrice
price: 10000
- type: entity
id: SyndimovCircuitBoard
parent: [BaseSiliconLawboard, BaseSyndicateContraband]
name: law board (Syndimov)
description: An electronics board containing the Syndimov lawset.
components:
- type: SiliconLawProvider
laws: SyndicateStatic
lawUploadSound: /Audio/Ambience/Antag/emagged_borg.ogg # This should probably have its own sound but it's fine for now.
- type: StaticPrice
price: 5000
- type: entity
id: NutimovCircuitBoard
parent: BaseSiliconLawboard

View File

@@ -266,3 +266,17 @@
guides:
- Botany
- Chemicals
- type: entity
parent: [ BaseFlatpack, BaseSyndicateContraband ]
id: SyndicateMicrowaveFlatpack
name: donk co. microwave flatpack
description: A flatpack used for constructing a microwave too hot for Nanotrasen to handle.
components:
- type: Item
size: Normal
- type: Flatpack
entity: SyndicateMicrowave
- type: GuideHelp
guides:
- FoodRecipes

View File

@@ -259,7 +259,7 @@
- type: entity
id: VoiceMaskImplanter
name: voice mask implanter
name: identity mask implanter
parent: BaseImplantOnlyImplanterSyndi
components:
- type: Implanter

View File

@@ -242,8 +242,8 @@
- type: entity
parent: BaseSubdermalImplant
id: VoiceMaskImplant
name: voice mask implant
description: This implant allows you to change your voice at will.
name: identity mask implant
description: This implant allows you to change your identity at will.
categories: [ HideSpawnMenu ]
components:
- type: SubdermalImplant

View File

@@ -50,7 +50,7 @@
- type: ExaminableBattery
- type: PowerConsumer
voltage: High
drawRate: 1000000
drawRate: 10000000
- type: Sprite
sprite: Objects/Power/powersink.rsi
state: powersink

View File

@@ -1,58 +1,64 @@
- type: entity
abstract: true
parent: BaseItem
id: BaseJammer
name: radio jammer
parent: [BaseItem, BaseSyndicateContraband]
id: RadioJammer
description: This device will disrupt any nearby outgoing radio communication as well as suit sensors when activated.
components:
- type: Sprite
sprite: Objects/Devices/jammer.rsi
layers:
- state: jammer
- state: jammer_high_charge
map: ["enum.RadioJammerLayers.LED"]
shader: unshaded
visible: false
- state: jammer
- state: jammer_high_charge
map: ["enum.PowerDeviceVisualLayers.Powered"]
shader: unshaded
visible: false
- type: RadioJammer
settings:
- wattage: 1
range: 2.5
message: radio-jammer-component-set-message-low
name: radio-jammer-component-setting-low
- wattage: 2
range: 6
message: radio-jammer-component-set-message-medium
name: radio-jammer-component-setting-medium
message: radio-jammer-component-set-message-low
name: radio-jammer-component-setting-low
- wattage: 12
range: 12
message: radio-jammer-component-set-message-high
name: radio-jammer-component-setting-high
- type: PowerCellSlot
cellSlotId: cell_slot
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot
- type: ItemSlots
slots:
cell_slot:
name: power-cell-slot-component-slot-name-default
startingItem: PowerCellMedium
- type: Appearance
- type: ItemToggle
- type: GenericVisualizer
visuals:
enum.RadioJammerVisuals.LEDOn:
RadioJammerLayers.LED:
True: { visible: True }
False: { visible: False }
enum.RadioJammerVisuals.ChargeLevel:
RadioJammerLayers.LED:
Low: {state: jammer_low_charge}
Medium: {state: jammer_medium_charge}
High: {state: jammer_high_charge}
enum.ToggleableVisuals.Enabled:
enum.PowerDeviceVisualLayers.Powered:
True: { visible: true }
False: { visible: false }
- type: BatteryVisuals
- type: StaticPrice
price: 1500
- type: entity
parent: [RadioJammer, BaseXenoborgContraband]
name: radio jammer
parent: [BaseJammer, PowerCellSlotMediumItem, BaseSyndicateContraband]
id: RadioJammer
description: This device will disrupt any nearby outgoing and incoming radio communication as well as suit sensors when activated.
components:
- type: GenericVisualizer
visuals:
enum.BatteryVisuals.State:
enum.PowerDeviceVisualLayers.Powered:
Full: { state: jammer_high_charge }
Neither: { state: jammer_medium_charge }
Empty: { state: jammer_low_charge }
enum.ToggleableVisuals.Enabled:
enum.PowerDeviceVisualLayers.Powered:
True: { visible: true }
False: { visible: false }
- type: ToggleCellDraw
- type: BatteryVisuals
- type: StaticPrice
price: 1500
- type: entity
parent: [BaseJammer, BaseXenoborgContraband]
id: XenoborgRadioJammer
name: xenoborg radio jammer
components:
@@ -62,10 +68,3 @@
- 2003 # mothership radio
- 2004 # xenoborg network
- 2005 # mothership network
- type: ItemSlots
slots:
cell_slot:
name: power-cell-slot-component-slot-name-default
startingItem: PowerCellMicroreactor
disableEject: true
swap: false

View File

@@ -51,10 +51,10 @@
collection: MetalThud
- type: entity
name: syndicate jaws of life
name: syndicate jaws of death
parent: [JawsOfLife, BaseSyndicateContraband]
id: SyndicateJawsOfLife
description: Useful for entering the station or its departments.
description: Useful for breaking into secure areas and other nefarious activities.
components:
- type: Sprite
sprite: Objects/Tools/jaws_of_life.rsi

View File

@@ -794,10 +794,9 @@
price: 100
- type: entity
name: experimental C.H.I.M.P. handcannon
parent: [WeaponPistolCHIMP, BaseSyndicateContraband]
id: WeaponPistolCHIMPUpgraded
description: This C.H.I.M.P. seems to have a greater punch than usual...
suffix: Syndicate
components:
- type: BatteryWeaponFireModes
fireModes:

View File

@@ -110,11 +110,11 @@
description: A cyborg-mounted weapon system based on the Viper pistol. Creates ammunition on the fly from an internal fabricator, which slowly self-charges.
components:
- type: Gun
fireRate: 5
fireRate: 6
selectedMode: SemiAuto
availableModes:
- SemiAuto
- FullAuto
- SemiAuto
- FullAuto
soundGunshot:
path: /Audio/Weapons/Guns/Gunshots/pistol.ogg
- type: Sprite
@@ -135,7 +135,7 @@
proto: CartridgePistol
cycleable: false # No synthesizing ammo for your syndicate masters.
- type: BallisticAmmoSelfRefiller
autoRefillRate: 4s
autoRefillRate: 2s
affectedByEmp: true
- type: AmmoCounter

View File

@@ -1,16 +1,14 @@
- type: entity
parent: FoodBreadBaguette
parent: [ FoodBreadBaguette, BaseSword, BaseSyndicateContraband ]
id: WeaponBaguette
suffix: Weapon
components:
- type: MeleeWeapon
attackRate: 1.4
wideAnimationRotation: -120
attackRate: 1.5
damage:
types:
Slash: 16
Slash: 17
soundHit:
path: /Audio/Weapons/bladeslice.ogg
- type: Reflect
reflectProb: 0.05
spread: 90
- type: DisarmMalus

View File

@@ -1,5 +1,5 @@
- type: entity
parent: FoodBakedCroissant
parent: [ FoodBakedCroissant, ThrowingKnife ]
id: WeaponCroissant
suffix: Weapon
components:
@@ -13,14 +13,5 @@
- ItemMask
restitution: 0.3
friction: 0.2
- type: EmbeddableProjectile
sound: /Audio/Weapons/star_hit.ogg
- type: LandAtCursor
- type: DamageOtherOnHit
ignoreResistances: true
damage:
types:
Slash: 5
Piercing: 10
- type: ThrowingAngle
angularVelocity: true # spins

View File

@@ -131,6 +131,24 @@
volume: 30
initialBeepDelay: 0
beepInterval: 16
- type: LightBehaviorOnTrigger
behavior: activate
- type: PointLight
energy: 50
radius: 0
color: Red
softness: 0
falloff: 20
mask: /Textures/Effects/LightMasks/double_cone.png
- type: RotatingLight
speed: 360
- type: LightBehaviour
behaviours:
- !type:FadeBehaviour # have the radius start small and get larger as it starts to burn
id: activate
maxDuration: 5
startValue: 1
endValue: 2
- type: entity
@@ -176,9 +194,10 @@
sound:
path: /Audio/Effects/Grenades/Supermatter/supermatter_loop.ogg
- type: GravityWell
maxRange: 7
baseRadialAcceleration: 5
baseTangentialAcceleration: .5
maxRange: 5
minRange: 0.25
baseRadialAcceleration: 25
baseTangentialAcceleration: 5
gravPulsePeriod: 0.03
- type: SingularityDistortion
intensity: 150

View File

@@ -1,35 +1,16 @@
# ScatteringGrenade is intended for grenades that spawn entities, especially those with timers
- type: entity
abstract: true
parent: BaseItem
parent: GrenadeBase
id: ScatteringGrenadeBase
components:
- type: Appearance
- type: ContainerContainer
containers:
cluster-payload: !type:Container
- type: Damageable
damageContainer: Inorganic
- type: ScatteringGrenade
- type: TriggerOnUse
- type: TimerTrigger
delay: 3
- type: Tag
tags:
- HandGrenade
- type: Fixtures
fixtures:
fix1:
shape: !type:PhysShapeCircle
radius: 0.2
density: 20 # derived from base_item
mask:
- ItemMask
restitution: 0.3
friction: 0.2
- type: entity
parent: [FragileGrenadeBase, ScatteringGrenadeBase, BaseSecurityContraband]
parent: [FragileGrenadeBase, ScatteringGrenadeBase, TimerGrenadeBase, BaseSecurityContraband]
id: ClusterBang
name: clusterbang
description: Can be used only with flashbangs. Explodes several times.
@@ -82,7 +63,7 @@
positional: true
- type: entity
parent: [VolatileGrenadeBase, ScatteringGrenadeBase, BaseSyndicateContraband]
parent: [VolatileGrenadeBase, ScatteringGrenadeBase, TimerGrenadeBase, BaseSyndicateContraband]
id: ClusterGrenade
name: clustergrenade
description: Why use one grenade when you can use three at once!
@@ -112,18 +93,20 @@
price: 2500
- type: entity
parent: [FragileGrenadeBase, ScatteringGrenadeBase, BaseSyndicateContraband]
parent: [FragileGrenadeBase, ScatteringGrenadeBase, ImpactGrenadeBase, BaseSyndicateContraband]
id: ClusterBananaPeel
name: cluster banana peel
description: Splits into 6 explosive banana peels after throwing, guaranteed fun!
components:
- type: Sprite
sprite: Objects/Specific/Hydroponics/banana.rsi
state: produce
layers:
- state: produce
- type: ScatteringGrenade
fillPrototype: TrashBananaPeelExplosive
capacity: 6
delayBeforeTriggerContents: 20
triggerKey: trigger
- type: LandAtCursor
- type: DamageOnLand
damage:
@@ -137,7 +120,7 @@
positional: true
- type: entity
parent: [SoapSyndie, ScatteringGrenadeBase, BaseSyndicateContraband]
parent: [SoapSyndie, ScatteringGrenadeBase, ImpactGrenadeBase, BaseSyndicateContraband]
id: SlipocalypseClusterSoap
name: slipocalypse clustersoap
description: Spreads small pieces of syndicate soap over an area upon landing on the floor.
@@ -148,6 +131,7 @@
- state: syndie-4
map: ["enum.SolutionContainerLayers.Fill"]
- type: ScatteringGrenade
triggerKey: trigger
fillPrototype: SoapletSyndie
capacity: 30
delayBeforeTriggerContents: 60
@@ -168,7 +152,7 @@
price: 1000
- type: entity
parent: [FragileGrenadeBase, ScatteringGrenadeBase]
parent: [FragileGrenadeBase, ScatteringGrenadeBase, TimerGrenadeBase]
id: GrenadeFoamDart
name: foam dart grenade
description: Releases a bothersome spray of foam darts that cause severe welching.