Merge remote-tracking branch 'space-wizards/master'

# Conflicts:
#	Resources/Locale/en-US/_strings/flash/components/flash-immunity-component.ftl
#	Resources/Locale/en-US/_strings/tiles/tiles.ftl
#	Resources/Prototypes/Actions/changeling.yml
#	Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml
#	Resources/Prototypes/Entities/Structures/Furniture/chairs.yml
#	Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml
#	Resources/Prototypes/Entities/Structures/Wallmounts/fire_alarm.yml
#	Resources/Prototypes/Maps/Pools/default.yml
#	Resources/Prototypes/Stacks/floor_tile_stacks.yml
#	Resources/Prototypes/Tiles/floors.yml
#	Resources/Textures/Objects/Tiles/tile.rsi/meta.json
#	Resources/Textures/Structures/Furniture/chairs.rsi/meta.json
#	Resources/Textures/Tiles/xeno_flooring.png
#	Resources/Textures/Tiles/xeno_maint.png
#	Resources/Textures/Tiles/xeno_steel.png
This commit is contained in:
Vigers Ray 2025-06-16 01:51:55 +03:00
commit 6e8e359a66
189 changed files with 133922 additions and 834 deletions

View file

@ -74,7 +74,7 @@ namespace Content.IntegrationTests.Tests
//"Elkridge",
//"Relic",
"dm01-entryway",
"Exo",
};
// Sunrise-Start

View file

