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
|
|
@ -74,7 +74,7 @@ namespace Content.IntegrationTests.Tests
|
|||
//"Elkridge",
|
||||
//"Relic",
|
||||
"dm01-entryway",
|
||||
|
||||
"Exo",
|
||||
};
|
||||
|
||||
// Sunrise-Start
|
||||
|
|
|
|||
|
|
@ -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 ||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
9
Content.Shared/RetractableItemAction/ItemActionEvents.cs
Normal 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;
|
||||
|
|
@ -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";
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
flash-protection = It provides protection from [color=lightblue]bright flashes[/color].
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
retractable-item-hand-cannot-drop = Your hand is already occupied.
|
||||
1375
Resources/Maps/Shuttles/cargo_exo.yml
Normal file
6702
Resources/Maps/Shuttles/emergency_exo.yml
Normal file
122695
Resources/Maps/exo.yml
Normal 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
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
- type: decal
|
||||
- type: decal
|
||||
id: FullTileOverlayGreyscale
|
||||
tags: ["station", "overlay"]
|
||||
defaultCustomColor: true
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -3323,6 +3323,10 @@
|
|||
- type: NpcFactionMember
|
||||
factions:
|
||||
- Syndicate
|
||||
- type: Access
|
||||
tags:
|
||||
- NuclearOperative
|
||||
- SyndicateAgent
|
||||
- type: MeleeWeapon
|
||||
altDisarm: false
|
||||
angle: 0
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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" ]
|
||||
|
|
|
|||
|
|
@ -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" ]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -2,3 +2,4 @@
|
|||
id: DefaultMapPool
|
||||
maps: # Sunrise edit - так как прототипы карт закомментированы, нужно и отсюда убрать
|
||||
- Empty
|
||||
- Exo
|
||||
|
|
|
|||
66
Resources/Prototypes/Maps/exo.yml
Normal 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 ]
|
||||
40
Resources/Prototypes/Parallaxes/exo.yml
Normal 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
|
||||
|
|
@ -12,6 +12,7 @@
|
|||
- FloorTileItemDarkPavement
|
||||
- FloorTileItemDarkPavementVertical
|
||||
- FloorTileItemDarkOffset
|
||||
- FloorTileItemDarkSquiggly
|
||||
- FloorTileItemSteelCheckerDark
|
||||
- FloorTileItemSteel
|
||||
- FloorTileItemSteelOffset
|
||||
|
|
@ -35,6 +36,7 @@
|
|||
- FloorTileItemGratingMaint
|
||||
- FloorTileItemTechmaint
|
||||
- FloorTileItemSteelMaint
|
||||
- FloorTileItemTechmaintDark
|
||||
- FloorTileItemWood
|
||||
- FloorTileItemWoodLarge
|
||||
- FloorTileItemWoodPattern
|
||||
|
|
|
|||
|
|
@ -161,6 +161,11 @@
|
|||
id: FloorTileItemDarkOffset
|
||||
result: FloorTileItemDarkOffset
|
||||
|
||||
- type: latheRecipe
|
||||
parent: BaseDarkTileRecipe
|
||||
id: FloorTileItemDarkSquiggly
|
||||
result: FloorTileItemDarkSquiggly
|
||||
|
||||
# White steel tiles
|
||||
- type: latheRecipe
|
||||
parent: BaseWhiteTileRecipe
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
BIN
Resources/Textures/Interface/Actions/changeling.rsi/armblade.png
Normal file
|
After Width: | Height: | Size: 943 B |
|
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC0-1.0",
|
||||
"copyright": "Created by TiniestShark (github)",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "armblade"
|
||||
}
|
||||
]
|
||||
}
|
||||
BIN
Resources/Textures/Objects/Tiles/tile.rsi/xeno-steel-corner.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
Resources/Textures/Objects/Tiles/tile.rsi/xeno-steel.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
Resources/Textures/Objects/Tiles/tile.rsi/xeno-techmaint.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 16 KiB |
BIN
Resources/Textures/Parallaxes/XenoParallaxNeb.png
Normal file
|
After Width: | Height: | Size: 2.4 MiB |
|
|
@ -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"
|
||||
|
|
|
|||
BIN
Resources/Textures/Parallaxes/space_map3.png
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
|
@ -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
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 183 B |
|
After Width: | Height: | Size: 184 B |
|
After Width: | Height: | Size: 175 B |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
|
@ -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
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 183 B |
|
After Width: | Height: | Size: 184 B |
|
After Width: | Height: | Size: 175 B |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 15 KiB |