Merge pull request #392 from MishaUnity/Android-Assemble

Обновление рободевочек
This commit is contained in:
MishaUnity
2026-05-29 02:23:29 +03:00
committed by GitHub
parent b8f5d6f7e4
commit 830c517ff1
69 changed files with 1742 additions and 787 deletions
@@ -47,5 +47,3 @@ public sealed class HumanoidMarkingModifierBoundUserInterface : BoundUserInterfa
SendMessage(new HumanoidMarkingModifierMarkingSetMessage(_markingsModel.Markings));
}
}
@@ -0,0 +1,8 @@
using Content.Shared._Wega.Android;
namespace Content.Client._Wega.Android;
public sealed class AndroidFrameSystem : SharedAndroidFrameSystem
{
}
@@ -0,0 +1,70 @@
using Content.Shared._Wega.Android;
using Content.Shared.Humanoid.Markings;
using Content.Shared.Preferences;
using JetBrains.Annotations;
using Robust.Client.UserInterface;
using Robust.Shared.Configuration;
using Robust.Shared.Prototypes;
namespace Content.Client._Wega.Android.Ui;
[UsedImplicitly]
public sealed class AndroidConstructBoundUserInterface : BoundUserInterface
{
[ViewVariables]
private AndroidConstructMenu? _menu;
[Dependency] private readonly IConfigurationManager _cfgManager = default!;
[Dependency] private readonly MarkingManager _markingManager = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
public HumanoidCharacterProfile Profile = new();
public AndroidConstructBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
{
}
protected override void Open()
{
base.Open();
_menu = this.CreateWindow<AndroidConstructMenu>();
_menu.OpenCentered();
_menu.ProfileChangedAction += OnProfileChanged;
_menu.AssembleAttemptAction += OnAssembleAttempt;
}
protected override void UpdateState(BoundUserInterfaceState state)
{
base.UpdateState(state);
if (_menu == null || state is not AndroidConstructUiState cast)
return;
Profile = cast.Profile;
_menu.LoadProfile(Profile, _cfgManager, _markingManager, _prototypeManager);
_menu.UpdateSlotsStatus(cast.HasBattery, cast.HasBrain);
}
private void OnAssembleAttempt()
{
SendMessage(new AndroidConstructAssembleMessage());
}
private void OnProfileChanged(HumanoidCharacterProfile profile, bool needReload)
{
if (_menu == null)
return;
Profile = profile;
if (needReload)
_menu.LoadProfile(Profile, _cfgManager, _markingManager, _prototypeManager);
else
_menu.UpdatePreview();
SendMessage(new AndroidConstructEditMessage(Profile));
}
}
@@ -0,0 +1,114 @@
<ui:AndroidConstructMenu
xmlns="https://spacestation14.io"
xmlns:ui="clr-namespace:Content.Client._Wega.Android.Ui"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
xmlns:humanoid="clr-namespace:Content.Client.Humanoid"
xmlns:profile="clr-namespace:Content.Client.Lobby.UI.ProfileEditorControls"
SetSize="740 700" MouseFilter="Stop">
<PanelContainer Name="Background" StyleClasses="PdaBackgroundRect" ModulateSelfOverride="#212124"/>
<PanelContainer Name="Border" StyleClasses="PdaBorderRect" Modulate="#2d3047"/>
<BoxContainer Orientation="Vertical" HorizontalExpand="True" VerticalExpand="True">
<!-- Header -->
<PanelContainer SetHeight="45" Margin="1" HorizontalExpand="True">
<PanelContainer.PanelOverride>
<gfx:StyleBoxFlat BackgroundColor="#3b3c4f"/>
</PanelContainer.PanelOverride>
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" VerticalExpand="True" Margin="5">
<TextureRect TexturePath="/Textures/Interface/Nano/ntlogo.svg.png" SetSize="28 28" Margin="10 0 10 0"/>
<Label Text="{Loc 'android-construct-ui-title'}" StyleClasses="ConsoleHeadingBig" HorizontalExpand="True" FontColorOverride="#ffffff"/>
<TextureButton Name="CloseButton" StyleClasses="windowCloseButton" Modulate="#8d92a5" VerticalAlignment="Center"/>
</BoxContainer>
</PanelContainer>
<!-- Markings -->
<PanelContainer Margin="10" HorizontalExpand="True" SetHeight="300">
<PanelContainer.PanelOverride>
<gfx:StyleBoxFlat BackgroundColor="#ffffff00" BorderColor="#767a8c" BorderThickness="3" />
</PanelContainer.PanelOverride>
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" VerticalExpand="True" Margin="10">
<humanoid:MarkingPicker Name="Markings" Access="Public" HorizontalExpand="True" VerticalExpand="True"/>
</BoxContainer>
</PanelContainer>
<PanelContainer Margin="10 5 10 15">
<PanelContainer.PanelOverride>
<gfx:StyleBoxFlat BorderColor="#767a8c" BorderThickness="1" />
</PanelContainer.PanelOverride>
</PanelContainer>
<!-- Info Block -->
<BoxContainer HorizontalExpand="True" Orientation="Horizontal" VerticalExpand="True">
<!-- Preview -->
<BoxContainer Orientation="Vertical">
<PanelContainer Margin="10 0 10 10">
<PanelContainer.PanelOverride>
<gfx:StyleBoxFlat BackgroundColor="#ffffff00" BorderColor="#767a8c" BorderThickness="3" />
</PanelContainer.PanelOverride>
<profile:ProfilePreviewSpriteView Name="SpritePreview" Access="Public" Scale="5 5" Margin="8" SizeFlagsStretchRatio="1" />
</PanelContainer>
</BoxContainer>
<BoxContainer Orientation="Vertical" HorizontalExpand="True" VerticalExpand="True">
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" Margin="5 0 10 0">
<!-- Name -->
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
<Label Text="{Loc 'android-construct-ui-name-label'}" />
<LineEdit Name="NameEdit" MinSize="160 0" VerticalAlignment="Center" Margin="5 0 0 0" />
</BoxContainer>
<!-- Sex -->
<BoxContainer HorizontalAlignment="Right">
<Label Text="{Loc 'android-construct-ui-sex-label'}" Margin="0 0 5 0"/>
<Control HorizontalExpand="True"/>
<OptionButton Name="SexButton" HorizontalAlignment="Right" />
</BoxContainer>
</BoxContainer>
<!-- Skin -->
<PanelContainer HorizontalExpand="True" Margin="0 10 10 10">
<PanelContainer.PanelOverride>
<gfx:StyleBoxFlat BackgroundColor="#2a2b2e"/>
</PanelContainer.PanelOverride>
<BoxContainer Margin="10" HorizontalExpand="True" Orientation="Vertical">
<Label Text="{Loc 'android-construct-ui-skin-color-label'}" Margin="0 0 0 10"/>
<BoxContainer Name="RgbSkinColorContainer" Orientation="Vertical" HorizontalExpand="True"></BoxContainer>
</BoxContainer>
</PanelContainer>
</BoxContainer>
</BoxContainer>
<BoxContainer Orientation="Vertical" HorizontalExpand="True">
<!-- Slots Status -->
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" Margin="10">
<!-- Battery -->
<PanelContainer Margin="5" MinWidth="100" Name="BatteryStatusPanel">
<Label Text="{Loc 'android-construct-ui-battery-label-false'}" Margin="5" Name="BatteryStatusText"/>
</PanelContainer>
<!-- Brain -->
<PanelContainer Margin="5" MinWidth="100" Name="BrainStatusPanel">
<Label Text="{Loc 'android-construct-ui-brain-label-false'}" Margin="5" Name="BrainStatusText"/>
</PanelContainer>
</BoxContainer>
<!-- Assemble -->
<PanelContainer SetHeight="45" Margin="1" HorizontalExpand="True">
<PanelContainer.PanelOverride>
<gfx:StyleBoxFlat BackgroundColor="#3b3c4f"/>
</PanelContainer.PanelOverride>
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" VerticalExpand="True" Margin="5">
<Button Name="AssembleButton" Text="{Loc 'android-construct-ui-assemble-label'}" MinWidth="30" StyleClasses="ButtonViolet" Margin="0 0 5 0"/>
<Label Text="{Loc 'android-construct-ui-assemble-attention-label'}"/>
</BoxContainer>
</PanelContainer>
</BoxContainer>
</BoxContainer>
</ui:AndroidConstructMenu>
@@ -0,0 +1,163 @@
using Content.Client.Humanoid;
using Content.Shared.CCVar;
using Content.Shared.Humanoid;
using Content.Shared.Humanoid.Markings;
using Content.Shared.Preferences;
using Robust.Client.AutoGenerated;
using Robust.Client.Graphics;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Configuration;
using Robust.Shared.Prototypes;
using System.Numerics;
namespace Content.Client._Wega.Android.Ui;
[GenerateTypedNameReferences]
public sealed partial class AndroidConstructMenu : BaseWindow
{
public HumanoidCharacterProfile? Profile;
private MarkingsViewModel _markingsModel = new();
public event Action<HumanoidCharacterProfile, bool>? ProfileChangedAction;
public event Action? AssembleAttemptAction;
private ColorSelectorSliders _colorSelect;
private int _maxNameLength = 0;
public AndroidConstructMenu()
{
RobustXamlLoader.Load(this);
CloseButton.OnPressed += _ => Close();
AssembleButton.OnPressed += _ => OnAssembleButtonPressed();
Markings.SetModel(_markingsModel);
NameEdit.OnTextChanged += args => OnNameChanged(args.Text);
NameEdit.IsValid = args => args.Length <= _maxNameLength;
SexButton.OnItemSelected += args => OnSexChanged((Sex)(args.Id));
RgbSkinColorContainer.AddChild(_colorSelect = new ColorSelectorSliders());
_colorSelect.SelectorType = ColorSelectorSliders.ColorSelectorType.Hsv;
_colorSelect.OnColorChanged += _ => OnSkinColorChanged();
_markingsModel.MarkingsChanged += (_, _) => OnMarkingsChanged();
UpdateSlotsStatus(false, false);
}
protected override DragMode GetDragModeFor(Vector2 relativeMousePos) => DragMode.Move;
public void LoadProfile(
HumanoidCharacterProfile profile,
IConfigurationManager cfgManager,
MarkingManager markingManager,
IPrototypeManager prototypeManager)
{
Profile = profile;
_markingsModel.OrganData = markingManager.GetMarkingData(Profile.Species);
_markingsModel.OrganProfileData = markingManager.GetProfileData(Profile.Species, Profile.Sex, Profile.Appearance.SkinColor, Profile.Appearance.EyeColor);
_markingsModel.Markings = Profile.Appearance.Markings;
_colorSelect.Color = Profile.Appearance.SkinColor;
_maxNameLength = cfgManager.GetCVar(CCVars.MaxNameLength);
NameEdit.Text = Profile.Name;
UpdateSexControls(prototypeManager);
UpdatePreview();
}
public void UpdateSlotsStatus(bool hasBattery, bool hasBrain)
{
var trueColor = Color.FromHex("#8fc032");
var falseColor = Color.FromHex("#d83a46");
BatteryStatusPanel.PanelOverride = new StyleBoxFlat { BackgroundColor = hasBattery ? trueColor : falseColor };
BatteryStatusText.Text = Loc.GetString("android-construct-ui-battery-label-" + hasBattery.ToString().ToLower());
BrainStatusPanel.PanelOverride = new StyleBoxFlat { BackgroundColor = hasBrain ? trueColor : falseColor };
BrainStatusText.Text = Loc.GetString("android-construct-ui-brain-label-" + hasBrain.ToString().ToLower());
}
private void OnNameChanged(string newName)
{
if (Profile == null)
return;
Profile = Profile.WithName(newName);
ProfileChangedAction?.Invoke(Profile, false);
}
private void OnSexChanged(Sex args)
{
if (Profile == null)
return;
SexButton.SelectId((int)args);
Profile = Profile.WithSex(args);
ProfileChangedAction?.Invoke(Profile, true);
}
private void UpdateSexControls(IPrototypeManager prototypeManager)
{
if (Profile == null)
return;
SexButton.Clear();
var sexes = new List<Sex>();
if (prototypeManager.Resolve(Profile.Species, out var speciesProto))
{
foreach (var sex in speciesProto.Sexes)
sexes.Add(sex);
}
else
sexes.Add(Sex.Unsexed);
foreach (var sex in sexes)
SexButton.AddItem(Loc.GetString($"humanoid-profile-editor-sex-{sex.ToString().ToLower()}-text"), (int)sex);
if (sexes.Contains(Profile.Sex))
SexButton.SelectId((int)Profile.Sex);
else
SexButton.SelectId((int)sexes[0]);
}
public void UpdatePreview()
{
if (Profile == null)
return;
SpritePreview.LoadPreview(Profile, null, false);
}
private void OnMarkingsChanged()
{
if (Profile == null)
return;
Profile.Appearance.Markings = _markingsModel.Markings;
ProfileChangedAction?.Invoke(Profile, false);
}
private void OnSkinColorChanged()
{
if (Profile == null)
return;
Profile.Appearance.SkinColor = _colorSelect.Color;
ProfileChangedAction?.Invoke(Profile, false);
}
private void OnAssembleButtonPressed()
{
AssembleAttemptAction?.Invoke();
}
}
@@ -0,0 +1,127 @@
using Content.Server.Body;
using Content.Shared._Wega.Android;
using Content.Shared.Body;
using Content.Shared.Body.Components;
using Content.Shared.Humanoid;
using Content.Shared.PowerCell.Components;
using Content.Shared.Preferences;
using Robust.Server.Containers;
using Robust.Shared.Prototypes;
using Robust.Shared.Enums;
using Content.Server.Popups;
using Robust.Server.Audio;
using Content.Shared.Corvax.TTS;
namespace Content.Server._Wega.Android;
public sealed partial class AndroidFrameSystem : SharedAndroidFrameSystem
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly ContainerSystem _container = default!;
[Dependency] private readonly HumanoidProfileSystem _humanoid = default!;
[Dependency] private readonly VisualBodySystem _visualBody = default!;
[Dependency] private readonly MetaDataSystem _metaData = default!;
[Dependency] private readonly NamingSystem _naming = default!;
[Dependency] private readonly PopupSystem _popup = default!;
[Dependency] private readonly AudioSystem _audio = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<AndroidFrameComponent, ComponentInit>(OnInit);
Subs.BuiEvents<AndroidFrameComponent>(AndroidConstructUiKey.Key, subs =>
{
subs.Event<AndroidConstructEditMessage>(OnEditUiMessage);
subs.Event<AndroidConstructAssembleMessage>(OnAssembleUiMessage);
});
}
private void OnInit(EntityUid uid, AndroidFrameComponent component, ComponentInit args)
{
if (!_prototypeManager.Resolve(component.Species, out var species))
return;
var profile = new HumanoidCharacterProfile();
profile.Species = component.Species;
profile.Appearance.SkinColor = species.DefaultSkinTone;
profile.Name = _naming.GetName(component.Species, profile.Gender);
component.Profile = profile;
Dirty(uid, component);
}
private void OnAssembleUiMessage(EntityUid uid, AndroidFrameComponent component, AndroidConstructAssembleMessage message)
{
if (!TryAssemble(uid, component))
_popup.PopupEntity(Loc.GetString("android-construct-assemble-error-popup"), uid, message.Actor);
}
private void OnEditUiMessage(EntityUid uid, AndroidFrameComponent component, AndroidConstructEditMessage message)
{
if (message.NewProfile.Species != component.Species)
return;
component.Profile = message.NewProfile;
Dirty(uid, component);
}
private bool TryAssemble(EntityUid uid, AndroidFrameComponent component)
{
if (!_prototypeManager.Resolve(component.Species, out var species) || component.Profile == null)
return false;
if (!TryGetFromSlot(uid, component.BatterySlot, out var battery) || !TryGetFromSlot(uid, component.BrainSlot, out var brain))
return false;
var profile = component.Profile;
switch (profile.Sex)
{
case Sex.Male: profile = profile.WithGender(Gender.Male); break;
case Sex.Female: profile = profile.WithGender(Gender.Female); break;
default: profile = profile.WithGender(Gender.Neuter); break;
}
var speciesEntity = Spawn(species.Prototype, Transform(uid).Coordinates);
_humanoid.ApplyProfileTo(speciesEntity, profile);
_visualBody.ApplyProfileTo(speciesEntity, profile);
_metaData.SetEntityName(speciesEntity, profile.Name);
var tts = EnsureComp<TTSComponent>(speciesEntity);
string voice = profile.Sex switch
{
Sex.Female => "Alyx_Alyx",
_ => "Wheatley"
};
tts.VoicePrototypeId = voice;
// Replace Battery
if (TryComp<PowerCellSlotComponent>(speciesEntity, out var cellComp) && battery.HasValue &&
_container.TryGetContainer(speciesEntity, cellComp.CellSlotId, out var cellSlot))
{
foreach (var toDelete in cellSlot.ContainedEntities)
Del(toDelete);
_container.Insert(battery.Value, cellSlot, force: true);
}
// Replace Brain
if (TryComp<BodyComponent>(speciesEntity, out var bodyComp) && brain.HasValue && bodyComp.Organs != null)
{
foreach (var organ in bodyComp.Organs.ContainedEntities)
{
if (HasComp<BrainComponent>(organ))
{
Del(organ);
_container.Insert(brain.Value, bodyComp.Organs, force: true);
break;
}
}
}
_audio.PlayPvs(component.AssembleSound, speciesEntity);
Del(uid);
return true;
}
}
@@ -1,19 +1,28 @@
using Content.Server.Popups;
using Content.Server.Tools;
using Content.Shared._Wega.Implants.Components;
using Content.Shared.Body;
using Robust.Shared.Containers;
using Content.Shared.Examine;
using Content.Shared.Interaction;
using Content.Shared.Tools.Components;
using Robust.Server.GameObjects;
using Robust.Shared.Utility;
using System.Linq;
namespace Content.Server.Implants
{
public sealed class BodyPartImplantSystem : EntitySystem
{
[Dependency] private readonly SharedContainerSystem _container = default!;
[Dependency] private readonly ToolSystem _tool = default!;
[Dependency] private readonly PopupSystem _popup = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<BodyPartImplantComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<BodyPartImplantComponent, ComponentStartup>(OnStartup);
SubscribeLocalEvent<BodyPartImplantComponent, ExaminedEvent>(OnExamine);
SubscribeLocalEvent<BodyPartImplantComponent, InteractUsingEvent>(OnToolUseAttempt);
SubscribeLocalEvent<BodyComponent, OrganInsertedIntoEvent>(OnOrganInserted);
SubscribeLocalEvent<BodyComponent, OrganRemovedFromEvent>(OnOrganRemoved);
@@ -21,6 +30,8 @@ namespace Content.Server.Implants
private void OnStartup(Entity<BodyPartImplantComponent> ent, ref ComponentStartup args)
{
UpdateConfig(ent.Owner, null, ent.Comp);
// For implants that are organs themselves
if (TryComp<OrganComponent>(ent, out var organComp) && organComp.Body != null)
{
@@ -29,38 +40,39 @@ namespace Content.Server.Implants
}
}
private void OnMapInit(Entity<BodyPartImplantComponent> ent, ref MapInitEvent args)
private void OnExamine(EntityUid uid, BodyPartImplantComponent component, ExaminedEvent args)
{
if (!HasComp<OrganComponent>(ent))
if (component.Configurations.Count == 0)
return;
// This implant is an organ with slots for other organs
foreach (var connection in ent.Comp.Connections)
{
// Create container for child organs
var containerId = $"{ent.Owner}-{connection.Key}";
if (!_container.TryGetContainer(ent, containerId, out _))
{
_container.EnsureContainer<Container>(ent, containerId);
}
}
var config = component.Configurations.ElementAt(component.CurrentConfig);
args.PushMarkup(Loc.GetString("body-part-implant-config-" + config.Key));
}
// Spawn child organs
foreach (var (slot, organProto) in ent.Comp.Parts)
{
var childOrgan = Spawn(organProto, Transform(ent).Coordinates);
var containerId = $"{ent.Owner}-{slot}";
private void OnToolUseAttempt(EntityUid uid, BodyPartImplantComponent component, InteractUsingEvent args)
{
if (component.Configurations.Count == 0 || !_tool.HasQuality(args.Used, component.ConfigurationTool))
return;
if (_container.TryGetContainer(ent, containerId, out var container))
{
_container.Insert(childOrgan, container);
}
else
{
container = _container.EnsureContainer<Container>(ent, containerId);
_container.Insert(childOrgan, container);
}
}
component.CurrentConfig++;
if (component.CurrentConfig >= component.Configurations.Count)
component.CurrentConfig = 0;
_tool.PlayToolSound(args.Used, Comp<ToolComponent>(args.Used), null);
UpdateConfig(uid, args.User, component);
}
private void UpdateConfig(EntityUid uid, EntityUid? user, BodyPartImplantComponent component)
{
if (component.Configurations.Count == 0)
return;
var config = component.Configurations.ElementAt(component.CurrentConfig);
EntityManager.AddComponents(uid, config.Value);
if (user != null)
_popup.PopupEntity(Loc.GetString("body-part-implant-config-" + config.Key), uid, user.Value);
}
private void OnOrganInserted(Entity<BodyComponent> body, ref OrganInsertedIntoEvent args)
@@ -1,6 +1,7 @@
using Content.Server.Actions;
using Content.Server.Hands.Systems;
using Content.Shared._Wega.Implants.Components;
using Content.Shared.Body;
using Content.Shared.Interaction.Components;
using Content.Shared.Toggleable;
using Robust.Server.Audio;
@@ -132,11 +133,23 @@ public sealed class HandItemImplantSystem : EntitySystem
if (!item.ItemEntity.HasValue || component.Container == null)
return;
if (!_hands.TryGetHand(uid, item.HandId, out var _))
if (!TryComp<OrganComponent>(item.ImplantEntity, out var organ) || organ.Category == null)
return;
string handId = (string)organ.Category switch
{
"ArmLeft" => "left",
"ArmRight" => "right",
"HandLeft" => "left",
"HandRight" => "right",
_ => string.Empty
};
if (!_hands.TryGetHand(uid, handId, out var _))
return;
_container.Remove(item.ItemEntity.Value, component.Container);
_hands.TryForcePickup(uid, item.ItemEntity.Value, item.HandId);
_hands.TryForcePickup(uid, item.ItemEntity.Value, handId, checkActionBlocker: false);
_audio.PlayPvs(component.ToggleSound, uid);
EnsureComp<UnremoveableComponent>(item.ItemEntity.Value);
@@ -149,7 +162,6 @@ public sealed class HandItemImplantSystem : EntitySystem
RemComp<UnremoveableComponent>(item.ItemEntity.Value);
_hands.DoDrop(uid, item.HandId);
_container.Insert(item.ItemEntity.Value, component.Container, null);
_audio.PlayPvs(component.ToggleSound, uid);
}
+1 -1
View File
@@ -14,7 +14,7 @@ public sealed partial class VisualOrganComponent : Component
/// <summary>
/// The sprite layer on the entity that this contributes to
/// </summary>
[DataField(required: true)]
[DataField(required: true), AutoNetworkedField] // Corvax-Wega-changes
public Enum Layer;
/// <summary>
@@ -18,6 +18,7 @@ using Content.Shared.Random.Helpers;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Timing;
using Content.Shared._Wega.Metabolism; //Corvax-Wega-edit
namespace Content.Shared.Metabolism;
@@ -231,6 +232,11 @@ public sealed class MetabolizerSystem : EntitySystem
_entityEffects.ApplyEffect(solutionEntity.Value, effect, scale);
break;
default:
// Corvax-Wega-Edit-start
if (TryComp<DisableMetabolismEffectsComponent>(actualEntity, out var disable) &&
!disable.AllowedEffects.Contains(effect.GetType()))
break;
// Corvax-Wega-Edit-end
_entityEffects.ApplyEffect(actualEntity, effect, scale);
break;
}
@@ -0,0 +1,81 @@
using Content.Shared.Humanoid.Prototypes;
using Content.Shared.Preferences;
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
namespace Content.Shared._Wega.Android;
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class AndroidFrameComponent : Component
{
[DataField]
public ProtoId<SpeciesPrototype> Species = "Android";
[DataField]
public string BatterySlot = "battery";
[DataField]
public string BrainSlot = "brain";
[DataField]
public SoundSpecifier AssembleSound = new SoundPathSpecifier("/Audio/Items/rped.ogg");
[AutoNetworkedField]
public HumanoidCharacterProfile? Profile;
}
[Serializable, NetSerializable]
public enum AndroidConstructUiKey : byte
{
Key
}
[Serializable, NetSerializable]
public sealed class AndroidConstructUiState : BoundUserInterfaceState
{
public AndroidConstructUiState(ProtoId<SpeciesPrototype> species, HumanoidCharacterProfile profile, bool hasBattery, bool hasBrain)
{
Species = species;
Profile = profile;
HasBattery = hasBattery;
HasBrain = hasBrain;
}
public readonly ProtoId<SpeciesPrototype> Species;
public readonly HumanoidCharacterProfile Profile;
public readonly bool HasBattery, HasBrain;
}
[Serializable, NetSerializable]
public sealed class AndroidConstructEditMessage : BoundUserInterfaceMessage
{
public AndroidConstructEditMessage(HumanoidCharacterProfile newProfile)
{
NewProfile = newProfile;
}
public readonly HumanoidCharacterProfile NewProfile;
}
[Serializable, NetSerializable]
public sealed class AndroidConstructAssembleMessage : BoundUserInterfaceMessage
{
public AndroidConstructAssembleMessage()
{
}
}
public enum AndroidFrameVisualLayers : byte
{
Frame,
}
[Serializable, NetSerializable]
public enum AndroidFrameVisuals
{
ConstructionStage,
}
@@ -0,0 +1,63 @@
using Content.Shared.Containers.ItemSlots;
using Content.Shared.UserInterface;
using Robust.Shared.Containers;
namespace Content.Shared._Wega.Android;
public abstract partial class SharedAndroidFrameSystem : EntitySystem
{
[Dependency] private readonly SharedUserInterfaceSystem _ui = default!;
[Dependency] private readonly ItemSlotsSystem _slots = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<AndroidFrameComponent, AfterActivatableUIOpenEvent>(OnInterfaceOpen);
SubscribeLocalEvent<AndroidFrameComponent, EntInsertedIntoContainerMessage>(OnEntInserted);
SubscribeLocalEvent<AndroidFrameComponent, EntRemovedFromContainerMessage>(OnEntRemoved);
}
public bool TryGetFromSlot(EntityUid uid, string slotId, out EntityUid? entity)
{
entity = null;
if (!HasComp<ItemSlotsComponent>(uid) || !_slots.TryGetSlot(uid, slotId, out var slot))
return false;
if (slot.ContainerSlot == null || slot.ContainerSlot.ContainedEntity == null)
return false;
entity = slot.ContainerSlot.ContainedEntity;
return true;
}
private void UpdateUiState(EntityUid uid, AndroidFrameComponent component)
{
if (component.Profile == null)
return;
var state = new AndroidConstructUiState(
component.Species,
component.Profile,
TryGetFromSlot(uid, component.BatterySlot, out _),
TryGetFromSlot(uid, component.BrainSlot, out _)
);
_ui.SetUiState(uid, AndroidConstructUiKey.Key, state);
}
private void OnInterfaceOpen(EntityUid uid, AndroidFrameComponent component, AfterActivatableUIOpenEvent args)
{
UpdateUiState(uid, component);
}
private void OnEntInserted(EntityUid uid, AndroidFrameComponent component, EntInsertedIntoContainerMessage args)
{
UpdateUiState(uid, component);
}
private void OnEntRemoved(EntityUid uid, AndroidFrameComponent component, EntRemovedFromContainerMessage args)
{
UpdateUiState(uid, component);
}
}
@@ -1,24 +1,22 @@
using Content.Shared._Wega.Implants.Components;
using Content.Shared.Body;
using Content.Shared.Tools;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
namespace Content.Shared._Wega.Implants.Components
namespace Content.Shared._Wega.Implants.Components;
[RegisterComponent, NetworkedComponent]
public sealed partial class BodyPartImplantComponent : Component
{
[RegisterComponent, NetworkedComponent]
public sealed partial class BodyPartImplantComponent : Component
{
[DataField]
public Dictionary<ProtoId<OrganCategoryPrototype>, string> Connections = new();
[DataField]
public Dictionary<string, ComponentRegistry> Configurations = new();
[DataField]
public ProtoId<ToolQualityPrototype> ConfigurationTool = "Screwing";
public int CurrentConfig = 0;
[DataField]
public Dictionary<string, ProtoId<OrganCategoryPrototype>> Parts = new();
[DataField("key")]
public string? ImplantKey;
[DataField]
public ComponentRegistry? ImplantComponents = default!;
}
[DataField("key")]
public string? ImplantKey;
[DataField]
public ComponentRegistry ImplantComponents = new();
}
[ByRefEvent]
@@ -22,9 +22,6 @@ public sealed partial class HandItemImplantComponent : Component
[DataRecord]
public partial struct HandItemImplantSlot
{
[DataField("hand")]
public string HandId;
[DataField("prototype")]
public string ItemPrototype;
public EntityUid? ItemEntity;
@@ -36,9 +33,8 @@ public partial struct HandItemImplantSlot
[DataField]
public EntityUid? ImplantEntity;
public HandItemImplantSlot(string handId, string itemPrototype, string toggleAction, EntityUid? implant = null)
public HandItemImplantSlot(string itemPrototype, string toggleAction, EntityUid? implant = null)
{
HandId = handId;
ItemPrototype = itemPrototype;
ToggleActionPrototype = toggleAction;
ImplantEntity = implant;
@@ -0,0 +1,10 @@
using Content.Shared.EntityEffects.Effects.Body;
namespace Content.Shared._Wega.Metabolism;
[RegisterComponent]
public sealed partial class DisableMetabolismEffectsComponent : Component
{
[DataField("allowed")]
public List<Type> AllowedEffects = new([typeof(Oxygenate)]);
}
@@ -14,4 +14,9 @@ android-part-assembly-rightleg = Собирается правая нога. Д
android-part-assembly-rightfoot = Собирается правая стопа. Добавьте сталь.
partimplant-assembly-leftarm = Собирается левая рука.
partimplant-assembly-rightarm = Собирается правая рука.
partimplant-assembly-rightarm = Собирается правая рука.
body-part-implant-config-arm-left = Левая рука
body-part-implant-config-arm-right = Правая рука
body-part-implant-config-leg-left = Левая нога
body-part-implant-config-leg-right = Правая нога
@@ -0,0 +1,15 @@
android-construct-ui-title = Сборка андроида
android-construct-ui-name-label = Наименование:
android-construct-ui-sex-label = Тип корпуса:
android-construct-ui-skin-color-label = Цвет покрытия
android-construct-ui-battery-label-false = Батарея отсутствует
android-construct-ui-battery-label-true = Батарая установлена
android-construct-ui-brain-label-false = Мозг отсутствует
android-construct-ui-brain-label-true = Мозг установлен
android-construct-ui-assemble-label = Собрать
android-construct-ui-assemble-attention-label = Внимание, после сборки изменить внешность невозможно
android-construct-assemble-error-popup = Ошибка сборки
@@ -10,6 +10,9 @@ marking-AndroidOldHead = Андроид, голова (Страх детства
marking-AndroidScreenHead = Андроид, голова (Экран)
marking-AndroidAnimatronicHead = Андроид, голова (Аниматроник)
marking-AndroidTempleLed = Андроид, светодиод (Висок)
marking-AndroidHeadFemaleSynt = Андроид, голова (Имитация)
marking-AndroidHeadMaleSynt = Андроид, голова (Имитация)
# Торс
marking-AndroidTorsoFemaleStandart = Андроид, торс (Стандарт)
marking-AndroidTorsoFemaleBreast = Андроид, торс (Средняя грудь)
@@ -17,17 +20,35 @@ marking-AndroidTorsoFemaleBigBreast = Андроид, торс (Большая
marking-AndroidTorsoFemaleNoBreast = Андроид, торс (Без груди)
marking-AndroidTorsoMale = Андроид, торс
marking-AndroidTorsoSpine = Андроид, торс (Усиленный позвоночник)
marking-AndroidTorsoFemaleSynt = Андроид, торс (Имитация)
marking-AndroidTorsoMaleSynt = Андроид, торс (Имитация)
# Светодиоды
marking-AndroidLeds = Андроид, светодиоды (Стандарт)
marking-AndroidLedsLove = Андроид, светодиоды (Акцент)
marking-AndroidLedsStripes = Андроид, светодиоды (Полосы)
# Специальные
marking-AndroidCatEars = Андроид, кошачьи ушки
marking-AndroidCatEars-ears_cat_led = Светодиоды
marking-AndroidCatTail = Андроид, кошачий хвост
marking-AndroidCatEars-cat_tail_led = Светодиоды
# Конечности
marking-AndroidScrapArmLeft = Андроид, левая рука (Самоделкин)
marking-AndroidScrapArmRight = Андроид, правая рука (Самоделкин)
marking-AndroidScrapHandLeft = Андроид, левая кисть (Самоделкин)
marking-AndroidScrapHandRight = Андроид, правая кисть (Самоделкин)
marking-AndroidScrapLegLeft = Андроид, левая нога (Самоделкин)
marking-AndroidScrapLegRight = Андроид, правая нога (Самоделкин)
marking-AndroidScrapLegRight = Андроид, правая нога (Самоделкин)
marking-AndroidScrapFootLeft = Андроид, левая стопа (Самоделкин)
marking-AndroidScrapFootRight = Андроид, правая стопа (Самоделкин)
marking-AndroidSyntArmLeft = Андроид, левая рука (Имитация)
marking-AndroidSyntArmRight = Андроид, правая рука (Имитация)
marking-AndroidSyntHandLeft = Андроид, левая кисть (Имитация)
marking-AndroidSyntHandRight = Андроид, правая кисть (Имитация)
marking-AndroidSyntLegLeft = Андроид, левая нога (Имитация)
marking-AndroidSyntLegRight = Андроид, правая нога (Имитация)
marking-AndroidSyntFootLeft = Андроид, левая стопа (Имитация)
marking-AndroidSyntFootRight = Андроид, правая стопа (Имитация)
@@ -7,3 +7,4 @@ construction-graph-tag-alienberries = инопланетные ягоды
construction-graph-tag-soil-bag = мешок почвы
construction-graph-tag-explorer-suit = костюм исследователя
construction-graph-tag-goliath-cloak = плащ голиафа
construction-graph-tag-android-part = часть андроида
@@ -54,3 +54,8 @@ ent-OrganAndroidTyrium = тириумовый насос
ent-OrganAndroidEyes = камеры андроида
.desc = Высоко-технологичные камеры с блюспейс нейросетями.
.suffix = { ent-OrganMothInternal.suffix }
ent-AndroidEndoskeleton = эндоскелет андроида
.desc = Каркас для будущего андроида. Внутри они выглядят намного страшнее чем снаружи.
ent-AndroidFrame = каркас андроида
.desc = Настройте внешность собираемого робота.
@@ -1,36 +1,24 @@
ent-AndroidBodyPart = часть андроида
.desc = Универсальная часть тела для ремонта. Используйте отвёртку, чтобы изменить тип.
ent-LeftArmSyntheticPry = гидравлическая рука
.desc = Мощная гидравлическая рука, способная вскрывать запитанные шлюзы. Сейчас это левая рука, используйте отвёртку чтобы сменить тип.
ent-RightArmSyntheticPry = гидравлическая рука
.desc = Мощная гидравлическая рука, способная вскрывать запитанные шлюзы. Сейчас это правая рука, используйте отвёртку чтобы сменить тип.
ent-ArmSyntheticPry = гидравлическая рука
.desc = Мощная гидравлическая рука, способная вскрывать запитанные шлюзы. Используйте отвёртку чтобы сменить тип.
ent-LeftArmSyntheticDefib = рука дефибриллятор
.desc = Рука со встроенным дефибриллятором, идеально для андроида медика. Сейчас это левая рука, используйте отвёртку чтобы сменить тип.
ent-RightArmSyntheticDefib = рука дефибриллятор
.desc = Рука со встроенным дефибриллятором, идеально для андроида медика. Сейчас это правая рука, используйте отвёртку чтобы сменить тип.
ent-ArmSyntheticDefib = рука дефибриллятор
.desc = Рука со встроенным дефибриллятором, идеально для андроида медика. Используйте отвёртку чтобы сменить тип.
ent-DefibrillatorArmImplant = встроенный дефибриллятор
.desc = ЧИСТО! РАЗРЯД!
ent-LeftArmSyntheticProtoKinetic = рука протокинетик
.desc = Превратите свою руку в протокинетический ускоритель! Сейчас это левая рука, используйте отвёртку чтобы сменить тип.
ent-RightArmSyntheticProtoKinetic = рука протокинетик
.desc = Превратите свою руку в протокинетический ускоритель! Сейчас это правая рука, используйте отвёртку чтобы сменить тип.
ent-ArmSyntheticProtoKinetic = рука протокинетик
.desc = Превратите свою руку в протокинетический ускоритель! Используйте отвёртку чтобы сменить тип.
ent-WeaponArmProtoKinetic = встроенный протокинетический ускоритель
.desc = Стреляет кинетическими зарядами с низким уроном на короткое расстояние.
ent-LeftArmSyntheticCharger = рука зарядник
.desc = Рука со встроенным зарядником, заряжайтесь от предметов или заряжайте их. Сейчас это левая рука, используйте отвёртку чтобы сменить тип.
ent-RightArmSyntheticCharger = рука зарядник
.desc = Рука со встроенным зарядником, заряжайтесь от предметов или заряжайте их. Сейчас это правая рука, используйте отвёртку чтобы сменить тип.
ent-ArmSyntheticCharger = рука зарядник
.desc = Рука со встроенным зарядником, заряжайтесь от предметов или заряжайте их. Используйте отвёртку чтобы сменить тип.
ent-LeftLegSyntheticMagboots = магнитная нога
.desc = Нога со встроенными электромагнитами. Сейчас это левая нога, используйте отвёртку чтобы сменить тип.
ent-RightLegSyntheticMagboots = магнитная нога
.desc = Нога со встроенными электромагнитами. Сейчас это правая нога, используйте отвёртку чтобы сменить тип.
ent-LegSyntheticMagboots = магнитная нога
.desc = Нога со встроенными электромагнитами. Используйте отвёртку чтобы сменить тип.
ent-LeftLegSyntheticJump = прыжковая нога
.desc = Нога с установленным реактивным двигателем для коротких прыжков. Сейчас это левая нога, используйте отвёртку чтобы сменить тип.
ent-RightLegSyntheticJump = прыжковая нога
.desc = Нога с установленным реактивным двигателем для коротких прыжков. Сейчас это правая нога, используйте отвёртку чтобы сменить тип.
ent-LegSyntheticJump = прыжковая нога
.desc = Нога с установленным реактивным двигателем для коротких прыжков. Используйте отвёртку чтобы сменить тип.
@@ -82,7 +82,7 @@
- Brain
- type: entity
parent: BaseItem
parent: [ BaseItem, OrganBaseBrain ] # Corvax-Wega-Android-Edit
id: PositronicBrain
name: positronic brain
description: An artificial brain capable of spontaneous neural activity.
@@ -2,9 +2,6 @@
parent: None
id: Android
limits:
enum.HumanoidVisualLayers.Special:
limit: 2
required: false
enum.HumanoidVisualLayers.Head:
limit: 1
required: false
@@ -21,7 +18,7 @@
limit: 1
required: false
enum.HumanoidVisualLayers.Chest:
limit: 2
limit: 1
required: false
enum.HumanoidVisualLayers.LArm:
limit: 1
@@ -53,15 +50,15 @@
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
- map: [ "enum.HumanoidVisualLayers.UndergarmentBottom" ]
- map: [ "enum.HumanoidVisualLayers.UndergarmentTop" ]
- map: [ "enum.HumanoidVisualLayers.LFoot" ]
- map: [ "enum.HumanoidVisualLayers.RFoot" ]
- map: [ "enum.HumanoidVisualLayers.LHand" ]
- map: [ "enum.HumanoidVisualLayers.RHand" ]
- map: [ "enum.HumanoidVisualLayers.LFoot" ]
- map: [ "enum.HumanoidVisualLayers.Special" ]
- map: [ "socks" ]
- map: [ "underwearbottom" ]
- map: [ "underweartop" ]
- map: [ "jumpsuit" ]
- map: [ "enum.HumanoidVisualLayers.LHand" ]
- map: [ "enum.HumanoidVisualLayers.RHand" ]
- map: [ "anal" ]
- map: [ "gloves" ]
- map: [ "shoes" ]
@@ -247,6 +244,7 @@
Quantity: 300
bleedReductionAmount: 0
bloodRefreshAmount: 0
- type: DisableMetabolismEffects
- type: Android
- type: UserInterface
interfaces:
@@ -296,6 +294,107 @@
- type: PointLight
enabled: false
- type: entity
id: AndroidEndoskeleton
name: "android endoskeleton"
description: "A frame for a future android. Inside they are scarier than outside.."
components:
- type: Clickable
- type: InteractionOutline
- type: Physics
bodyType: Dynamic
fixedRotation: false
- type: Pullable
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeAabb
bounds: "-0.25,-0.25,0.25,0.25"
density: 100
mask:
- MobMask
layer:
- MobLayer
restitution: 0.3
friction: 0.2
- type: Sprite
noRot: true
drawdepth: Mobs
sprite: _Wega/Mobs/Species/Android/frame.rsi
layers:
- state: frame-0
map: [ "enum.AndroidFrameVisualLayers.Frame" ]
- type: Construction
graph: AndroidEndoskeleton
node: start
defaultTarget: frame
- type: Appearance
- type: GenericVisualizer
visuals:
enum.AndroidFrameVisuals.ConstructionStage:
enum.AndroidFrameVisualLayers.Frame:
0: { state: frame-0, visible: true}
1: { state: frame-1, visible: true}
2: { state: frame-2, visible: true}
3: { state: frame-3, visible: true}
4: { state: frame-4, visible: true}
5: { state: frame-5, visible: true}
- type: entity
id: AndroidFrame
name: "android frame"
description: "Customize the appearance of the assembled android."
components:
- type: Clickable
- type: InteractionOutline
- type: Physics
bodyType: Dynamic
fixedRotation: false
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeAabb
bounds: "-0.25,-0.25,0.25,0.25"
density: 100
mask:
- MobMask
layer:
- MobLayer
restitution: 0.3
friction: 0.2
- type: Sprite
noRot: true
drawdepth: Mobs
sprite: _Wega/Mobs/Species/Android/frame.rsi
state: full
- type: AndroidFrame
- type: Appearance
- type: ActivatableUI
key: enum.AndroidConstructUiKey.Key
- type: UserInterface
interfaces:
enum.AndroidConstructUiKey.Key:
type: AndroidConstructBoundUserInterface
- type: ContainerContainer
containers:
battery: !type:ContainerSlot
brain: !type:ContainerSlot
- type: ItemSlots
slots:
battery:
whitelist:
tags:
- PowerCell
brain:
whitelist:
tags:
- BrainSynthetic
- type: Construction
graph: AndroidEndoskeleton
node: frame
- type: entity
parent: OrganBase
id: OrganAndroid
@@ -1,3 +1,5 @@
#region Head Top
- type: marking
id: AndroidAntennaLeft
bodyPart: HeadTop
@@ -50,6 +52,10 @@
- sprite: _Wega/Mobs/Customization/android.rsi
state: head_bulbs
#endregion Head Top
#region Torso
- type: marking
id: AndroidTorsoFemaleStandart
bodyPart: Chest
@@ -124,7 +130,6 @@
id: AndroidTorsoSpine
bodyPart: Special
groupWhitelist: [ Android ]
sexRestriction: [ Female ]
sponsorOnly: false
coloring:
layers:
@@ -142,6 +147,40 @@
- sprite: _Wega/Mobs/Customization/android.rsi
state: body_spine_led
- type: marking
id: AndroidTorsoFemaleSynt
bodyPart: Chest
groupWhitelist: [ Android ]
sexRestriction: [ Female ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: body_f_synt
- type: marking
id: AndroidTorsoMaleSynt
bodyPart: Chest
groupWhitelist: [ Android ]
sexRestriction: [ Male ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: body_m_synt
#endregion Torso
#region Leds
- type: marking
id: AndroidLeds
bodyPart: Special
@@ -198,46 +237,241 @@
- sprite: _Wega/Mobs/Customization/android.rsi
state: temple_led
- type: marking
id: AndroidCatEars
bodyPart: HeadTop
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SkinColoring
layers:
ears_cat_led:
type:
!type:CategoryColoring
category: Special
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: ears_cat_outer
- sprite: _Wega/Mobs/Customization/android.rsi
state: ears_cat_led
#endregion Leds
#region Limbs
# Scrap
- type: marking
id: AndroidCatTail
bodyPart: Tail
id: AndroidScrapArmLeft
bodyPart: LArm
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:CategoryColoring
category: Hair
layers:
cat_tail_led:
type:
!type:CategoryColoring
category: Special
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: cat_tail
- sprite: _Wega/Mobs/Customization/android.rsi
state: cat_tail_led
- sprite: _Wega/Mobs/Customization/android.rsi
state: l_arm_scrap
- type: marking
id: AndroidScrapArmRight
bodyPart: RArm
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: r_arm_scrap
- type: marking
id: AndroidScrapHandLeft
bodyPart: LHand
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: l_hand_scrap
- type: marking
id: AndroidScrapHandRight
bodyPart: RHand
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: r_hand_scrap
- type: marking
id: AndroidScrapLegLeft
bodyPart: LLeg
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: l_leg_scrap
- type: marking
id: AndroidScrapLegRight
bodyPart: RLeg
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: r_leg_scrap
- type: marking
id: AndroidScrapFootLeft
bodyPart: LFoot
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: l_foot_scrap
- type: marking
id: AndroidScrapFootRight
bodyPart: RFoot
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: r_foot_scrap
# Synth
- type: marking
id: AndroidSyntArmLeft
bodyPart: LArm
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: l_arm_synt
- type: marking
id: AndroidSyntArmRight
bodyPart: RArm
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: r_arm_synt
- type: marking
id: AndroidSyntHandLeft
bodyPart: LHand
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: l_hand_synt
- type: marking
id: AndroidSyntHandRight
bodyPart: RHand
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: r_hand_synt
- type: marking
id: AndroidSyntLegLeft
bodyPart: LLeg
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: l_leg_synt
- type: marking
id: AndroidSyntLegRight
bodyPart: RLeg
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: r_leg_synt
- type: marking
id: AndroidSyntFootLeft
bodyPart: LFoot
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: l_foot_synt
- type: marking
id: AndroidSyntFootRight
bodyPart: RFoot
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: r_foot_synt
#endregion Limbs
#region Head
- type: marking
id: AndroidEyesVisor
@@ -259,62 +493,6 @@
- sprite: _Wega/Mobs/Customization/android.rsi
state: eyes_visor_led
- type: marking
id: AndroidScrapArmLeft
bodyPart: Special
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: l_arm_scrap
- type: marking
id: AndroidScrapArmRight
bodyPart: Special
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: r_arm_scrap
- type: marking
id: AndroidScrapLegLeft
bodyPart: Special
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: l_leg_scrap
- type: marking
id: AndroidScrapLegRight
bodyPart: Special
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: r_leg_scrap
- type: marking
id: AndroidOldHead
bodyPart: HeadTop
@@ -406,3 +584,79 @@
- sprite: _Wega/Mobs/Customization/android_heads.rsi
state: animatronic
- type: marking
id: AndroidHeadFemaleSynt
bodyPart: Head
groupWhitelist: [ Android ]
sexRestriction: [ Female ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android_heads.rsi
state: synt_f
- type: marking
id: AndroidHeadMaleSynt
bodyPart: Head
groupWhitelist: [ Android ]
sexRestriction: [ Male ]
sponsorOnly: false
coloring:
default:
type:
!type:SimpleColoring
color: "#ffffff"
sprites:
- sprite: _Wega/Mobs/Customization/android_heads.rsi
state: synt_m
#endregion Head
#region Misc
- type: marking
id: AndroidCatEars
bodyPart: HeadTop
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:SkinColoring
layers:
ears_cat_led:
type:
!type:CategoryColoring
category: Special
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: ears_cat_outer
- sprite: _Wega/Mobs/Customization/android.rsi
state: ears_cat_led
- type: marking
id: AndroidCatTail
bodyPart: Tail
groupWhitelist: [ Android ]
sponsorOnly: false
coloring:
default:
type:
!type:CategoryColoring
category: Hair
layers:
cat_tail_led:
type:
!type:CategoryColoring
category: Special
sprites:
- sprite: _Wega/Mobs/Customization/android.rsi
state: cat_tail
- sprite: _Wega/Mobs/Customization/android.rsi
state: cat_tail_led
#endregion Misc
@@ -1,335 +1,257 @@
# - type: entity
# name: "android body part"
# description: "Universal body part for android repair. Use a screwdriver to change the type."
# parent: BaseItem
# id: AndroidBodyPart
# components:
# - type: Sprite
# sprite: _Wega/Mobs/Species/Android/parts.rsi
# state: module_part
# - type: Construction
# graph: AndroidBodyPart
# node: start
- type: entity
name: "android body part"
description: "Universal body part for android repair. Use a screwdriver to change the type."
parent: BaseItem
id: AndroidBodyPart
components:
- type: Sprite
sprite: _Wega/Mobs/Species/Android/parts.rsi
state: module_part
- type: Construction
graph: AndroidBodyPart
node: start
- type: Tag
tags:
- AndroidPart
# - type: entity
# id: LeftArmSyntheticImplant
# parent: OrganAndroidArmLeft
# abstract: true
# components:
# - type: BodyPartImplant
# parts:
# left_hand:
# LeftHandAndroid
- type: entity
id: ArmSyntheticImplant
parent: [ OrganAndroidArmLeft ]
abstract: true
components:
- type: BodyPartImplant
configurations:
arm-left:
- type: Organ
category: ArmLeft
- type: VisualOrgan
layer: enum.HumanoidVisualLayers.LArm
data:
state: l_arm
- type: VisualOrganMarkings
markingData:
group: Android
layers:
- LArm
- type: Tag
tags:
- BaseBodyPart
- LeftArmSynthetic
arm-right:
- type: Organ
category: ArmRight
- type: VisualOrgan
layer: enum.HumanoidVisualLayers.RArm
data:
state: r_arm
- type: VisualOrganMarkings
markingData:
group: Android
layers:
- RArm
- type: Tag
tags:
- BaseBodyPart
- RightArmSynthetic
# - type: entity
# id: RightArmSyntheticImplant
# parent: OrganAndroidArmRight
# abstract: true
# components:
# - type: BodyPartImplant
# parts:
# right_hand:
# RightHandAndroid
- type: entity
id: LegSyntheticImplant
parent: [ OrganAndroidLegLeft ]
abstract: true
components:
- type: BodyPartImplant
configurations:
leg-left:
- type: Organ
category: LegLeft
- type: VisualOrgan
layer: enum.HumanoidVisualLayers.LLeg
data:
state: l_leg
- type: VisualOrganMarkings
markingData:
group: Android
layers:
- LLeg
- type: Tag
tags:
- BaseBodyPart
- LeftLegSynthetic
leg-right:
- type: Organ
category: LegRight
- type: VisualOrgan
layer: enum.HumanoidVisualLayers.RLeg
data:
state: r_leg
- type: VisualOrganMarkings
markingData:
group: Android
layers:
- RLeg
- type: Tag
tags:
- BaseBodyPart
- RightLegSynthetic
# - type: entity
# id: LeftLegSyntheticImplant
# parent: OrganAndroidLegLeft
# abstract: true
# components:
# - type: BodyPartImplant
# parts:
# left_foot:
# LeftFootAndroid
# Pry Arm
# - type: entity
# id: RightLegSyntheticImplant
# parent: OrganAndroidLegRight
# abstract: true
# components:
# - type: BodyPartImplant
# parts:
# right_foot:
# RightFootAndroid
- type: entity
id: ArmSyntheticPry
parent: [ ArmSyntheticImplant ]
name: "hydraulic arm"
description: "A powerful hydraulic arm for opening powered airlocks. Use a screwdriver to change it symmetry."
components:
- type: Sprite
sprite: _Wega/Mobs/Species/Android/parts.rsi
state: pry_arm
- type: BodyPartImplant
key: pry
implantComponents:
- type: Tool
qualities:
- Prying
- type: Prying
pryPowered: !type:Bool
true
force: !type:Bool
true
useSound:
path: /Audio/Items/jaws_pry.ogg
speedModifier: 1
# # Pry Arm
# Defib Arm
# - type: entity
# id: ArmSyntheticPry
# name: "hydraulic arm"
# abstract: true
# components:
# - type: Sprite
# sprite: _Wega/Mobs/Species/Android/parts.rsi
# state: pry_arm
# - type: BodyPartImplant
# key: pry
# implantComponents:
# - type: Tool
# qualities:
# - Prying
# - type: Prying
# pryPowered: !type:Bool
# true
# force: !type:Bool
# true
# useSound:
# path: /Audio/Items/jaws_pry.ogg
# speedModifier: 1
# - type: Construction
# graph: ArmSyntheticPry
# node: start
- type: entity
id: ArmSyntheticDefib
parent: [ ArmSyntheticImplant ]
name: "defibrillator arm"
description: "An arm with a built-in defibrillator! Use a screwdriver to change it symmetry."
components:
- type: Sprite
sprite: _Wega/Mobs/Species/Android/parts.rsi
state: defib_arm
- type: BodyPartImplant
key: defib
implantComponents:
- type: ExtendHandItemImplant
items:
- prototype: DefibrillatorArmImplant
toggleAction: ActionToggleBodyPartImplantDefib
# - type: entity
# id: LeftArmSyntheticPry
# description: "A powerful hydraulic arm for opening powered airlocks. Now it is left, use a screwdriver to change it."
# parent: [ ArmSyntheticPry, LeftArmSyntheticImplant ]
- type: entity
id: DefibrillatorArmImplant
name: "build-in defibrillator"
parent: [ BaseDefibrillator ]
categories: [ HideSpawnMenu ]
# - type: entity
# id: RightArmSyntheticPry
# description: "A powerful hydraulic arm for opening powered airlocks. Now it is right, use a screwdriver to change it."
# parent: [ ArmSyntheticPry, RightArmSyntheticImplant ]
# categories: [ HideSpawnMenu ]
# components:
# - type: Construction
# node: right
# Proto-kinetic Arm
# # Defib Arm
- type: entity
id: ArmSyntheticProtoKinetic
parent: [ ArmSyntheticImplant ]
name: "proto-kinetic arm"
description: "Turn your hand into Proto-kinetic accelerator. Now it is left, use a screwdriver to change it."
components:
- type: Sprite
sprite: _Wega/Mobs/Species/Android/parts.rsi
state: kinetic_arm
- type: BodyPartImplant
key: protokinetic
implantComponents:
- type: ExtendHandItemImplant
items:
- prototype: WeaponArmProtoKinetic
toggleAction: ActionToggleBodyPartImplantKinetic
# - type: entity
# id: ArmSyntheticDefib
# name: "defibrillator arm"
# description: "An arm with a built-in defibrillator! Now it is left, use a screwdriver to change it."
# abstract: true
# components:
# - type: Sprite
# sprite: _Wega/Mobs/Species/Android/parts.rsi
# state: defib_arm
# - type: BodyPartImplant
# key: defib
# - type: Construction
# graph: ArmSyntheticDefib
# node: start
# - type: entity
# id: LeftArmSyntheticDefib
# description: "An arm with a built-in defibrillator! Now it is left, use a screwdriver to change it."
# parent: [ ArmSyntheticDefib, LeftArmSyntheticImplant ]
# components:
# - type: BodyPartImplant
# implantComponents:
# - type: ExtendHandItemImplant
# items:
# - hand: body_part_slot_left_hand
# prototype: DefibrillatorArmImplant
# toggleAction: ActionToggleBodyPartImplantDefib
# - type: entity
# id: RightArmSyntheticDefib
# description: "An arm with a built-in defibrillator! Now it is right, use a screwdriver to change it."
# parent: [ ArmSyntheticDefib, RightArmSyntheticImplant ]
# categories: [ HideSpawnMenu ]
# components:
# - type: Construction
# node: right
# - type: BodyPartImplant
# implantComponents:
# - type: ExtendHandItemImplant
# items:
# - hand: body_part_slot_right_hand
# prototype: DefibrillatorArmImplant
# toggleAction: ActionToggleBodyPartImplantDefib
# - type: entity
# id: DefibrillatorArmImplant
# name: "build-in defibrillator"
# parent: [ BaseDefibrillator ]
# categories: [ HideSpawnMenu ]
# # Proto-kinetic Arm
# - type: entity
# id: ArmSyntheticProtoKinetic
# name: "proto-kinetic arm"
# description: "Turn your hand into Proto-kinetic accelerator. Now it is left, use a screwdriver to change it."
# abstract: true
# components:
# - type: Sprite
# sprite: _Wega/Mobs/Species/Android/parts.rsi
# state: kinetic_arm
# - type: BodyPartImplant
# key: protokinetic
# - type: Construction
# graph: ArmSyntheticProtoKinetic
# node: start
# - type: entity
# id: LeftArmSyntheticProtoKinetic
# description: "Turn your hand into Proto-kinetic accelerator. Now it is left, use a screwdriver to change it."
# parent: [ ArmSyntheticProtoKinetic, LeftArmSyntheticImplant ]
# components:
# - type: BodyPartImplant
# implantComponents:
# - type: ExtendHandItemImplant
# items:
# - hand: body_part_slot_left_hand
# prototype: WeaponArmProtoKinetic
# toggleAction: ActionToggleBodyPartImplantKinetic
# - type: entity
# id: RightArmSyntheticProtoKinetic
# description: "Turn your hand into Proto-kinetic accelerator. Now it is right, use a screwdriver to change it."
# parent: [ ArmSyntheticProtoKinetic, RightArmSyntheticImplant ]
# categories: [ HideSpawnMenu ]
# components:
# - type: BodyPartImplant
# implantComponents:
# - type: ExtendHandItemImplant
# items:
# - hand: body_part_slot_right_hand
# prototype: WeaponArmProtoKinetic
# toggleAction: ActionToggleBodyPartImplantKinetic
# - type: Construction
# node: right
# - type: entity
# id: WeaponArmProtoKinetic
# name: "build-in proto-kinetic accelerator"
# description: "Fires low-damage kinetic bolts at a short range."
# parent: BaseItem
# categories: [ HideSpawnMenu ]
# components:
# - type: Unremoveable
# - type: Sprite
# sprite: Objects/Weapons/Guns/Basic/kinetic_accelerator.rsi
# layers:
# - state: icon
# - state: animation-icon
# visible: false
# map: [ "empty-icon" ]
# - type: Item
# sprite: Objects/Weapons/Guns/Basic/kinetic_accelerator.rsi
# - type: Gun
# fireRate: 0.5
# selectedMode: SemiAuto
# angleDecay: 10
# minAngle: -5
# maxAngle: 5
# availableModes:
# - SemiAuto
# soundGunshot:
# path: /Audio/Weapons/Guns/Gunshots/kinetic_accel.ogg
# - type: AmmoCounter
# - type: Appearance
# - type: GenericVisualizer
# visuals:
# enum.AmmoVisuals.HasAmmo:
# empty-icon:
# True: { visible: False }
# False: { visible: True }
# - type: RechargeBasicEntityAmmo
# rechargeCooldown: 1.0
# rechargeSound:
# path: /Audio/Weapons/Guns/MagIn/kinetic_reload.ogg
# - type: BasicEntityAmmoProvider
# proto: BulletKinetic
# capacity: 1
# count: 1
- type: entity
id: WeaponArmProtoKinetic
name: "build-in proto-kinetic accelerator"
description: "Fires low-damage kinetic bolts at a short range."
parent: BaseItem
categories: [ HideSpawnMenu ]
components:
- type: Unremoveable
- type: Sprite
sprite: Objects/Weapons/Guns/Basic/kinetic_accelerator.rsi
layers:
- state: icon
- state: animation-icon
visible: false
map: [ "empty-icon" ]
- type: Item
sprite: Objects/Weapons/Guns/Basic/kinetic_accelerator.rsi
- type: Gun
fireRate: 0.5
selectedMode: SemiAuto
angleDecay: 10
minAngle: -5
maxAngle: 5
availableModes:
- SemiAuto
soundGunshot:
path: /Audio/Weapons/Guns/Gunshots/kinetic_accel.ogg
- type: AmmoCounter
- type: Appearance
- type: GenericVisualizer
visuals:
enum.AmmoVisuals.HasAmmo:
empty-icon:
True: { visible: False }
False: { visible: True }
- type: RechargeBasicEntityAmmo
rechargeCooldown: 1.0
rechargeSound:
path: /Audio/Weapons/Guns/MagIn/kinetic_reload.ogg
- type: BasicEntityAmmoProvider
proto: BulletKinetic
capacity: 1
count: 1
# # Charger arm
# - type: entity
# id: ArmSyntheticCharger
# name: "charger arm"
# abstract: true
# components:
# - type: Sprite
# sprite: _Wega/Mobs/Species/Android/parts.rsi
# state: charger_arm
# - type: BodyPartImplant
# key: charge
# implantComponents:
# - type: BatteryDrainerImplant
# - type: Construction
# graph: ArmSyntheticCharger
# node: start
- type: entity
id: ArmSyntheticCharger
parent: [ ArmSyntheticImplant ]
name: "charger arm"
components:
- type: Sprite
sprite: _Wega/Mobs/Species/Android/parts.rsi
state: charger_arm
- type: BodyPartImplant
key: charge
implantComponents:
- type: BatteryDrainerImplant
# - type: entity
# id: LeftArmSyntheticCharger
# description: "An arm with built-in charger, charge yourself or charge items. Now it is left, use a screwdriver to change it."
# parent: [ ArmSyntheticCharger, LeftArmSyntheticImplant ]
# Magnet Leg
# - type: entity
# id: RightArmSyntheticCharger
# description: "An arm with built-in charger, charge yourself or charge items. Now it is right, use a screwdriver to change it."
# parent: [ ArmSyntheticCharger, RightArmSyntheticImplant ]
# categories: [ HideSpawnMenu ]
# components:
# - type: Construction
# node: right
- type: entity
id: LegSyntheticMagboots
parent: [ LegSyntheticImplant ]
name: "magnet leg"
components:
- type: Sprite
sprite: _Wega/Mobs/Species/Android/parts.rsi
state: magnet_leg
- type: BodyPartImplant
key: magnet
implantComponents:
- type: MagbootsImplant
# # Magnet Leg
# Jump Leg
# - type: entity
# id: LegSyntheticMagboots
# name: "magnet arm"
# abstract: true
# components:
# - type: Sprite
# sprite: _Wega/Mobs/Species/Android/parts.rsi
# state: magnet_leg
# - type: BodyPartImplant
# key: magnet
# implantComponents:
# - type: MagbootsImplant
# - type: Construction
# graph: LegSyntheticMagboots
# node: start
# - type: entity
# id: LeftLegSyntheticMagboots
# description: "A leg with built-in magboots. Now it is left, use a screwdriver to change it."
# parent: [ LegSyntheticMagboots, LeftLegSyntheticImplant ]
# - type: entity
# id: RightLegSyntheticMagboots
# description: "A leg with built-in magboots. Now it is right, use a screwdriver to change it."
# parent: [ LegSyntheticMagboots, RightLegSyntheticImplant ]
# categories: [ HideSpawnMenu ]
# components:
# - type: Construction
# node: right
# # Jump Leg
# - type: entity
# id: LegSyntheticJump
# name: "jump arm"
# abstract: true
# components:
# - type: Sprite
# sprite: _Wega/Mobs/Species/Android/parts.rsi
# state: jump_leg
# - type: BodyPartImplant
# key: jump
# implantComponents:
# - type: JumpAbility
# action: ActionBodyPartImplantJump
# jumpDistance: 4
# jumpSound: /Audio/Effects/stealthoff.ogg
# - type: Construction
# graph: LegSyntheticJump
# node: start
# - type: entity
# id: LeftLegSyntheticJump
# description: "A leg with an installed rocket engine for short jumps. Now it is left, use a screwdriver to change it."
# parent: [ LegSyntheticJump, LeftLegSyntheticImplant ]
# - type: entity
# id: RightLegSyntheticJump
# description: "A leg with an installed rocket engine for short jumps. Now it is right, use a screwdriver to change it."
# parent: [ LegSyntheticJump, RightLegSyntheticImplant ]
# categories: [ HideSpawnMenu ]
# components:
# - type: Construction
# node: right
- type: entity
id: LegSyntheticJump
parent: [ LegSyntheticImplant ]
name: "jump leg"
components:
- type: Sprite
sprite: _Wega/Mobs/Species/Android/parts.rsi
state: jump_leg
- type: BodyPartImplant
key: jump
implantComponents:
- type: JumpAbility
action: ActionBodyPartImplantJump
jumpDistance: 4
jumpSound: /Audio/Effects/stealthoff.ogg
@@ -172,158 +172,4 @@
amount: 2
doAfter: 2
- node: complete
# ========================
# Импланты частей тела
# ========================
# - type: constructionGraph
# id: ArmSyntheticPry
# start: start
# graph:
# - node: start
# entity: LeftArmSyntheticPry
# edges:
# - to: right
# steps:
# - tool: Screwing
# doAfter: 1
# completed:
# - !type:PopupUser
# text: partimplant-assembly-rightarm
# - node: right
# entity: RightArmSyntheticPry
# edges:
# - to: start
# steps:
# - tool: Screwing
# doAfter: 1
# completed:
# - !type:PopupUser
# text: partimplant-assembly-leftarm
# - type: constructionGraph
# id: ArmSyntheticDefib
# start: start
# graph:
# - node: start
# entity: LeftArmSyntheticDefib
# edges:
# - to: right
# steps:
# - tool: Screwing
# doAfter: 1
# completed:
# - !type:PopupUser
# text: partimplant-assembly-rightarm
# - node: right
# entity: RightArmSyntheticDefib
# edges:
# - to: start
# steps:
# - tool: Screwing
# doAfter: 1
# completed:
# - !type:PopupUser
# text: partimplant-assembly-leftarm
# - type: constructionGraph
# id: ArmSyntheticProtoKinetic
# start: start
# graph:
# - node: start
# entity: LeftArmSyntheticProtoKinetic
# edges:
# - to: right
# steps:
# - tool: Screwing
# doAfter: 1
# completed:
# - !type:PopupUser
# text: partimplant-assembly-rightarm
# - node: right
# entity: RightArmSyntheticProtoKinetic
# edges:
# - to: start
# steps:
# - tool: Screwing
# doAfter: 1
# completed:
# - !type:PopupUser
# text: partimplant-assembly-leftarm
# - type: constructionGraph
# id: ArmSyntheticCharger
# start: start
# graph:
# - node: start
# entity: LeftArmSyntheticCharger
# edges:
# - to: right
# steps:
# - tool: Screwing
# doAfter: 1
# completed:
# - !type:PopupUser
# text: partimplant-assembly-rightarm
# - node: right
# entity: RightArmSyntheticCharger
# edges:
# - to: start
# steps:
# - tool: Screwing
# doAfter: 1
# completed:
# - !type:PopupUser
# text: partimplant-assembly-leftarm
# - type: constructionGraph
# id: LegSyntheticMagboots
# start: start
# graph:
# - node: start
# entity: LeftLegSyntheticMagboots
# edges:
# - to: right
# steps:
# - tool: Screwing
# doAfter: 1
# completed:
# - !type:PopupUser
# text: partimplant-assembly-rightarm
# - node: right
# entity: RightLegSyntheticMagboots
# edges:
# - to: start
# steps:
# - tool: Screwing
# doAfter: 1
# completed:
# - !type:PopupUser
# text: partimplant-assembly-leftarm
# - type: constructionGraph
# id: LegSyntheticJump
# start: start
# graph:
# - node: start
# entity: LeftLegSyntheticJump
# edges:
# - to: right
# steps:
# - tool: Screwing
# doAfter: 1
# completed:
# - !type:PopupUser
# text: partimplant-assembly-rightarm
# - node: right
# entity: RightLegSyntheticJump
# edges:
# - to: start
# steps:
# - tool: Screwing
# doAfter: 1
# completed:
# - !type:PopupUser
# text: partimplant-assembly-leftarm
- node: complete
@@ -0,0 +1,123 @@
- type: constructionGraph
id: AndroidEndoskeleton
start: start
graph:
- node: start
entity: AndroidEndoskeleton
edges:
- to: frame
steps:
# Left leg
- tag: AndroidPart
name: construction-graph-tag-android-part
icon:
sprite: _Wega/Mobs/Species/Android/parts.rsi
state: module_part
completed:
- !type:VisualizerDataInt
key: "enum.AndroidFrameVisuals.ConstructionStage"
data: 1
- material: Steel
amount: 5
doAfter: 3
- material: Plastic
amount: 3
doAfter: 1
- tool: Anchoring
doAfter: 3
# Right leg
- tag: AndroidPart
name: construction-graph-tag-android-part
icon:
sprite: _Wega/Mobs/Species/Android/parts.rsi
state: module_part
completed:
- !type:VisualizerDataInt
key: "enum.AndroidFrameVisuals.ConstructionStage"
data: 2
- material: Steel
amount: 5
doAfter: 3
- material: Plastic
amount: 3
doAfter: 1
- tool: Anchoring
doAfter: 3
# Left arm
- tag: AndroidPart
name: construction-graph-tag-android-part
icon:
sprite: _Wega/Mobs/Species/Android/parts.rsi
state: module_part
completed:
- !type:VisualizerDataInt
key: "enum.AndroidFrameVisuals.ConstructionStage"
data: 3
- material: Steel
amount: 5
doAfter: 3
- material: Plastic
amount: 3
doAfter: 1
- tool: Screwing
doAfter: 3
# Right arm
- tag: AndroidPart
name: construction-graph-tag-android-part
icon:
sprite: _Wega/Mobs/Species/Android/parts.rsi
state: module_part
completed:
- !type:VisualizerDataInt
key: "enum.AndroidFrameVisuals.ConstructionStage"
data: 4
- material: Steel
amount: 5
doAfter: 3
- material: Plastic
amount: 3
doAfter: 1
- tool: Screwing
doAfter: 3
# Head
- material: Steel
amount: 10
doAfter: 3
completed:
- !type:VisualizerDataInt
key: "enum.AndroidFrameVisuals.ConstructionStage"
data: 5
- material: Plastic
amount: 3
doAfter: 1
- tool: Screwing
doAfter: 3
- tool: Welding
doAfter: 5
- material: Cable
amount: 10
doAfter: 3
- node: frame
entity: AndroidFrame
@@ -9,3 +9,5 @@
id: ScienceReach
recipes:
- Nanopast1
- AndroidBodyPart
- AndroidEndoskeleton
@@ -1,5 +1,5 @@
- type: latheCategory
id: Anroid
id: Android
name: lathe-category-android
- type: latheCategory
@@ -134,6 +134,7 @@
Plastic: 500
Gold: 500
Diamond: 200
# Android
- type: latheRecipe
@@ -141,31 +142,45 @@
id: Tyriumpack
result: Tyriumpack1
categories:
- Anroid
- Android
completetime: 1
materials:
Steel: 20
Plastic: 20
Plasma: 15
# - type: latheRecipe
# parent: BaseRoboticsRecipe
# id: AndroidBodyPart
# result: AndroidBodyPart
# categories:
# - Anroid
# completetime: 5
# materials:
# Steel: 300
# Plastic: 250
# Silver: 150
- type: latheRecipe
parent: BaseRoboticsRecipe
id: AndroidBodyPart
result: AndroidBodyPart
categories:
- Android
completetime: 5
materials:
Steel: 250
Plastic: 250
Silver: 150
- type: latheRecipe
parent: BaseRoboticsRecipe
id: AndroidEndoskeleton
result: AndroidEndoskeleton
categories:
- Android
completetime: 5
materials:
Steel: 1000
Glass: 1500
Plastic: 500
Gold: 500
Plasma: 500
# - type: latheRecipe
# parent: BaseRoboticsRecipe
# id: ArmSyntheticPry
# result: LeftArmSyntheticPry
# categories:
# - Anroid
# - Android
# completetime: 5
# materials:
# Steel: 750
@@ -178,7 +193,7 @@
# id: ArmSyntheticDefib
# result: LeftArmSyntheticDefib
# categories:
# - Anroid
# - Android
# completetime: 5
# materials:
# Steel: 750
@@ -190,7 +205,7 @@
# id: ArmSyntheticProtoKinetic
# result: LeftArmSyntheticProtoKinetic
# categories:
# - Anroid
# - Android
# completetime: 5
# materials:
# Steel: 750
@@ -203,7 +218,7 @@
# id: ArmSyntheticCharger
# result: LeftArmSyntheticCharger
# categories:
# - Anroid
# - Android
# completetime: 5
# materials:
# Steel: 750
@@ -215,7 +230,7 @@
# id: LegSyntheticMagboots
# result: LeftLegSyntheticMagboots
# categories:
# - Anroid
# - Android
# completetime: 5
# materials:
# Steel: 750
@@ -227,7 +242,7 @@
# id: LegSyntheticJump
# result: LeftLegSyntheticJump
# categories:
# - Anroid
# - Android
# completetime: 5
# materials:
# Steel: 750
@@ -8,11 +8,13 @@
state: fab-idle
discipline: Experimental
tier: 2
cost: 10000
cost: 15000
recipeUnlocks:
- BorgChargerTurboCircuitboard
- ExosuitFabricatorHyperConvectionMachineCircuitboard
- Nanopast1
- AndroidBodyPart
- AndroidEndoskeleton
technologyPrerequisites:
- BasicRobotics
@@ -499,18 +499,6 @@
sound:
path: /Audio/Items/wirecutter.ogg
time: 2
- tool: [ Cutting ]
tag: [ Knife, Shiv, BasicGlassShard]
action: StripWire
sound:
path: /Audio/Items/wirecutter.ogg
time: 2
- tool: [ Anchoring ]
tag: [ Wirecutter, Pipe ]
action: Unanchor
sound:
path: /Audio/Items/ratchet.ogg
time: 2
- tool: [ Screwing ]
tag: [ Knife, Shiv, BasicGlassShard]
action: RemoveOrgan
@@ -544,10 +532,6 @@
label: Прикрепить левую кисть
stepGroups:
- steps:
- tag: [ CableCoil ]
entityPreview: CableApcStack
action: MendWire
time: 2
- tag: [ LeftHandSynthetic ]
action: InsertOrgan
requiredPart: HandLeft
@@ -584,18 +568,6 @@
sound:
path: /Audio/Items/wirecutter.ogg
time: 2
- tool: [ Cutting ]
tag: [ Knife, Shiv, BasicGlassShard]
action: StripWire
sound:
path: /Audio/Items/wirecutter.ogg
time: 2
- tool: [ Anchoring ]
tag: [ Wirecutter, Pipe ]
action: Unanchor
sound:
path: /Audio/Items/ratchet.ogg
time: 2
- tool: [ Screwing ]
tag: [ Knife, Shiv, BasicGlassShard]
action: RemoveOrgan
@@ -629,10 +601,6 @@
label: Прикрепить правую кисть
stepGroups:
- steps:
- tag: [ CableCoil ]
entityPreview: CableApcStack
action: MendWire
time: 2
- tag: [ RightHandSynthetic ]
action: InsertOrgan
requiredPart: HandRight
@@ -670,18 +638,6 @@
sound:
path: /Audio/Items/wirecutter.ogg
time: 2
- tool: [ Cutting ]
tag: [ Knife, Shiv, BasicGlassShard]
action: StripWire
sound:
path: /Audio/Items/wirecutter.ogg
time: 2
- tool: [ Anchoring ]
tag: [ Wirecutter, Pipe ]
action: Unanchor
sound:
path: /Audio/Items/ratchet.ogg
time: 2
- tool: [ Screwing ]
tag: [ Knife, Shiv, BasicGlassShard]
action: Unscrew
@@ -767,18 +723,6 @@
sound:
path: /Audio/Items/wirecutter.ogg
time: 2
- tool: [ Cutting ]
tag: [ Knife, Shiv, BasicGlassShard]
action: StripWire
sound:
path: /Audio/Items/wirecutter.ogg
time: 2
- tool: [ Anchoring ]
tag: [ Wirecutter, Pipe ]
action: Unanchor
sound:
path: /Audio/Items/ratchet.ogg
time: 2
- tool: [ Screwing ]
tag: [ Knife, Shiv, BasicGlassShard]
action: Unscrew
@@ -861,30 +805,12 @@
- !type:OrganPresentCondition
organ: FootLeft
steps:
- tool: [ Cutting ]
tag: [ Knife, Shiv, BasicGlassShard]
action: CutWire
sound:
path: /Audio/Items/wirecutter.ogg
time: 2
- tool: [ Cutting ]
tag: [ Knife, Shiv, BasicGlassShard]
action: StripWire
sound:
path: /Audio/Items/wirecutter.ogg
time: 2
- tool: [ Anchoring ]
tag: [ Wirecutter, Pipe ]
action: Unanchor
sound:
path: /Audio/Items/ratchet.ogg
time: 2
- tool: [ Screwing ]
tag: [ Knife, Shiv, BasicGlassShard]
action: Unscrew
sound:
collection: Screwdriver
time: 2
- tool: [ Anchoring ]
tag: [ Wirecutter, Pipe ]
action: RemoveOrgan
@@ -918,20 +844,10 @@
label: Прикрепить левую стопу
stepGroups:
- steps:
- tag: [ CableCoil ]
entityPreview: CableApcStack
action: MendWire
time: 2
- tag: [ LeftFootSynthetic ]
action: InsertOrgan
requiredPart: FootLeft
time: 2
- tool: [ Anchoring ]
tag: [ Wirecutter, Pipe ]
action: Anchor
sound:
path: /Audio/Items/ratchet.ogg
time: 2
# ПРАВАЯ СТОПА
- type: surgeryTransition
@@ -963,30 +879,12 @@
- !type:OrganPresentCondition
organ: FootRight
steps:
- tool: [ Cutting ]
tag: [ Knife, Shiv, BasicGlassShard]
action: CutWire
sound:
path: /Audio/Items/wirecutter.ogg
time: 2
- tool: [ Cutting ]
tag: [ Knife, Shiv, BasicGlassShard]
action: StripWire
sound:
path: /Audio/Items/wirecutter.ogg
time: 2
- tool: [ Anchoring ]
tag: [ Wirecutter, Pipe ]
action: Unanchor
sound:
path: /Audio/Items/ratchet.ogg
time: 2
- tool: [ Screwing ]
tag: [ Knife, Shiv, BasicGlassShard]
action: Unscrew
sound:
collection: Screwdriver
time: 2
- tool: [ Anchoring ]
tag: [ Wirecutter, Pipe ]
action: RemoveOrgan
@@ -1020,20 +918,10 @@
label: Прикрепить правую стопу
stepGroups:
- steps:
- tag: [ CableCoil ]
entityPreview: CableApcStack
action: MendWire
time: 2
- tag: [ RightFootSynthetic ]
action: InsertOrgan
requiredPart: FootRight
time: 2
- tool: [ Anchoring ]
tag: [ Wirecutter, Pipe ]
action: Anchor
sound:
path: /Audio/Items/ratchet.ogg
time: 2
# Завершающий переход конечности
- type: surgeryTransition
+3
View File
@@ -1,6 +1,9 @@
- type: Tag
id: Android
- type: Tag
id: AndroidPart
- type: Tag
id: SoulStone
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 605 B

After

Width:  |  Height:  |  Size: 461 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 740 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 720 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 633 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 653 B

After

Width:  |  Height:  |  Size: 511 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Made with love by Misha_Unity and Melissandra >//<",
"copyright": "Made with love by Misha_Unity and Melissandra >//<; Syth sprites are made by Admiral Eisenberger",
"size": {
"x": 32,
"y": 32
@@ -127,6 +127,14 @@
"name": "r_arm_scrap",
"directions": 4
},
{
"name": "l_hand_scrap",
"directions": 4
},
{
"name": "r_hand_scrap",
"directions": 4
},
{
"name": "l_leg_scrap",
"directions": 4
@@ -134,6 +142,54 @@
{
"name": "r_leg_scrap",
"directions": 4
},
{
"name": "l_foot_scrap",
"directions": 4
},
{
"name": "r_foot_scrap",
"directions": 4
},
{
"name": "body_f_synt",
"directions": 4
},
{
"name": "body_m_synt",
"directions": 4
},
{
"name": "l_arm_synt",
"directions": 4
},
{
"name": "r_arm_synt",
"directions": 4
},
{
"name": "l_hand_synt",
"directions": 4
},
{
"name": "r_hand_synt",
"directions": 4
},
{
"name": "l_leg_synt",
"directions": 4
},
{
"name": "r_leg_synt",
"directions": 4
},
{
"name": "l_foot_synt",
"directions": 4
},
{
"name": "r_foot_synt",
"directions": 4
}
]
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 689 B

After

Width:  |  Height:  |  Size: 494 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 760 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 713 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 624 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 753 B

After

Width:  |  Height:  |  Size: 584 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Made with love by Misha_Unity and Melissandra >//<",
"copyright": "Made with love by Misha_Unity and Melissandra >//<; Syth sprites are made by Admiral Eisenberger",
"size": {
"x": 32,
"y": 32
@@ -53,6 +53,14 @@
{
"name": "animatronic",
"directions": 4
},
{
"name": "synt_m",
"directions": 4
},
{
"name": "synt_f",
"directions": 4
}
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 986 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 495 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 495 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 601 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 682 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 758 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 815 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 920 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

@@ -0,0 +1,44 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Made with love by Misha_Unity and Melissandra >//<",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "full"
},
{
"name": "body"
},
{
"name": "l_arm"
},
{
"name": "l_leg"
},
{
"name": "r_arm"
},
{
"name": "frame-0"
},
{
"name": "frame-1"
},
{
"name": "frame-2"
},
{
"name": "frame-3"
},
{
"name": "frame-4"
},
{
"name": "frame-5"
}
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 235 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 498 B

After

Width:  |  Height:  |  Size: 543 B