@ -45,7 +45,7 @@ namespace Content.Server.Flash
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<FlashImmunityComponent, ExaminedEvent>(OnExamine);
SubscribeLocalEvent<FlashComponent, MeleeHitEvent>(OnFlashMeleeHit);
// ran before toggling light for extra-bright lantern
SubscribeLocalEvent<FlashComponent, UseInHandEvent>(OnFlashUseInHand, before: new[] { typeof(HandheldLightSystem) });
@ -54,7 +54,13 @@ namespace Content.Server.Flash
SubscribeLocalEvent<PermanentBlindnessComponent, FlashAttemptEvent>(OnPermanentBlindnessFlashAttempt);
SubscribeLocalEvent<TemporaryBlindnessComponent, FlashAttemptEvent>(OnTemporaryBlindnessFlashAttempt);
}
private void OnExamine(Entity<FlashImmunityComponent> ent, ref ExaminedEvent args)
{
args.PushMarkup(Loc.GetString("flash-protection"));
}
private void OnFlashMeleeHit(EntityUid uid, FlashComponent comp, MeleeHitEvent args)
{
if (!args.IsHit ||

View file

@ -71,7 +71,9 @@ public sealed class GlueSystem : SharedGlueSystem
private bool TryGlue(Entity<GlueComponent> entity, EntityUid target, EntityUid actor)
{
// if item is glued then don't apply glue again so it can be removed for reasonable time
if (HasComp<GluedComponent>(target) || !HasComp<ItemComponent>(target))
// If glue is applied to an unremoveable item, the component will disappear after the duration.
// This effecitvely means any unremoveable item could be removed with a bottle of glue.
if (HasComp<GluedComponent>(target) || !HasComp<ItemComponent>(target) || HasComp<UnremoveableComponent>(target))
{
_popup.PopupEntity(Loc.GetString("glue-failure", ("target", target)), actor, actor, PopupType.Medium);
return false;

View file

@ -72,7 +72,7 @@ namespace Content.Shared.Containers.ItemSlots
continue;
var item = Spawn(slot.StartingItem, Transform(uid).Coordinates);
if (slot.ContainerSlot != null)
_containers.Insert(item, slot.ContainerSlot);
}

View file

@ -156,6 +156,27 @@ public abstract partial class SharedHandsSystem : EntitySystem
}
// Sunrise-end
/// <summary>
/// Tries to pick up an entity into a hand, forcing to drop an item if its not free.
/// By default it does check if it's possible to drop items.
/// </summary>
public bool TryForcePickup(
EntityUid uid,
EntityUid entity,
Hand hand,
bool checkActionBlocker = true,
bool animate = true,
HandsComponent? handsComp = null,
ItemComponent? item = null)
{
if (!Resolve(uid, ref handsComp, false))
return false;
TryDrop(uid, hand, checkActionBlocker: checkActionBlocker, handsComp: handsComp);
return TryPickup(uid, entity, hand, checkActionBlocker, animate, handsComp, item);
}
/// <summary>
/// Tries to pick up an entity into any hand, forcing to drop an item if there are no free hands
/// By default it does check if it's possible to drop items

View file

@ -127,41 +127,76 @@ public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance,
{
var random = IoCManager.Resolve<IRobustRandom>();
var markingManager = IoCManager.Resolve<MarkingManager>();
var hairStyles = markingManager.MarkingsByCategoryAndSpecies(MarkingCategories.Hair, species).Keys.ToList();
var facialHairStyles = markingManager.MarkingsByCategoryAndSpecies(MarkingCategories.FacialHair, species).Keys.ToList();
var newHairStyle = hairStyles.Count > 0
? random.Pick(hairStyles)
: HairStyles.DefaultHairStyle;
var newFacialHairStyle = HairStyles.DefaultFacialHairStyle;
var newHairStyle = HairStyles.DefaultHairStyle;
List<Marking> newMarkings = [];
var newFacialHairStyle = facialHairStyles.Count == 0 || sex == Sex.Female
? HairStyles.DefaultFacialHairStyle
: random.Pick(facialHairStyles);
// grab a completely random color.
var baseColor = new Color(random.NextFloat(1), random.NextFloat(1), random.NextFloat(1), 1);
var newHairColor = random.Pick(HairStyles.RealisticHairColors);
newHairColor = newHairColor
.WithRed(RandomizeColor(newHairColor.R))
.WithGreen(RandomizeColor(newHairColor.G))
.WithBlue(RandomizeColor(newHairColor.B));
// TODO: Add random markings
var newEyeColor = random.Pick(RealisticEyeColors);
// create a new color palette based on BaseColor. roll to determine what type of palette it is.
// personally I think this should be weighted, but I can't be bothered to implement that.
List<Color> colorPalette = [];
switch (random.Next(3))
{
case 0:
colorPalette = GetSplitComplementaries(baseColor);
break;
case 1:
colorPalette = GetTriadicComplementaries(baseColor);
break;
case 2:
colorPalette = GetOneComplementary(baseColor);
break;
}
// grab the species skin coloration type.
var skinType = IoCManager.Resolve<IPrototypeManager>().Index<SpeciesPrototype>(species).SkinColoration;
var newSkinColor = new Color(random.NextFloat(1), random.NextFloat(1), random.NextFloat(1), 1);
// declare some defaults. ensures that the hair and eyes on hues-colored species don't match the skin or one another.
var newSkinColor = colorPalette[0];
var newHairColor = colorPalette[1];
var newEyeColor = colorPalette[2];
// now we do some color logic.
switch (skinType)
{
// if the species is HumanToned:
case HumanoidSkinColor.HumanToned:
// quantize the randomized skin color to the nearest acceptable HumanToned color.
var tone = Math.Round(Humanoid.SkinColor.HumanSkinToneFromColor(newSkinColor));
newSkinColor = Humanoid.SkinColor.HumanSkinTone((int)tone);
// pick a random realistic hair color from the list and randomize it juuuuust a little bit.
newHairColor = random.Pick(HairStyles.RealisticHairColors);
newHairColor = newHairColor
.WithRed(RandomizeColor(newHairColor.R))
.WithGreen(RandomizeColor(newHairColor.G))
.WithBlue(RandomizeColor(newHairColor.B));
// and pick a random realistic eye color from the list.
newEyeColor = random.Pick(RealisticEyeColors);
// we're also going to crush the other colors down to the skin's luminosity so markings don't appear too bright on darker skin.
colorPalette[1] = SquashToSkinLuminosity(newSkinColor, colorPalette[1]);
colorPalette[2] = SquashToSkinLuminosity(newSkinColor, colorPalette[2]);
break;
// if the species is Hues toned: it's fine the way it is.
case HumanoidSkinColor.Hues:
break;
// if the species is TintedHues toned: tint them hues.
case HumanoidSkinColor.TintedHues:
newSkinColor = Humanoid.SkinColor.ValidTintedHuesSkinTone(newSkinColor);
// we're also going to crush the other colors down to valid TintedHues skin colors.
colorPalette[1] = Humanoid.SkinColor.ValidTintedHuesSkinTone(colorPalette[1]);
colorPalette[2] = Humanoid.SkinColor.ValidTintedHuesSkinTone(colorPalette[2]);
break;
// if the species is VoxFeathers toned: confine the skin color to vox limits. Bright colors are otherwise fine, so leave the marking colors alone.
case HumanoidSkinColor.VoxFeathers:
newSkinColor = Humanoid.SkinColor.ProportionalVoxColor(newSkinColor);
break;
@ -170,12 +205,145 @@ public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance,
break;
}
return new HumanoidCharacterAppearance(newHairStyle, newHairColor, newFacialHairStyle, newHairColor, newEyeColor, newSkinColor, new ());
// now we loop through every extant marking category,
foreach (var category in Enum.GetValues<MarkingCategories>())
{
// grab a list of markings in that category for that species,
var markings = markingManager.MarkingsByCategoryAndSpecies(category, species).Keys.ToList();
var markingProtos = markingManager.MarkingsByCategoryAndSpecies(category, species).Values.ToList();
// if it's facial hair, there are entries in the category, and the character is not female, assign a random one. else bald
if (category == MarkingCategories.FacialHair)
{
newFacialHairStyle = markings.Count == 0 || sex == Sex.Female ? HairStyles.DefaultFacialHairStyle : random.Pick(markings);
}
// if it's hair, and there are hair styles, roll one. else bald
else if (category == MarkingCategories.Hair)
{
newHairStyle = markings.Count > 0 ? random.Pick(markings) : HairStyles.DefaultHairStyle;
}
// for every other category,
else if (markings.Count > 0)
{
// roll a die. currently a 1 in 3 chance per category, except Tails, which are 1 in 2 (because of the effect they have on the silhouettes of spiders and moths.)
int diceRoll;
if (category == MarkingCategories.Tail)
diceRoll = random.Next(2);
else
diceRoll = random.Next(3);
if (diceRoll == 0)
{
MarkingPrototype? lastMarking = null;
// roll to see how many markings from that category will be added. currently a maximum of 2.
var loops = random.Next(2) + 1;
// add a marking (loops) times
for (var i = 0; i < loops; i++)
{
// pick a random marking from the list
var protoToAdd = random.Pick(markingProtos);
var markingToAdd = protoToAdd.AsMarking();
Color markingColor;
// prevent duplicates:
if (lastMarking != null && lastMarking == protoToAdd)
continue;
// set gauze to white.
// side note, I really hate that gauze isn't its own category. please fix that so that i can make this not suck as much.
// or, like, give it its own color rules. or something.
if (markingToAdd.MarkingId.Contains("gauze", StringComparison.OrdinalIgnoreCase))
{
markingToAdd.SetColor(Color.White);
newMarkings.Add(markingToAdd);
lastMarking = protoToAdd;
continue;
}
// select a random color from our two secondary colors. if our marking is a Tail, add the skin color as well, otherwise lizards always look a little odd.
// this will also make moths and spiders look less interesting on average, but I don't want a hardcoded exception for lizards.
if (category == MarkingCategories.Tail)
markingColor = random.Pick(colorPalette);
else
markingColor = random.Pick(colorPalette.Skip(0).ToList());
// set the marking to that color
markingToAdd.SetColor(markingColor);
// otherwise, add it to the final list.
newMarkings.Add(markingToAdd);
lastMarking = protoToAdd;
}
}
}
}
// at the end of all that, we should have new values for each of these, so we set the character appearance to these new values.
return new HumanoidCharacterAppearance(newHairStyle, newHairColor, newFacialHairStyle, newHairColor, newEyeColor, newSkinColor, newMarkings);
// helper functions:
float RandomizeColor(float channel)
{
return MathHelper.Clamp01(channel + random.Next(-25, 25) / 100f);
}
List<Color> GetComplementaryColors(Color color, double angle)
{
var hsl = Color.ToHsl(color);
var hVal = hsl.X + angle;
hVal = hVal >= 0.360 ? hVal - 0.360 : hVal;
var positiveHSL = new Vector4((float)hVal, hsl.Y, hsl.Z, hsl.W);
var hVal1 = hsl.X - angle;
hVal1 = hVal1 <= 0 ? hVal1 + 0.360 : hVal1;
var negativeHSL = new Vector4((float)hVal1, hsl.Y, hsl.Z, hsl.W);
var c0 = Color.FromHsl(positiveHSL);
var c1 = Color.FromHsl(negativeHSL);
var palette = new List<Color> { color, c0, c1 };
return palette;
}
// return a list of triadic complementary colors
List<Color> GetTriadicComplementaries(Color color)
{
return GetComplementaryColors(color, 0.120);
}
// return a list of split complementary colors
List<Color> GetSplitComplementaries(Color color)
{
return GetComplementaryColors(color, 0.150);
}
// return a list containing the base color and two copies of a single complemenary color
List<Color> GetOneComplementary(Color color)
{
return GetComplementaryColors(color, 0.180);
}
Color SquashToSkinLuminosity(Color skinColor, Color toSquash)
{
var skinColorHSL = Color.ToHsl(skinColor);
var toSquashHSL = Color.ToHsl(toSquash);
// check if the skin color is as dark as or darker than the marking color:
if (toSquashHSL.Z <= skinColorHSL.Z)
{
// if it is, don't fuck with it
return toSquash;
}
// otherwise, create a new color with the H, S, and A of toSquash, but the L of skinColor
var newColor = new Vector4(toSquashHSL.X, toSquashHSL.Y, skinColorHSL.Z, toSquashHSL.W);
return Color.FromHsl(newColor);
}
}
public static Color ClampColor(Color color)

View file

@ -215,7 +215,10 @@ namespace Content.Shared.Interaction
/// </summary>
private void OnRemoveAttempt(EntityUid uid, UnremoveableComponent item, ContainerGettingRemovedAttemptEvent args)
{
args.Cancel();
// don't prevent the server state for the container from being applied to the client correctly
// otherwise this will cause an error if the client predicts adding UnremoveableComponent
if (!_gameTiming.ApplyingState)
args.Cancel();
}
/// <summary>

View file

@ -96,6 +96,11 @@ public abstract class SharedConveyorController : VirtualController
{
var other = contact.OtherEnt(conveyorUid);
if (contact.OtherFixture(conveyorUid).Item2.Hard && contact.OtherBody(conveyorUid).BodyType != BodyType.Static)
{
EnsureComp<ConveyedComponent>(other);
}
if (_conveyedQuery.HasComp(other))
{
PhysicsSystem.WakeBody(other);
@ -155,7 +160,9 @@ public abstract class SharedConveyorController : VirtualController
// they'll go too slow.
if (!_mover.UsedMobMovement.TryGetValue(ent.Entity.Owner, out var usedMob) || !usedMob)
{
_mover.Friction(0f, frameTime: frameTime, friction: 5f, ref velocity);
// We provide a small minimum friction speed as well for those times where the friction would stop large objects
// snagged on corners from sliding into the centerline.
_mover.Friction(0.2f, frameTime: frameTime, friction: 5f, ref velocity);
}
SharedMoverController.Accelerate(ref velocity, targetDir, 20f, frameTime);
@ -318,7 +325,9 @@ public abstract class SharedConveyorController : VirtualController
var p = direction * (Vector2.Dot(itemRelative, direction) / Vector2.Dot(direction, direction));
var r = itemRelative - p;
if (r.Length() < 0.1)
// 0.01 is considered close enough to the centerline that (most) large objects shouldn't
// snag on walls next to the conveyor, without smaller entities repeatedly overshooting.
if (r.Length() < 0.01)
{
var velocity = direction * speed;
return velocity;
@ -328,7 +337,10 @@ public abstract class SharedConveyorController : VirtualController
// Give a slight nudge in the direction of the conveyor to prevent
// to collidable objects (e.g. crates) on the locker from getting stuck
// pushing each other when rounding a corner.
var velocity = (r + direction).Normalized() * speed;
// The direction of the conveyorbelt is de-emphasized to ensure offset objects primarily push centerwards,
// to prevent large items getting snagged on corner turns.
// 0.2f seems like a good compromise between forwards and sideways movement.
var velocity = (r + direction * 0.2f).Normalized() * speed;
return velocity;
}
}
@ -382,7 +394,7 @@ public abstract class SharedConveyorController : VirtualController
var other = contact.OtherEnt(ent.Owner);
if (_conveyorQuery.HasComp(other))
if (_conveyorQuery.TryComp(other, out var comp) && CanRun(comp))
return true;
}

View file

@ -0,0 +1,18 @@
using Robust.Shared.GameStates;
using Robust.Shared.Utility;
namespace Content.Shared.RetractableItemAction;
/// <summary>
/// Component used as a marker for items summoned by the RetractableItemAction system.
/// Used for keeping track of items summoned by said action.
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(RetractableItemActionSystem))]
public sealed partial class ActionRetractableItemComponent : Component
{
/// <summary>
/// The action that marked this item.
/// </summary>
[DataField, AutoNetworkedField]
public EntityUid? SummoningAction;
}

View file

@ -0,0 +1,9 @@
using Content.Shared.Actions;
namespace Content.Shared.RetractableItemAction;
/// <summary>
/// Raised when using the RetractableItem action.
/// </summary>
[ByRefEvent]
public sealed partial class OnRetractableItemActionEvent : InstantActionEvent;

View file

@ -0,0 +1,41 @@
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
namespace Content.Shared.RetractableItemAction;
/// <summary>
/// Used for storing an unremovable item within an action and summoning it into your hand on use.
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(RetractableItemActionSystem))]
public sealed partial class RetractableItemActionComponent : Component
{
/// <summary>
/// The item that will appear be spawned by the action.
/// </summary>
[DataField(required: true)]
public EntProtoId SpawnedPrototype;
/// <summary>
/// Sound collection to play when the item is summoned.
/// </summary>
[DataField]
public SoundCollectionSpecifier? SummonSounds;
/// <summary>
/// Sound collection to play when the summoned item is retracted back into the action.
/// </summary>
[DataField]
public SoundCollectionSpecifier? RetractSounds;
/// <summary>
/// The item managed by the action. Will be summoned and hidden as the action is used.
/// </summary>
[DataField, AutoNetworkedField]
public EntityUid? ActionItemUid;
/// <summary>
/// The container ID used to store the item.
/// </summary>
public const string ContainerId = "item-action-item-container";
}

View file

@ -0,0 +1,105 @@
using Content.Shared.Actions;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Interaction.Components;
using Content.Shared.Popups;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Containers;
namespace Content.Shared.RetractableItemAction;
/// <summary>
/// System for handling retractable items, such as armblades.
/// </summary>
public sealed class RetractableItemActionSystem : EntitySystem
{
[Dependency] private readonly SharedHandsSystem _hands = default!;
[Dependency] private readonly SharedContainerSystem _containers = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedActionsSystem _actions = default!;
[Dependency] private readonly SharedPopupSystem _popups = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<RetractableItemActionComponent, MapInitEvent>(OnActionInit);
SubscribeLocalEvent<RetractableItemActionComponent, OnRetractableItemActionEvent>(OnRetractableItemAction);
SubscribeLocalEvent<ActionRetractableItemComponent, ComponentShutdown>(OnActionSummonedShutdown);
}
private void OnActionInit(Entity<RetractableItemActionComponent> ent, ref MapInitEvent args)
{
_containers.EnsureContainer<Container>(ent, RetractableItemActionComponent.ContainerId);
PopulateActionItem(ent.Owner);
}
private void OnRetractableItemAction(Entity<RetractableItemActionComponent> ent, ref OnRetractableItemActionEvent args)
{
if (_hands.GetActiveHand(args.Performer) is not { } userHand)
return;
if (_actions.GetAction(ent.Owner) is not { } action)
return;
if (action.Comp.AttachedEntity == null)
return;
if (ent.Comp.ActionItemUid == null)
return;
// Don't allow to summon an item if holding an unremoveable item unless that item is summoned by the action.
if (userHand.HeldEntity != null && !_hands.IsHolding(args.Performer, ent.Comp.ActionItemUid) && !_hands.CanDropHeld(args.Performer, userHand, false))
{
_popups.PopupClient(Loc.GetString("retractable-item-hand-cannot-drop"), args.Performer, args.Performer);
return;
}
if (_hands.IsHolding(args.Performer, ent.Comp.ActionItemUid))
{
RemComp<UnremoveableComponent>(ent.Comp.ActionItemUid.Value);
var container = _containers.GetContainer(ent, RetractableItemActionComponent.ContainerId);
_containers.Insert(ent.Comp.ActionItemUid.Value, container);
_audio.PlayPredicted(ent.Comp.RetractSounds, action.Comp.AttachedEntity.Value, action.Comp.AttachedEntity.Value);
}
else
{
_hands.TryForcePickup(args.Performer, ent.Comp.ActionItemUid.Value, userHand, checkActionBlocker: false);
_audio.PlayPredicted(ent.Comp.SummonSounds, action.Comp.AttachedEntity.Value, action.Comp.AttachedEntity.Value);
EnsureComp<UnremoveableComponent>(ent.Comp.ActionItemUid.Value);
}
args.Handled = true;
}
private void OnActionSummonedShutdown(Entity<ActionRetractableItemComponent> ent, ref ComponentShutdown args)
{
if (_actions.GetAction(ent.Comp.SummoningAction) is not { } action)
return;
if (!TryComp<RetractableItemActionComponent>(action, out var retract) || retract.ActionItemUid != ent.Owner)
return;
// If the item is somehow destroyed, re-add it to the action.
PopulateActionItem(action.Owner);
}
private void PopulateActionItem(Entity<RetractableItemActionComponent?> ent)
{
if (!Resolve(ent.Owner, ref ent.Comp, false) || TerminatingOrDeleted(ent))
return;
if (!PredictedTrySpawnInContainer(ent.Comp.SpawnedPrototype, ent.Owner, RetractableItemActionComponent.ContainerId, out var summoned))
return;
ent.Comp.ActionItemUid = summoned.Value;
// Mark the unremovable item so it can be added back into the action.
var summonedComp = AddComp<ActionRetractableItemComponent>(summoned.Value);
summonedComp.SummoningAction = ent.Owner;
Dirty(summoned.Value, summonedComp);
Dirty(ent);
}
}

View file

@ -1,45 +1,4 @@
Entries:
- author: K-Dynamic
changes:
- message: Neutralised anomaly infections now drop inert cores.
type: Tweak
id: 8162
time: '2025-04-13T14:24:11.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36503
- author: ScarKy0
changes:
- message: Oxygen, Carbon Dioxide, Nitrous Oxide and Frezon can now metabolize when
digested/injected.
type: Tweak
id: 8163
time: '2025-04-13T15:21:55.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/31648
- author: ArchRBX
changes:
- message: Handheld GPS's can now be examined to read their displays
type: Add
- message: Handheld GPS's now update their displays much more frequently
type: Tweak
id: 8164
time: '2025-04-13T15:29:13.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/31814
- author: Beck Thompson, Kaz Wooblie
changes:
- message: Computers now wont delete items inside of them when deconstructing.
type: Fix
- message: The ID card computer now throws the IDs out when deconstructed or damaged!
type: Add
id: 8165
time: '2025-04-13T15:51:35.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/32308
- author: ElectroJr
changes:
- message: Fixed a bug that allowed dead or incapacitated people to potentially
interact with some UIs.
type: Fix
id: 8166
time: '2025-04-13T16:09:56.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36480
- author: K-Dynamic
changes:
- message: Stinger grenades no longer flash on detonation.
@ -3908,3 +3867,38 @@
id: 8674
time: '2025-06-14T17:22:45.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36659
- author: ScarKy0
changes:
- message: Using glue on an unremoveable item will no longer make it removeable.
type: Fix
id: 8675
time: '2025-06-14T18:29:06.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/38150
- author: FungiFellow
changes:
- message: Syndie-Cats now have Syndicate ID access.
type: Fix
id: 8676
time: '2025-06-15T08:27:32.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/38318
- author: SlamBamActionman
changes:
- message: Crates on conveyor belts can now go around tight corners again!
type: Fix
id: 8677
time: '2025-06-15T09:36:18.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37466
- author: SlamBamActionman
changes:
- message: A new station, Exo, has been added to the map pool.
type: Add
id: 8678
time: '2025-06-15T19:10:22.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33144
- author: widgetbeck
changes:
- message: Randomized characters will now roll markings.
type: Add
id: 8679
time: '2025-06-15T21:11:52.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/34765

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
flash-protection = It provides protection from [color=lightblue]bright flashes[/color].

View file

@ -157,6 +157,7 @@ stack-steel-light-checker-tile = steel light checker tile
stack-steel-tile = steel tile
stack-wood-floor = wood floor
stack-techmaint-floor = techmaint floor
stack-techmaint-floor-dark = dark techmaint floor
stack-freezer-tile = freezer tile
stack-showroom-tile = showroom tile
stack-green-circuit-floor = green-circuit floor
@ -230,3 +231,8 @@ stack-astro-snow-floor = astro-snow floor
stack-large-wood-floor = large wood floor
stack-red-circuit-floor = red-circuit floor
stack-asteroid-astro-sand-floor = asteroid astro-sand floor
stack-xeno-floor = xeno floor
stack-xeno-steel = xeno steel tile
stack-xeno-steel-corner = xeno steel corner tile
stack-xeno-maint = xeno techmaint
stack-dark-squiggly = dark steel squiggly tile

View file

@ -36,6 +36,7 @@ tiles-dark-floor-herringbone = dark steel herringbone
tiles-dark-floor-diagonal-mini = dark steel diagonal mini-tile
tiles-plastic-dark-floor = dark plastic tile
tiles-techmaint-floor = techmaint floor
tiles-techmaint-floor-dark = dark techmaint floor
tiles-reinforced-floor = reinforced floor
tiles-super-reinforced-floor = hardened reinforced floor
tiles-mono-floor = mono floor
@ -133,7 +134,8 @@ tiles-astro-snow = astro-snow
tiles-astro-asteroid-sand = asteroid astro-sand
tiles-astro-asteroid-sand-borderless = borderless asteroid astro-sand
tiles-wood-large = large wood
tiles-techmaint-floor-dark = dark techmaint floor
tiles-xeno-floor = xeno floor
tiles-xeno-steel = xeno steel tile
tiles-xeno-steel-corner = xeno steel corner tile
tiles-xeno-maint = xeno techmaint
tiles-dark-squiggly = dark steel squiggly tile
tiles-dark-squiggly-vertical = dark steel vertical squiggly tile

View file

@ -0,0 +1 @@
retractable-item-hand-cannot-drop = Your hand is already occupied.

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

122695
Resources/Maps/exo.yml Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,27 @@
# abilities
- type: entity
parent: BaseAction
id: ActionRetractableItemArmBlade
name: Arm Blade
description: Shed your flesh and reform it into a fleshy blade.
components:
- type: Action
useDelay: 2
raiseOnAction: true
itemIconStyle: BigAction
icon:
sprite: Interface/Actions/changeling.rsi
state: armblade
- type: InstantAction
event: !type:OnRetractableItemActionEvent
- type: RetractableItemAction
spawnedPrototype: ArmBlade
summonSounds:
collection: gib # Placeholder
retractSounds:
collection: gib # Placeholder
# starting
- type: entity
parent: BaseAction

View file

@ -1,4 +1,4 @@
- type: decal
- type: decal
id: FullTileOverlayGreyscale
tags: ["station", "overlay"]
defaultCustomColor: true

View file

@ -56,6 +56,58 @@
- ReagentId: Water
Quantity: 5
- type: entity
parent: PuddleTemporary
id: PuddleBloodSmall
suffix: Blood (5u)
components:
- type: SolutionContainerManager
solutions:
puddle:
maxVol: 1000
reagents:
- ReagentId: Blood
Quantity: 5
- type: entity
parent: PuddleTemporary
id: PuddleBlood
suffix: Blood (30u)
components:
- type: SolutionContainerManager
solutions:
puddle:
maxVol: 1000
reagents:
- ReagentId: Blood
Quantity: 30
- type: entity
parent: PuddleTemporary
id: PuddleFluorosulfuricAcidSmall
suffix: FluorosulfuricAcid (5u)
components:
- type: SolutionContainerManager
solutions:
puddle:
maxVol: 1000
reagents:
- ReagentId: FluorosulfuricAcid
Quantity: 5
- type: entity
parent: PuddleTemporary
id: PuddleFluorosulfuricAcid
suffix: FluorosulfuricAcid (15u)
components:
- type: SolutionContainerManager
solutions:
puddle:
maxVol: 1000
reagents:
- ReagentId: FluorosulfuricAcid
Quantity: 15
- type: entity
id: PuddleWatermelon
parent: PuddleTemporary

View file

@ -3323,6 +3323,10 @@
- type: NpcFactionMember
factions:
- Syndicate
- type: Access
tags:
- NuclearOperative
- SyndicateAgent
- type: MeleeWeapon
altDisarm: false
angle: 0

View file

@ -514,3 +514,121 @@
parent: [MobXenoPraetorian, XenoGhostRole]
id: MobXenoPraetorianGhostRole
suffix: GhostRole
# Mob mapped to Xeno Station that can not be ghostrole / pry
- type: entity
name: lone praetorian
description: The last of its kind.
parent: SimpleSpaceMobBase
id: MobXenoLonePraetorianNoGhost
components:
- type: Insulated
- type: CombatMode
- type: InputMover
- type: MobMover
- type: HTN
rootTask:
task: XenoCompound
blackboard:
NavClimb: !type:Bool
true
NavInteract: !type:Bool
true
NavPry: !type:Bool
true
NavSmash: !type:Bool
true
- type: Reactive
groups:
Flammable: [Touch]
Extinguish: [Touch]
- type: NpcFactionMember
factions:
- Xeno
- type: Hands
- type: ComplexInteraction
- type: MobState
- type: Stamina
critThreshold: 200
- type: Bloodstream
bloodReagent: FluorosulfuricAcid
bloodMaxVolume: 300
- type: MeleeWeapon
altDisarm: false
angle: 0
soundHit:
collection: AlienClaw
animation: WeaponArcBite
damage:
groups:
Brute: 5
- type: DamageStateVisuals
rotate: true
states:
Alive:
Base: running
Critical:
Base: crit
Dead:
Base: dead
- type: Puller
- type: Butcherable
butcheringType: Spike
spawned:
- id: FoodMeatXeno
amount: 5
- type: TypingIndicator
proto: alien
- type: Temperature
heatDamageThreshold: 360
coldDamageThreshold: -150
currentTemperature: 310.15
- type: NoSlip
- type: Perishable #Ummmm the acid kills a lot of the bacteria or something
molsPerSecondPerUnitMass: 0.0005
- type: Speech
speechVerb: LargeMob
- type: Sprite
drawdepth: Mobs
sprite: Mobs/Aliens/Xenos/praetorian.rsi
offset: 0,0.4
layers:
- map: ["enum.DamageStateVisualLayers.Base"]
state: running
- type: MobThresholds
thresholds:
0: Alive
-1: Critical
250: Dead
- type: SlowOnDamage
speedModifierThresholds:
120: 0.7
- type: MovementSpeedModifier
baseSprintSpeed: 3.7
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeCircle
radius: 0.45
density: 15500
mask:
- MobMask
layer:
- MobLayer
- type: Tag
tags:
- CannotSuicide
- type: SolutionContainerManager # Being hit speeds you up so you can escape
solutions:
bite:
reagents:
- ReagentId: Stimulants
Quantity: 50
- ReagentId: TranexamicAcid
Quantity: 50
- type: MeleeChemicalInjector
transferAmount: 1
solution: bite
pierceArmor: true

View file

@ -525,6 +525,22 @@
- type: Stack
stackType: FloorTileTechmaint
- type: entity
parent: FloorTileItemBase
id: FloorTileItemTechmaintDark
name: dark techmaint floor
components:
- type: Sprite
state: techfloordark
- type: Item
heldPrefix: dark
- type: FloorTile
outputs:
- Plating
- FloorTechMaintDark
- type: Stack
stackType: FloorTileTechmaintDark
# TODO add a catwalk tile item once tile smoothing is supported
- type: entity
@ -1609,3 +1625,81 @@
- type: Construction
graph: TileWoodLarge
node: woodtilelarge
- type: entity
id: FloorTileItemXeno
parent: FloorTileItemBase
name: xeno floor
components:
- type: Sprite
state: xenofloor
- type: Item
heldPrefix: steel
- type: FloorTile
outputs:
- Plating
- FloorXeno
- type: Stack
stackType: FloorTileXeno
- type: entity
id: FloorTileItemXenoSteel
parent: FloorTileItemBase
name: xeno steel floor
components:
- type: Sprite
state: xeno-steel
- type: Item
heldPrefix: steel
- type: FloorTile
outputs:
- Plating
- FloorXenoSteel
- type: Stack
stackType: FloorTileXenoSteel
- type: entity
id: FloorTileItemXenoSteelCorner
parent: FloorTileItemBase
name: xeno steel corner floor
components:
- type: Sprite
state: xeno-steel-corner
- type: Item
heldPrefix: steel
- type: FloorTile
outputs:
- Plating
- FloorXenoSteelCorner
- type: Stack
stackType: FloorTileXenoSteelCorner
- type: entity
name: xeno techmaint
parent: FloorTileItemBase
id: FloorTileItemXenoMaint
components:
- type: Sprite
state: xeno-techmaint
- type: Item
heldPrefix: dark
- type: FloorTile
outputs:
- Plating
- FloorXenoMaint
- type: Stack
stackType: FloorTileXenoMaint
- type: entity
parent: FloorTileItemDark
id: FloorTileItemDarkSquiggly
name: dark steel squiggly tile
components:
- type: Sprite
state: dark-squiggly
- type: FloorTile
outputs:
- Plating
- FloorDarkSquiggly
- type: Stack
stackType: FloorTileDarkSquiggly

View file

@ -76,3 +76,19 @@
- state: tip
map: [ "enum.AmmoVisualLayers.Tip" ]
color: "#65fe08"
- type: entity
id: CartridgePistolSpent
name: cartridge (.35 auto)
suffix: spent
parent: BaseCartridgePistol
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Ammunition/Casings/ammo_casing.rsi
layers:
- state: base-spent
map: [ "enum.AmmoVisualLayers.Base" ]
- type: SpentAmmoVisuals
- type: CartridgeAmmo
proto: BulletPistol
spent: true

View file

@ -2,7 +2,7 @@
name: arm blade
parent: BaseItem
id: ArmBlade
description: A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter.
description: A grotesque blade made out of bone and flesh that can pry open doors and cleaves through people as a hot knife through butter.
components:
- type: Sharp
- type: Execution
@ -11,13 +11,18 @@
sprite: Objects/Weapons/Melee/armblade.rsi
state: icon
- type: MeleeWeapon
soundHit:
collection: AlienClaw
wideAnimationRotation: 90
attackRate: 0.75
attackRate: 1
damage:
types:
Slash: 25
types: # Same as energy sword, but slash/pierce instead of slash/heat
Slash: 15
Piercing: 15
Structural: 20
- type: Item
size: Normal
sprite: Objects/Weapons/Melee/armblade.rsi
- type: Prying
speedModifier: 1.5 # Jaws of life speed
pryPowered: true

View file

@ -607,6 +607,17 @@
containers:
board: [ DoorElectronicsChapel ]
- type: entity
parent: AirlockStandardGlass
id: AirlockChapelStandardGlassLocked
suffix: Chapel, Locked
components:
- type: ContainerFill
containers:
board: [ DoorElectronicsChapel ]
- type: Wires
layoutId: AirlockService
- type: entity
parent: AirlockEngineeringGlass
id: AirlockEngineeringGlassLocked
@ -869,6 +880,15 @@
containers:
board: [ DoorElectronicsMaintenance ]
- type: entity
parent: AirlockXeno
id: AirlockXenoMaintLocked
suffix: Maintenance, Locked
components:
- type: ContainerFill
containers:
board: [ DoorElectronicsMaintenance ]
- type: entity
parent: AirlockMaintGlass
id: AirlockMaintGlassLocked

View file

@ -330,3 +330,33 @@
components:
- type: Sprite
sprite: Structures/Doors/Airlocks/Glass/centcomm.rsi
- type: entity
parent: AirlockGlass
id: AirlockStandardGlass
suffix: Service
components:
- type: Sprite
sprite: Structures/Doors/Airlocks/Glass/basic.rsi
- type: entity
parent: Airlock
id: AirlockXeno
suffix: Xeno
components:
- type: Sprite
sprite: Structures/Doors/Airlocks/Standard/xeno.rsi
- type: IconSmooth
key: chitin
mode: NoSprite
- type: entity
parent: AirlockGlass
id: AirlockGlassXeno
suffix: Xeno
components:
- type: Sprite
sprite: Structures/Doors/Airlocks/Glass/xeno.rsi
- type: IconSmooth
key: chitin
mode: NoSprite

View file

@ -109,3 +109,88 @@
node: frame1
placement:
mode: SnapgridCenter
- type: entity
parent: BlastDoor
id: BlastDoorXeno
name: xeno blast door
description: Don't lose an arm!
components:
- type: Sprite
sprite: Structures/Doors/Shutters/xeno_blastdoor.rsi
layers:
- state: closed
map: ["enum.DoorVisualLayers.Base"]
- type: Door
closeTimeOne: 0.4
closeTimeTwo: 0.7
openTimeOne: 0.4
openTimeTwo: 0.7
openingAnimationTime: 1.1
closingAnimationTime: 1.0
canPry: false
crushDamage:
types:
Blunt: 25 # yowch
- type: IconSmooth
key: chitin
mode: NoSprite
- type: entity
parent: BlastDoorXeno
id: BlastDoorXenoOpen
suffix: Open
components:
- type: Door
state: Open
- type: Occluder
enabled: false
- type: Physics
canCollide: false
- type: Airtight
airBlocked: false
- type: RadiationBlocker
enabled: false
- type: entity
parent: BaseStructureDynamic
id: BlastDoorXenoFrame
name: xeno blast door frame
description: This one says 'BLAST DONGER'.
components:
- type: Sprite
sprite: Structures/Doors/Shutters/xeno_blastdoor.rsi
state: assembly
- type: InteractionOutline
- type: Damageable
damageContainer: StructuralInorganic
damageModifierSet: StructuralMetallicStrong
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 300
behaviors:
- !type:DoActsBehavior
acts: ["Destruction"]
- type: Physics
bodyType: Static
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeAabb
bounds: "-0.45,-0.45,0.45,0.45"
density: 55
mask:
- Impassable
- HighImpassable
layer:
- HighImpassable
- type: Transform
noRot: true
- type: Construction
graph: BlastDoor
node: frame1
placement:
mode: SnapgridCenter

View file

@ -619,6 +619,31 @@
footstepSoundCollection:
collection: FootstepCarpet
- type: entity
parent: TableBase
id: TableXeno
name: xeno table
description: I wouldn't put the silverware on it.
components:
- type: Sprite
sprite: Structures/Furniture/Tables/xeno.rsi
- type: Icon
sprite: Structures/Furniture/Tables/xeno.rsi
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 50
behaviors:
- !type:PlaySoundBehavior
sound:
collection: gib
- !type:DoActsBehavior
acts: [ "Destruction" ]
- type: FootstepModifier
footstepSoundCollection:
collection: FootstepFloor
# Fancy tables
- type: entity

View file

@ -457,3 +457,11 @@
- "0.2,0"
size: 200
# Sunrise-End
- type: entity
parent: StoolBase
id: ChairXeno
name: xeno chair
components:
- type: Sprite
state: xeno-chair

View file

@ -1,4 +1,4 @@
- type: entity
- type: entity
parent: [BaseStructure, ConstructibleMachine] # Not a BaseMachinePowered since we don't want the anchorable component
id: CryoPod
name: cryo pod
@ -115,3 +115,47 @@
- type: GuideHelp
guides:
- Cryogenics
- type: entity
parent: BaseStructure
id: CryoPodDestroyed
name: destroyed cryo pod
description: A cryo pod that has seen better days. It's entirely inoperable; not good for anything but scrap.
components:
- type: Sprite
sprite: Structures/Machines/Medical/cryopod.rsi
drawdepth: Mobs
noRot: true
offset: 0, 0.5
state: pod-cracked
- type: Transform
noRot: true
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeAabb
bounds: "-0.5,-0.5,0.5,0.90"
density: 200
mask:
- MachineMask
layer:
- MachineLayer
- type: Damageable
damageContainer: StructuralInorganic
damageModifierSet: StructuralMetallic
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 100
behaviors:
- !type:PlaySoundBehavior
sound:
collection: WindowShatter
- !type:DoActsBehavior
acts: [ "Destruction" ]
- type: PhysicalComposition
materialComposition:
Steel: 2000 # 20 sheets
Glass: 1000 # 10 sheets

View file

@ -360,3 +360,59 @@
count: 5
- type: Machine
board: ShuttleGunKineticCircuitboard
- type: entity
parent: ShuttleGunBase
id: ShuttleGunKineticOld
name: xenomorphic dematerializer
description: An ancient ship gun, utilizing biomechanical systems to store and release energy. While unique in its design, it has been rendered obsolete due to its inferior charging and firing speed compared to mechanical constructions.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Shuttles/xeno.rsi
layers:
- state: rail
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 100
behaviors:
- !type:PlaySoundBehavior
sound:
collection: MetalBreak
- !type:DoActsBehavior
acts: ["Destruction"]
- type: Gun
projectileSpeed: 20
fireRate: 0.2
selectedMode: SemiAuto
angleDecay: 45
minAngle: 5
maxAngle: 15
availableModes:
- SemiAuto
soundGunshot:
path: /Audio/Weapons/Guns/Gunshots/kinetic_accel.ogg
params:
variation: 0.12
- type: RechargeBasicEntityAmmo
rechargeCooldown: 35
rechargeSound:
path: /Audio/Weapons/Guns/Bolt/lmg_bolt_closed.ogg
params:
pitch: 1.2
variation: 0.08
- type: BasicEntityAmmoProvider
proto: BulletKineticShuttle
capacity: 3
count: 3
- type: DeviceLinkSink
ports:
- Trigger
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeAabb
bounds: "-0.45,-0.45,0.45,0.45"
density: 1800

View file

@ -239,3 +239,47 @@
map: ["enum.ThrusterVisualLayers.ThrustingUnshaded"]
shader: unshaded
visible: false
- type: entity
id: RustedThruster
parent: BaseStructureDynamic
name: rusted thruster
description: An unrepairable thruster, broken down from wear and tear. Only useful for scrapping.
components:
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeAabb
bounds: "-0.45,-0.45,0.45,0.45"
density: 60
mask:
- MachineMask
layer:
- MachineLayer
- type: Transform
anchored: true
- type: Physics
bodyType: Static
- type: Rotatable
rotateWhileAnchored: true
- type: Sprite
sprite: Structures/Shuttles/old_thruster.rsi
state: base
- type: Damageable
damageContainer: Inorganic
damageModifierSet: Electronic
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 100 # Considering we need a lot of thrusters didn't want to make an individual one too tanky
behaviors:
- !type:DoActsBehavior
acts: ["Destruction"]
- !type:PlaySoundBehavior
sound:
collection: MetalBreak
- type: PhysicalComposition
materialComposition:
Steel: 1200 # 12 sheets

View file

@ -157,7 +157,7 @@
description: An alien air alarm. Hopefully they didn't breathe poison.
components:
- type: Sprite
sprite: _Sunrise/Structures/Wallmounts/air_monitors_xeno.rsi
sprite: Structures/Wallmounts/air_monitors_xeno.rsi
layers:
- state: alarm0
map: ["airAlarmBase"] # TODO: fire alarm enum
@ -172,7 +172,7 @@
description: An alien air alarm. Why are the wires pulsating?...
components:
- type: Sprite
sprite: _Sunrise/Structures/Wallmounts/air_monitors_xeno.rsi
sprite: Structures/Wallmounts/air_monitors_xeno.rsi
layers:
- state: alarm_b1
map: [ "enum.ConstructionVisuals.Layer" ]

View file

@ -142,7 +142,7 @@
mode: SnapgridCenter
snap:
- Wallmount
- type: entity
id: FireAlarmXeno
parent: FireAlarm
@ -150,14 +150,14 @@
description: An alien fire alarm. Works just the same!
components:
- type: Sprite
sprite: _Sunrise/Structures/Wallmounts/air_monitors_xeno.rsi
sprite: Structures/Wallmounts/air_monitors_xeno.rsi
layers:
- state: fire0
map: ["fireAlarmBase"]
- state: fire_off
map: ["fireAlarmState"]
- state: fire_b2
map: ["enum.WiresVisualLayers.MaintenancePanel"]
map: ["enum.WiresVisualLayers.MaintenancePanel"]
- type: Construction
- type: entity
@ -167,7 +167,7 @@
description: An alien fire alarm assembly. Good luck with the wires.
components:
- type: Sprite
sprite: _Sunrise/Structures/Wallmounts/air_monitors_xeno.rsi
sprite: Structures/Wallmounts/air_monitors_xeno.rsi
layers:
- state: fire_b1
map: [ "enum.ConstructionVisuals.Layer" ]

View file

@ -1095,6 +1095,109 @@
- !type:DoActsBehavior
acts: ["Destruction"]
- type: entity
parent: BaseWall
id: WallSolidChitin
name: solid chitin
components:
- type: Tag
tags:
- Wall
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 400
behaviors:
- !type:DoActsBehavior
acts: ["Destruction"]
- !type:PlaySoundBehavior
sound:
collection: MetalSlam
- trigger:
!type:DamageTrigger
damage: 200
behaviors:
- !type:PlaySoundBehavior
sound:
collection: MetalSlam
- !type:ChangeConstructionNodeBehavior
node: girder
- !type:DoActsBehavior
acts: ["Destruction"]
- type: Sprite
sprite: Structures/Walls/xeno.rsi
- type: Icon
sprite: Structures/Walls/xeno.rsi
- type: IconSmooth
key: chitin
base: solid
- type: Construction
graph: Girder
node: wallChitin
- type: RCDDeconstructable
cost: 6
delay: 8
fx: EffectRCDDeconstruct8
- type: entity
parent: BaseWall
id: WallReinforcedChitin
name: reinforced chitin
components:
- type: Sprite
sprite: Structures/Walls/xeno.rsi
- type: Icon
sprite: Structures/Walls/xeno.rsi
state: rgeneric
- type: Damageable
damageContainer: StructuralInorganic
damageModifierSet: StructuralMetallicStrong
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 600
behaviors:
- !type:DoActsBehavior
acts: ["Destruction"]
- !type:PlaySoundBehavior
sound:
collection: MetalSlam
- trigger:
!type:DamageTrigger
damage: 400
behaviors:
- !type:PlaySoundBehavior
sound:
collection: MetalSlam
- !type:ChangeConstructionNodeBehavior
node: girder
- !type:DoActsBehavior
acts: ["Destruction"]
- type: Appearance
- type: GenericVisualizer
visuals:
enum.ReinforcedWallVisuals.DeconstructionStage:
ReinforcedWallVisualLayers.Deconstruction:
-1: { visible: false }
0: { state: reinf_construct-0, visible: true}
1: { state: reinf_construct-1, visible: true}
2: { state: reinf_construct-2, visible: true}
3: { state: reinf_construct-3, visible: true}
4: { state: reinf_construct-4, visible: true}
5: { state: reinf_construct-5, visible: true}
- type: StaticPrice
price: 250
- type: RadiationBlocker
resistance: 5
- type: IconSmooth
key: chitin
base: reinf_over
- type: Construction
graph: Girder
node: reinforcedWallChitin
- type: entity
parent: BaseWall
id: WallUranium

View file

@ -0,0 +1,58 @@
- type: entity
parent: Window
id: XenoResinWindow
name: resin window
description: Transparent and hardened, yet slightly sticky to the touch. Slightly stronger than a normal reinforced window.
components:
- type: Sprite
drawdepth: WallTops
sprite: Structures/Windows/xeno_resin.rsi
- type: Icon
sprite: Structures/Windows/xeno_resin.rsi
- type: Repairable
fuelCost: 10
doAfterDelay: 2
- type: Damageable
damageContainer: StructuralInorganic
damageModifierSet: RGlass
- type: RCDDeconstructable
cost: 6
delay: 6
fx: EffectRCDDeconstruct6
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 200 #excess damage (nuke?). avoid computational cost of spawning entities.
behaviors:
- !type:DoActsBehavior
acts: [ "Destruction" ]
- !type:PlaySoundBehavior
sound:
collection: WindowShatter
- trigger:
!type:DamageTrigger
damage: 100
behaviors:
- !type:PlaySoundBehavior
sound:
collection: WindowShatter
- !type:SpawnEntitiesBehavior
spawn:
ShardGlassReinforced:
min: 1
max: 2
- !type:DoActsBehavior
acts: [ "Destruction" ]
- type: IconSmooth
base: xwindow
- type: Construction
graph: Window
node: reinforcedWindow
- type: Appearance
- type: DamageVisuals
thresholds: [5, 10, 20]
damageDivisor: 4
trackAllDamage: true
damageOverlay:
sprite: Structures/Windows/cracks.rsi

View file

@ -2,3 +2,4 @@
id: DefaultMapPool
maps: # Sunrise edit - так как прототипы карт закомментированы, нужно и отсюда убрать
- Empty
- Exo

View file

@ -0,0 +1,66 @@
- type: gameMap
id: Exo
mapName: 'Exo'
mapPath: /Maps/exo.yml
minPlayers: 25
maxPlayers: 70
stations:
Exo:
stationProto: StandardNanotrasenStation
components:
- type: StationNameSetup
mapNameTemplate: 'Exomorph Vessel "Conquest" EXO-{1}'
nameGenerator:
!type:NanotrasenNameGenerator
prefixCreator: '14'
- type: StationEmergencyShuttle
emergencyShuttlePath: /Maps/Shuttles/emergency_exo.yml
- type: StationCargoShuttle
path: /Maps/Shuttles/cargo_exo.yml
- type: StationJobs
availableJobs:
#service
Captain: [ 1, 1 ]
HeadOfPersonnel: [ 1, 1 ]
Bartender: [ 2, 2 ]
Botanist: [ 2, 3 ]
Chef: [ 2, 2 ]
Janitor: [ 1, 2 ]
Chaplain: [ 1, 1 ]
Librarian: [ 1, 1 ]
ServiceWorker: [ 2, 2 ]
#engineering
ChiefEngineer: [ 1, 1 ]
AtmosphericTechnician: [ 3, 3 ]
StationEngineer: [ 4, 4 ]
TechnicalAssistant: [ 3, 3 ]
#medical
ChiefMedicalOfficer: [ 1, 1 ]
Chemist: [ 2, 2 ]
MedicalDoctor: [ 4, 4 ]
MedicalIntern: [ 3, 3 ]
Paramedic: [ 1, 1 ]
#science
ResearchDirector: [ 1, 1 ]
Scientist: [ 4, 4 ]
ResearchAssistant: [ 3, 3 ]
#security
HeadOfSecurity: [ 1, 1 ]
Warden: [ 1, 1 ]
SecurityOfficer: [ 4, 4 ]
Detective: [ 1, 1 ]
SecurityCadet: [ 4, 4 ]
Lawyer: [ 2, 2 ]
#supply
Quartermaster: [ 1, 1 ]
SalvageSpecialist: [ 3, 3 ]
CargoTechnician: [ 3, 3 ]
#civilian
Passenger: [ -1, -1 ]
Clown: [ 1, 1 ]
Mime: [ 1, 1 ]
Musician: [ 1, 1 ]
Reporter: [ 2, 2 ]
#silicon
StationAi: [ 1, 1 ]
Borg: [ 2, 2 ]

View file

@ -0,0 +1,40 @@
- type: parallax
id: ExoStation
layers:
- texture:
!type:ImageParallaxTextureSource
path: "/Textures/Parallaxes/space_map3.png"
slowness: 0.998046875
scale: "1, 1"
- texture:
!type:GeneratedParallaxTextureSource
id: "hq_wizard_stars"
configPath: "/Prototypes/Parallaxes/parallax_config_stars.toml"
slowness: 0.996625
- texture:
!type:GeneratedParallaxTextureSource
id: "hq_wizard_stars_dim"
configPath: "/Prototypes/Parallaxes/parallax_config_stars_dim.toml"
slowness: 0.989375
- texture:
!type:ImageParallaxTextureSource
path: "/Textures/Parallaxes/XenoParallaxNeb.png"
slowness: 0.967046875
scale: "1, 1"
- texture:
!type:GeneratedParallaxTextureSource
id: "hq_wizard_stars_faster"
configPath: "/Prototypes/Parallaxes/parallax_config_stars-2.toml"
slowness: 0.987265625
- texture:
!type:GeneratedParallaxTextureSource
id: "hq_wizard_stars_dim_faster"
configPath: "/Prototypes/Parallaxes/parallax_config_stars_dim-2.toml"
slowness: 0.984352
layersLQ:
- texture:
!type:GeneratedParallaxTextureSource
id: ""
configPath: "/Prototypes/Parallaxes/parallax_config.toml"
slowness: 0.875
layersLQUseHQ: false

View file

@ -12,6 +12,7 @@
- FloorTileItemDarkPavement
- FloorTileItemDarkPavementVertical
- FloorTileItemDarkOffset
- FloorTileItemDarkSquiggly
- FloorTileItemSteelCheckerDark
- FloorTileItemSteel
- FloorTileItemSteelOffset
@ -35,6 +36,7 @@
- FloorTileItemGratingMaint
- FloorTileItemTechmaint
- FloorTileItemSteelMaint
- FloorTileItemTechmaintDark
- FloorTileItemWood
- FloorTileItemWoodLarge
- FloorTileItemWoodPattern

View file

@ -161,6 +161,11 @@
id: FloorTileItemDarkOffset
result: FloorTileItemDarkOffset
- type: latheRecipe
parent: BaseDarkTileRecipe
id: FloorTileItemDarkSquiggly
result: FloorTileItemDarkSquiggly
# White steel tiles
- type: latheRecipe
parent: BaseWhiteTileRecipe

View file

@ -192,7 +192,7 @@
- type: stack
id: FloorTileTechmaintDark
name: dark-techmaint-floor # Sunrise edit
name: stack-techmaint-floor-dark
spawn: FloorTileItemTechmaintDark
maxCount: 30
@ -643,18 +643,30 @@
- type: stack
id: FloorTileXeno
name: xeno-floor # Sunrise edit
name: stack-xeno-floor
spawn: FloorTileItemXeno
maxCount: 30
- type: stack
id: FloorTileDarkSquiggly
name: dark-squiggly-floor # Sunrise edit
spawn: FloorTileItemDarkSquiggly
id: FloorTileXenoSteel
name: stack-xeno-steel
spawn: FloorTileItemXenoSteelCorner
maxCount: 30
- type: stack
id: FloorTileDarkSquigglyVertical
name: dark-squiggly-vertical-floor # Sunrise edit
spawn: FloorTileItemDarkSquigglyVertical
id: FloorTileXenoSteelCorner
name: stack-xeno-steel-corner
spawn: FloorTileItemXenoSteelCorner
maxCount: 30
- type: stack
id: FloorTileXenoMaint
name: stack-xeno-maint
spawn: FloorTileItemXenoSteelCorner
maxCount: 30
- type: stack
id: FloorTileDarkSquiggly
name: stack-dark-squiggly
spawn: FloorTileItemDarkSquiggly
maxCount: 30

View file

@ -2086,7 +2086,6 @@
footstepSounds:
collection: FootstepBlood
itemDrop: FloorTileItemXeno
friction: 0.05 #slippy
heatCapacity: 10000
- type: tile
@ -2098,20 +2097,22 @@
deconstructTools: [ Prying ]
footstepSounds:
collection: FootstepTile
itemDrop: FloorTileItemXeno
itemDrop: FloorTileItemXenoSteel
heatCapacity: 10000
allowRotationMirror: true
- type: tile
id: FloorXenoSteelHorizontal
name: tiles-xeno-steel-horizontal
sprite: /Textures/Tiles/xeno_steel_horizontal.png
id: FloorXenoSteelCorner
name: tiles-xeno-steel-corner
sprite: /Textures/Tiles/xeno_steel_corner.png
baseTurf: Plating
isSubfloor: false
deconstructTools: [ Prying ]
footstepSounds:
collection: FootstepTile
itemDrop: FloorTileItemXeno
itemDrop: FloorTileItemXenoSteelCorner
heatCapacity: 10000
allowRotationMirror: true
- type: tile
id: FloorDarkSquiggly
@ -2128,26 +2129,9 @@
deconstructTools: [ Prying ]
footstepSounds:
collection: FootstepFloor
itemDrop: FloorTileItemSteel
heatCapacity: 10000
- type: tile
id: FloorDarkSquigglyVertical
name: tiles-dark-squiggly-vertical
sprite: /Textures/Tiles/dark_squiggly_vertical.png
variants: 4
placementVariants:
- 1.0
- 1.0
- 1.0
- 1.0
baseTurf: Plating
isSubfloor: false
deconstructTools: [ Prying ]
footstepSounds:
collection: FootstepFloor
itemDrop: FloorTileItemSteel
itemDrop: FloorTileItemDarkSquiggly
heatCapacity: 10000
allowRotationMirror: true
- type: tile
id: FloorXenoMaint
@ -2158,5 +2142,5 @@
deconstructTools: [ Prying ]
footstepSounds:
collection: FootstepHull
itemDrop: FloorTileItemXeno
itemDrop: FloorTileItemXenoMaint
heatCapacity: 10000

Binary file not shown.

After

Width:  |  Height:  |  Size: 943 B

View file

@ -0,0 +1,14 @@
{
"version": 1,
"license": "CC0-1.0",
"copyright": "Created by TiniestShark (github)",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "armblade"
}
]
}

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -0,0 +1,14 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Created by SlamBamActionman (github) for Space Station 14",
"size": {
"x": 64,
"y": 64
},
"states": [
{
"name": "rail"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

View file

@ -27,3 +27,8 @@
license: "CC-BY-NC-SA-4.0"
copyright: "Drawn by Southbridge"
source: "https://github.com/space-wizards/space-station-14/blob/master/Resources/Textures/Parallaxes/debris_small.png"
- files: [ "space_map3.png", "XenoParallaxNeb.png" ]
license: "CC-BY-NC-SA-3.0"
copyright: "Made by SlamBamActionman"
source: "https://github.com/space-wizards/space-station-14/blob/master/Resources/Textures/Parallaxes/space_map3.png"

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -0,0 +1,152 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from cmss13 at https://github.com/cmss13-devs/cmss13/blob/af7813ee8c36f9195a88f3b3d018af2b8833cbea/icons/mob/xenos/effects.dmi and edited by SlamBamActionman at https://github.com/space-wizards/space-station-14/pull/33144",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "assembly"
},
{
"name": "bolted_unlit"
},
{
"name": "closed"
},
{
"name": "closed_unlit"
},
{
"name": "closing",
"delays": [
[
0.1,
0.1,
0.05,
0.05,
0.05,
0.05,
0.2
]
]
},
{
"name": "closing_unlit"
},
{
"name": "deny_unlit",
"delays": [
[
0.1,
0.1,
0.1,
0.1,
0.1,
0.1
]
]
},
{
"name": "open",
"delays": [
[
1
]
]
},
{
"name": "opening",
"delays": [
[
0.1,
0.1,
0.05,
0.05,
0.05,
0.05,
0.2
]
]
},
{
"name": "opening_unlit"
},
{
"name": "panel_closing"
},
{
"name": "panel_open"
},
{
"name": "panel_opening"
},
{
"name": "sparks",
"delays": [
[
0.1,
0.1,
0.1,
0.1,
0.1,
0.1
]
]
},
{
"name": "sparks_broken",
"delays": [
[
0.1,
0.1,
0.1,
0.1,
0.1,
0.1
]
]
},
{
"name": "sparks_damaged",
"delays": [
[
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
1.7
]
]
},
{
"name": "sparks_open",
"delays": [
[
0.1,
0.1,
0.1,
0.1,
0.1,
0.1
]
]
},
{
"name": "welded"
},
{
"name": "emergency_unlit",
"delays": [
[
0.4,
0.4
]
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -0,0 +1,150 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from cmss13 at https://github.com/cmss13-devs/cmss13/blob/af7813ee8c36f9195a88f3b3d018af2b8833cbea/icons/mob/xenos/effects.dmi and edited by SlamBamActionman at https://github.com/space-wizards/space-station-14/pull/33144",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "assembly"
},
{
"name": "bolted_unlit"
},
{
"name": "closed"
},
{
"name": "closed_unlit"
},
{
"name": "closing",
"delays": [
[
0.1,
0.1,
0.07,
0.07,
0.07,
0.2
]
]
},
{
"name": "closing_unlit"
},
{
"name": "deny_unlit",
"delays": [
[
0.1,
0.1,
0.1,
0.1,
0.1,
0.1
]
]
},
{
"name": "open",
"delays": [
[
1
]
]
},
{
"name": "opening",
"delays": [
[
0.1,
0.1,
0.07,
0.07,
0.07,
0.2
]
]
},
{
"name": "opening_unlit"
},
{
"name": "panel_closing"
},
{
"name": "panel_open"
},
{
"name": "panel_opening"
},
{
"name": "sparks",
"delays": [
[
0.1,
0.1,
0.1,
0.1,
0.1,
0.1
]
]
},
{
"name": "sparks_broken",
"delays": [
[
0.1,
0.1,
0.1,
0.1,
0.1,
0.1
]
]
},
{
"name": "sparks_damaged",
"delays": [
[
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
1.7
]
]
},
{
"name": "sparks_open",
"delays": [
[
0.1,
0.1,
0.1,
0.1,
0.1,
0.1
]
]
},
{
"name": "welded"
},
{
"name": "emergency_unlit",
"delays": [
[
0.4,
0.4
]
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

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