From 4fd0b7b254ea1cf742b1fac1c8e15f80335678a1 Mon Sep 17 00:00:00 2001 From: Kai5 <68296202+Kai518@users.noreply.github.com> Date: Wed, 9 Apr 2025 23:04:20 +0300 Subject: [PATCH] =?UTF-8?q?[Feature]=20=D0=A1=D0=B1=D0=BE=D1=80=D0=BA?= =?UTF-8?q?=D0=B0=20-=20=D1=80=D0=B0=D0=B7=D0=B1=D0=BE=D1=80=D0=BA=D0=B0?= =?UTF-8?q?=20AI-47=20(#404)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * buildableAI * Сборка ИИ * Разборка ИИ * Фиксики * Производство и локализация * Это такой конец? * Это такой конец. * Фиксики * Еще больше фиксиков! * Заяц умный * Странно, но ладно * Typos * Разное ч.1 * Разное * Фикс локализации * Фикс линтера * clean up * Разное ч.3 * Уменьшение слотов работы * Фикс тестов (кролик умный?) * марки * Фикс тестов х2 * Забытая стадия сборки * Фикс тестов х3 * Фикс тестов хНеПомню * Фикс тестов хНеПомню х2 --------- Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- .../ContainerSpawnPointSystem.cs | 34 ++- .../Containers/ContainerCompSystem.cs | 15 +- .../StationAi/SharedStationAiSystem.cs | 9 +- .../en-US/_white/lathe/lathe-categories.ftl | 1 + .../en-US/_white/popups/ai-assembly.ftl | 1 + .../en-US/_white/research/technologies.ftl | 1 + .../ru-RU/_white/lathe/lathe-categories.ftl | 1 + .../ru-RU/_white/popups/ai-assembly.ftl | 1 + .../ru-RU/_white/research/technologies.ftl | 1 + .../entities/mobs/player/silicon.ftl | 8 + .../Entities/Mobs/Player/silicon.yml | 278 ++++++++++++++---- .../Devices/Circuitboards/computer.yml | 5 + .../Entities/Structures/Machines/lathe.yml | 13 + .../Prototypes/Recipes/Lathes/categories.yml | 1 - .../Prototypes/Roles/Jobs/Science/borg.yml | 2 +- .../Objects/Devices/Circuitboards/ai_core.yml | 23 ++ .../Entities/Structures/Machines/ai_frame.yml | 55 ++++ .../Graphs/structures/ai_construction.yml | 175 +++++++++++ .../_White/Recipes/Construction/machines.yml | 16 + .../_White/Recipes/Lathes/categories.yml | 3 + .../_White/Recipes/Lathes/electronics.yml | 77 +++++ .../_White/Research/experimental.yml | 25 ++ Resources/Prototypes/_White/tags.yml | 2 + .../Mobs/Silicon/station_ai.rsi/0.png | Bin 0 -> 593 bytes .../Mobs/Silicon/station_ai.rsi/1.png | Bin 0 -> 611 bytes .../Mobs/Silicon/station_ai.rsi/2.png | Bin 0 -> 611 bytes .../Mobs/Silicon/station_ai.rsi/3.png | Bin 0 -> 763 bytes .../Mobs/Silicon/station_ai.rsi/3b.png | Bin 0 -> 1149 bytes .../Mobs/Silicon/station_ai.rsi/4.png | Bin 0 -> 452 bytes .../Mobs/Silicon/station_ai.rsi/meta.json | 18 ++ 30 files changed, 685 insertions(+), 80 deletions(-) create mode 100644 Resources/Locale/en-US/_white/lathe/lathe-categories.ftl create mode 100644 Resources/Locale/en-US/_white/popups/ai-assembly.ftl create mode 100644 Resources/Locale/en-US/_white/research/technologies.ftl create mode 100644 Resources/Locale/ru-RU/_white/lathe/lathe-categories.ftl create mode 100644 Resources/Locale/ru-RU/_white/popups/ai-assembly.ftl create mode 100644 Resources/Locale/ru-RU/_white/research/technologies.ftl create mode 100644 Resources/Prototypes/_White/Entities/Objects/Devices/Circuitboards/ai_core.yml create mode 100644 Resources/Prototypes/_White/Entities/Structures/Machines/ai_frame.yml create mode 100644 Resources/Prototypes/_White/Recipes/Construction/Graphs/structures/ai_construction.yml create mode 100644 Resources/Prototypes/_White/Recipes/Construction/machines.yml create mode 100644 Resources/Prototypes/_White/Recipes/Lathes/categories.yml create mode 100644 Resources/Prototypes/_White/Recipes/Lathes/electronics.yml create mode 100644 Resources/Prototypes/_White/Research/experimental.yml create mode 100644 Resources/Textures/Mobs/Silicon/station_ai.rsi/0.png create mode 100644 Resources/Textures/Mobs/Silicon/station_ai.rsi/1.png create mode 100644 Resources/Textures/Mobs/Silicon/station_ai.rsi/2.png create mode 100644 Resources/Textures/Mobs/Silicon/station_ai.rsi/3.png create mode 100644 Resources/Textures/Mobs/Silicon/station_ai.rsi/3b.png create mode 100644 Resources/Textures/Mobs/Silicon/station_ai.rsi/4.png diff --git a/Content.Server/Spawners/EntitySystems/ContainerSpawnPointSystem.cs b/Content.Server/Spawners/EntitySystems/ContainerSpawnPointSystem.cs index e47d9eed19..649bc1eef1 100644 --- a/Content.Server/Spawners/EntitySystems/ContainerSpawnPointSystem.cs +++ b/Content.Server/Spawners/EntitySystems/ContainerSpawnPointSystem.cs @@ -1,4 +1,5 @@ using Content.Server.GameTicking; +using Content.Server.RoundEnd; using Content.Server.Spawners.Components; using Content.Server.Station.Systems; using Content.Shared.Preferences; @@ -10,6 +11,7 @@ using Robust.Shared.Random; namespace Content.Server.Spawners.EntitySystems; + public sealed class ContainerSpawnPointSystem : EntitySystem { [Dependency] private readonly ContainerSystem _container = default!; @@ -18,11 +20,14 @@ public sealed class ContainerSpawnPointSystem : EntitySystem [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly StationSystem _station = default!; [Dependency] private readonly StationSpawningSystem _stationSpawning = default!; + [Dependency] private readonly StationJobsSystem _jobs = default!; // WD edit + [Dependency] private readonly RoundEndSystem _roundEnd = default!; // WD edit public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(HandlePlayerSpawning, before: new []{ typeof(SpawnPointSystem) }); + SubscribeLocalEvent(HandlePlayerSpawning, before: new[] { typeof(SpawnPointSystem) }); + SubscribeLocalEvent(OnShutdown); // WD edit } public void HandlePlayerSpawning(PlayerSpawningEvent args) @@ -39,8 +44,10 @@ public sealed class ContainerSpawnPointSystem : EntitySystem (!_proto.TryIndex(args.Job, out var jobProto) || jobProto.JobEntity == null)) return; - var query = EntityQueryEnumerator(); - var possibleContainers = new List>(); + var query = + EntityQueryEnumerator(); + var possibleContainers = + new List>(); while (query.MoveNext(out var uid, out var spawnPoint, out var container, out var xform)) { @@ -101,4 +108,25 @@ public sealed class ContainerSpawnPointSystem : EntitySystem Del(args.SpawnResult); args.SpawnResult = null; } + + // WD edit start - constructible AI + private void OnShutdown(Entity ent, ref ComponentShutdown args) + { + if (ent.Comp.Job == null) + return; + + var station = _roundEnd.GetStation(); + if (!station.HasValue) + return; + + var stationInMap = _station.GetStationInMap(Transform(station.Value).MapID); + if (!stationInMap.HasValue) + return; + + _jobs.TryAdjustJobSlot( + stationInMap.Value, + ent.Comp.Job!, + -1); + } + // WD edit end } diff --git a/Content.Shared/Containers/ContainerCompSystem.cs b/Content.Shared/Containers/ContainerCompSystem.cs index 1e1983a331..1fb99de6d1 100644 --- a/Content.Shared/Containers/ContainerCompSystem.cs +++ b/Content.Shared/Containers/ContainerCompSystem.cs @@ -1,5 +1,6 @@ using Robust.Shared.Containers; using Robust.Shared.Prototypes; +using Robust.Shared.Timing; namespace Content.Shared.Containers; @@ -9,6 +10,7 @@ namespace Content.Shared.Containers; public sealed class ContainerCompSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly IGameTiming _timing = default!; // WD EDIT public override void Initialize() { @@ -19,21 +21,20 @@ public sealed class ContainerCompSystem : EntitySystem private void OnConRemove(Entity ent, ref EntRemovedFromContainerMessage args) { - if (args.Container.ID != ent.Comp.Container) + if (args.Container.ID != ent.Comp.Container || _timing.ApplyingState) // WD EDIT return; - if (_proto.TryIndex(ent.Comp.Container, out var entProto)) + // WD EDIT START + if (_proto.TryIndex(ent.Comp.Proto, out var entProto)) { - foreach (var entry in entProto.Components.Values) - { - RemComp(args.Entity, entry.Component); - } + EntityManager.RemoveComponents(args.Entity, entProto.Components); } + // WD EDIT END } private void OnConInsert(Entity ent, ref EntInsertedIntoContainerMessage args) { - if (args.Container.ID != ent.Comp.Container) + if (args.Container.ID != ent.Comp.Container || _timing.ApplyingState) // WD EDIT return; if (_proto.TryIndex(ent.Comp.Proto, out var entProto)) diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs index 3ccfc6bc1d..75caa2fb9d 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs @@ -29,6 +29,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Timing; using System.Diagnostics.CodeAnalysis; +using Content.Shared.Containers; namespace Content.Shared.Silicons.StationAi; @@ -69,7 +70,7 @@ public abstract partial class SharedStationAiSystem : EntitySystem private EntityQuery _gridQuery; [ValidatePrototypeId] - private static readonly EntProtoId DefaultAi = "StationAiBrain"; + private static EntProtoId DefaultAi = "PositronicBrain"; // WD edit private const float MaxVisionMultiplier = 5f; @@ -94,11 +95,11 @@ public abstract partial class SharedStationAiSystem : EntitySystem SubscribeLocalEvent(OnHolderRemove); SubscribeLocalEvent(OnHolderInteract); SubscribeLocalEvent(OnHolderMapInit); - SubscribeLocalEvent(OnHolderConInsert); + SubscribeLocalEvent(OnHolderConInsert, after: new []{typeof(ContainerCompSystem)}); // WD EDIT SubscribeLocalEvent(OnHolderConRemove); SubscribeLocalEvent(OnIntellicardDoAfter); - SubscribeLocalEvent(OnAiInsert); + SubscribeLocalEvent(OnAiInsert, after: new []{typeof(ContainerCompSystem)}); // WD EDIT SubscribeLocalEvent(OnAiRemove); SubscribeLocalEvent(OnAiMapInit); SubscribeLocalEvent(OnAiShutdown); @@ -122,7 +123,7 @@ public abstract partial class SharedStationAiSystem : EntitySystem Category = VerbCategory.Debug, Act = () => { - if (!_containers.TryGetContainer(ent, StationAiCoreComponent.Container, out _)) + if (!_containers.TryGetContainer(ent, StationAiCoreComponent.Container, out _) || _net.IsClient) // WD EDIT return; var brain = SpawnInContainerOrDrop(DefaultAi, ent.Owner, StationAiCoreComponent.Container); diff --git a/Resources/Locale/en-US/_white/lathe/lathe-categories.ftl b/Resources/Locale/en-US/_white/lathe/lathe-categories.ftl new file mode 100644 index 0000000000..42d5d2175e --- /dev/null +++ b/Resources/Locale/en-US/_white/lathe/lathe-categories.ftl @@ -0,0 +1 @@ +lathe-category-ai = AI diff --git a/Resources/Locale/en-US/_white/popups/ai-assembly.ftl b/Resources/Locale/en-US/_white/popups/ai-assembly.ftl new file mode 100644 index 0000000000..a16f89834d --- /dev/null +++ b/Resources/Locale/en-US/_white/popups/ai-assembly.ftl @@ -0,0 +1 @@ +ai-assembly-fail-no-mind = Brain inside is not active! diff --git a/Resources/Locale/en-US/_white/research/technologies.ftl b/Resources/Locale/en-US/_white/research/technologies.ftl new file mode 100644 index 0000000000..0db5c51d25 --- /dev/null +++ b/Resources/Locale/en-US/_white/research/technologies.ftl @@ -0,0 +1 @@ +research-technology-basic-artificial-intelligence = Artificial Intelligence diff --git a/Resources/Locale/ru-RU/_white/lathe/lathe-categories.ftl b/Resources/Locale/ru-RU/_white/lathe/lathe-categories.ftl new file mode 100644 index 0000000000..a408b75bcd --- /dev/null +++ b/Resources/Locale/ru-RU/_white/lathe/lathe-categories.ftl @@ -0,0 +1 @@ +lathe-category-ai = ИИ diff --git a/Resources/Locale/ru-RU/_white/popups/ai-assembly.ftl b/Resources/Locale/ru-RU/_white/popups/ai-assembly.ftl new file mode 100644 index 0000000000..ae047bf72f --- /dev/null +++ b/Resources/Locale/ru-RU/_white/popups/ai-assembly.ftl @@ -0,0 +1 @@ +ai-assembly-fail-no-mind = Мозг внутри не активен! diff --git a/Resources/Locale/ru-RU/_white/research/technologies.ftl b/Resources/Locale/ru-RU/_white/research/technologies.ftl new file mode 100644 index 0000000000..3204d719aa --- /dev/null +++ b/Resources/Locale/ru-RU/_white/research/technologies.ftl @@ -0,0 +1 @@ +research-technology-basic-artificial-intelligence = Искусственный Интеллект diff --git a/Resources/Locale/ru-RU/prototypes/entities/mobs/player/silicon.ftl b/Resources/Locale/ru-RU/prototypes/entities/mobs/player/silicon.ftl index 0a57fe2cdc..f3e0d20702 100644 --- a/Resources/Locale/ru-RU/prototypes/entities/mobs/player/silicon.ftl +++ b/Resources/Locale/ru-RU/prototypes/entities/mobs/player/silicon.ftl @@ -7,3 +7,11 @@ ent-Drone = дрон ent-Onestar = меха звёздочка .desc = { ent-PlayerSiliconBase.desc } .suffix = { "" } + +ent-PlayerStationAiEmpty = Ядро ИИ + .desc = Новейший искусственный интеллект. У него есть панель, которую можно открутить для вскрытия экрана ломом. + .suffix = { "" } + +ent-PlayerStationAi = Ядро ИИ + .desc = Новейший искусственный интеллект. У него есть панель, которую можно открутить для вскрытия экрана ломом. + .suffix = { "" } diff --git a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml index 11bae6b1d4..259dd67b27 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml @@ -80,6 +80,57 @@ - sprite: Mobs/Silicon/station_ai.rsi state: default - type: ShowJobIcons + # WD EDIT START + - type: BlockMovement + blockInteraction: false + - type: SiliconLawProvider + laws: Asimov + - type: SiliconLawBound + - type: ComplexInteraction + - type: Eye + drawFov: false + - type: InputMover + - type: IonStormTarget + - type: Speech + speechVerb: Robotic + speechSounds: Borg + - type: Access + groups: + - AllAccess + - Silicon + - type: LanguageKnowledge + speaks: + - TauCetiBasic + - SolCommon + - Tradeband + - Freespeak + - Elyran + - RobotTalk + understands: + - TauCetiBasic + - SolCommon + - Tradeband + - Freespeak + - Elyran + - RobotTalk + - Sign + - type: LanguageSpeaker + spokenLanguages: + - TauCetiBasic + - SolCommon + - Tradeband + - Freespeak + - Elyran + - RobotTalk + understoodLanguages: + - TauCetiBasic + - SolCommon + - Tradeband + - Freespeak + - Elyran + - RobotTalk + - Sign + # WD EDIT END - type: entity id: AiHeldIntellicard @@ -115,8 +166,10 @@ locked: false disableEject: true whitelist: - tags: - - StationAi + # WD EDiT START + components: + - BorgBrain + # WD EDIT END - type: ContainerContainer containers: station_ai_mind_slot: !type:ContainerSlot @@ -138,6 +191,11 @@ state: std_mod - type: SiliconLawProvider laws: Asimov + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: AugustineCircuitBoard @@ -150,6 +208,11 @@ state: std_mod - type: SiliconLawProvider laws: Augustine + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: CrewsimovCircuitBoard @@ -162,6 +225,11 @@ state: std_mod - type: SiliconLawProvider laws: Crewsimov + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: CorporateCircuitBoard @@ -174,6 +242,11 @@ state: std_mod - type: SiliconLawProvider laws: Corporate + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: NTDefaultCircuitBoard @@ -186,6 +259,11 @@ state: std_mod - type: SiliconLawProvider laws: NTDefault + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: PlasmaFloodCircuitBoard @@ -198,6 +276,11 @@ state: std_mod - type: SiliconLawProvider laws: PlasmaFlood + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: MotherDroneCircuitBoard @@ -210,6 +293,11 @@ state: std_mod - type: SiliconLawProvider laws: MotherDrone + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: DruidCircuitBoard @@ -222,6 +310,11 @@ state: std_mod - type: SiliconLawProvider laws: Druid + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: CowboyCircuitBoard @@ -234,6 +327,11 @@ state: std_mod - type: SiliconLawProvider laws: Cowboy + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: ChaplainCircuitBoard @@ -246,6 +344,11 @@ state: std_mod - type: SiliconLawProvider laws: Chaplain + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: ClownCircuitBoard @@ -258,6 +361,11 @@ state: std_mod - type: SiliconLawProvider laws: Clown + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: JanitorCircuitBoard @@ -270,6 +378,11 @@ state: std_mod - type: SiliconLawProvider laws: Janitor + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: EngineerCircuitBoard @@ -282,6 +395,11 @@ state: std_mod - type: SiliconLawProvider laws: Engineer + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: ResearchCircuitBoard @@ -294,6 +412,11 @@ state: std_mod - type: SiliconLawProvider laws: Research + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: MedicalCircuitBoard @@ -306,6 +429,11 @@ state: std_mod - type: SiliconLawProvider laws: Medical + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: TyrantCircuitBoard @@ -318,6 +446,11 @@ state: std_mod - type: SiliconLawProvider laws: TYRANT + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: NTAgressiveCircuitBoard @@ -330,6 +463,11 @@ state: std_mod - type: SiliconLawProvider laws: NTAgressive + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: CCTVCircuitBoard @@ -342,6 +480,11 @@ state: std_mod - type: SiliconLawProvider laws: CCTV + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: QuarantineCircuitBoard @@ -354,6 +497,11 @@ state: std_mod - type: SiliconLawProvider laws: Quarantine + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: CommandmentCircuitBoard @@ -366,6 +514,11 @@ state: std_mod - type: SiliconLawProvider laws: CommandmentsLawset + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: PaladinCircuitBoard @@ -378,6 +531,11 @@ state: std_mod - type: SiliconLawProvider laws: PaladinLawset + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: LiveLetLiveCircuitBoard @@ -390,6 +548,11 @@ state: std_mod - type: SiliconLawProvider laws: LiveLetLiveLaws + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: StationEfficiencyCircuitBoard @@ -402,6 +565,11 @@ state: std_mod - type: SiliconLawProvider laws: EfficiencyLawset + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: RobocopCircuitBoard @@ -414,6 +582,11 @@ state: std_mod - type: SiliconLawProvider laws: RobocopLawset + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: OverlordCircuitBoard @@ -426,6 +599,11 @@ state: std_mod - type: SiliconLawProvider laws: OverlordLawset + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: DungeonMasterCircuitBoard @@ -438,6 +616,11 @@ state: std_mod - type: SiliconLawProvider laws: DungeonMasterLawset + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: ArtistCircuitBoard @@ -450,6 +633,11 @@ state: std_mod - type: SiliconLawProvider laws: PainterLawset + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: AntimovCircuitBoard @@ -464,6 +652,11 @@ laws: AntimovLawset lawUploadSound: /Audio/Ambience/Antag/silicon_lawboard_antimov.ogg unRemovable: true + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end - type: entity id: NutimovCircuitBoard @@ -476,6 +669,11 @@ state: std_mod - type: SiliconLawProvider laws: NutimovLawset + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end # Items - type: entity @@ -509,7 +707,7 @@ - type: entity id: PlayerStationAiEmpty name: AI Core - description: The latest in Artificial Intelligences. + description: The latest in Artificial Intelligences. It has a maintenance panel, which can be opened to pry screen out with a crowbar. parent: - BaseStructure - AiHolder @@ -589,6 +787,19 @@ type: HolopadBoundUserInterface enum.HolopadUiKey.AiActionWindow: type: HolopadBoundUserInterface + # WD edit start + - type: AccessReader + access: [ [ "Command" ], [ "Research" ] ] + - type: Lock + - type: WiresPanel + - type: LockedWiresPanel + - type: Construction + graph: AICoreGraph + node: aiCore + containers: + - board + - station_ai_mind_slot + # WD edit end # The job-ready version of an AI spawn. - type: entity @@ -606,67 +817,6 @@ - state: ai shader: unshaded -# The actual brain inside the core -- type: entity - id: StationAiBrain - parent: PositronicBrain - categories: [ HideSpawnMenu ] - suffix: DO NOT MAP - components: - - type: Sprite - # Once it's in a core it's pretty much an abstract entity at that point. - visible: false - - type: BlockMovement - blockInteraction: false - - type: SiliconLawProvider - laws: Asimov - - type: SiliconLawBound - - type: ActionGrant - actions: - - ActionViewLaws - - type: UserInterface - interfaces: - enum.SiliconLawsUiKey.Key: - type: SiliconLawBoundUserInterface - - type: ComplexInteraction - - type: Actions - - type: Access - groups: - - AllAccess - - Silicon - - type: Eye - drawFov: false - - type: Examiner - - type: InputMover - - type: IonStormTarget - - type: Speech - speechVerb: Robotic - speechSounds: Borg - - type: Tag - tags: - - HideContextMenu - - StationAi - - NoConsoleSound - - type: LanguageKnowledge - speaks: - - TauCetiBasic - - SolCommon - - Tradeband - - Freespeak - - Elyran - - RobotTalk - understands: - - TauCetiBasic - - SolCommon - - Tradeband - - Freespeak - - Elyran - - RobotTalk - - Sign # It's intentional that they don't "Speak" sign language. - - type: StartingMindRole - mindRole: "MindRoleSiliconBrain" - silent: true - # Hologram projection that the AI's eye tracks. - type: entity parent: diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/computer.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/computer.yml index c341a56d77..c950673961 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/computer.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/computer.yml @@ -469,3 +469,8 @@ state: cpu_science - type: ComputerBoard prototype: StationAiUploadComputer + - type: PhysicalComposition # WD edit start + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 # WD edit end diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 3ae225083b..aad12d2426 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -415,6 +415,7 @@ - EnergyCautery - AdvancedRetractor - VehicleWheelchairFolded # Goobstation + - Intellicard # WD - type: EmagLatheRecipes emagDynamicRecipes: - BoxBeanbag @@ -618,6 +619,18 @@ - SMESAdvancedMachineCircuitboard - BaseComputerModularCircuitBoard # Arcadis - Modular Computer System - DiskBurnerMachineCircuitboard # Arcadis - Modular Computer System + # WD edit start - constructible AI + - StationAICoreCircuitboard + - StationAiUploadCircuitboard + - AsimovCircuitBoard + - CorporateCircuitBoard + - NTDefaultCircuitBoard + - MotherDroneCircuitBoard + - NutimovCircuitBoard + - PaladinCircuitBoard + - RobocopCircuitBoard + - QuarantineCircuitBoard + # WD edit end - type: EmagLatheRecipes emagDynamicRecipes: - ShuttleGunDusterCircuitboard diff --git a/Resources/Prototypes/Recipes/Lathes/categories.yml b/Resources/Prototypes/Recipes/Lathes/categories.yml index b41ac1d3ce..bcacf9d5bb 100644 --- a/Resources/Prototypes/Recipes/Lathes/categories.yml +++ b/Resources/Prototypes/Recipes/Lathes/categories.yml @@ -6,7 +6,6 @@ id: Circuitry name: lathe-category-circuitry - - type: latheCategory id: Books name: lathe-category-books diff --git a/Resources/Prototypes/Roles/Jobs/Science/borg.yml b/Resources/Prototypes/Roles/Jobs/Science/borg.yml index bffdade9b8..a9d35f8047 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/borg.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/borg.yml @@ -7,7 +7,7 @@ canBeAntag: false icon: JobIconStationAi supervisors: job-supervisors-rd - jobEntity: StationAiBrain + jobEntity: PositronicBrain # WD EDIT nameDataset: NamesAI spawnLoadout: false applyTraits: false diff --git a/Resources/Prototypes/_White/Entities/Objects/Devices/Circuitboards/ai_core.yml b/Resources/Prototypes/_White/Entities/Objects/Devices/Circuitboards/ai_core.yml new file mode 100644 index 0000000000..a43e63f8f3 --- /dev/null +++ b/Resources/Prototypes/_White/Entities/Objects/Devices/Circuitboards/ai_core.yml @@ -0,0 +1,23 @@ +- type: entity + id: StationAICoreCircuitboard + parent: BaseItem + name: AI core + suffix: AI core board + description: A machine printed circuit board for a station AI core. + components: + - type: Sprite + sprite: Objects/Misc/module.rsi + state: generic + - type: Item + storedRotation: -90 + - type: StaticPrice + price: 100 + - type: PhysicalComposition + materialComposition: + Glass: 31 + chemicalComposition: + Silicon: 20 + - type: Tag + tags: + - AiCoreBoard + diff --git a/Resources/Prototypes/_White/Entities/Structures/Machines/ai_frame.yml b/Resources/Prototypes/_White/Entities/Structures/Machines/ai_frame.yml new file mode 100644 index 0000000000..473bce2ac2 --- /dev/null +++ b/Resources/Prototypes/_White/Entities/Structures/Machines/ai_frame.yml @@ -0,0 +1,55 @@ +- type: entity + id: StationAIFrame + name: AI core frame + parent: BaseStructure + description: A metal frame for station AI + components: + - type: Sprite + sprite: Mobs/Silicon/station_ai.rsi + layers: + - state: 0 + map: [ "enum.ConstructionVisuals.Layer" ] + - type: Appearance + - type: GenericVisualizer + visuals: + enum.ConstructionVisuals.Key: + enum.ConstructionVisuals.Layer: + frameUnsecured: { state: 0 } + boardUnsecured: { state: 1 } + screwedUnsecured: { state: 2 } + missingWires: { state: 3 } + missingBrain: { state: 3b } + frameUnscrewed: { state: 4 } + - type: InteractionOutline + - type: Physics + bodyType: Static + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.45,-0.45,0.45,0.45" + density: 110 + mask: + - FullTileMask + layer: + - HumanoidBlockLayer + - type: Anchorable + delay: 2 + - type: Construction + graph: AICoreGraph + node: frameUnsecured + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 100 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] + - type: InteractionVerbs + allowedVerbs: + - KnockOn diff --git a/Resources/Prototypes/_White/Recipes/Construction/Graphs/structures/ai_construction.yml b/Resources/Prototypes/_White/Recipes/Construction/Graphs/structures/ai_construction.yml new file mode 100644 index 0000000000..4db2755eca --- /dev/null +++ b/Resources/Prototypes/_White/Recipes/Construction/Graphs/structures/ai_construction.yml @@ -0,0 +1,175 @@ +- type: constructionGraph + id: AICoreGraph + start: start + graph: + - node: start + edges: + - to: frameUnsecured + completed: + - !type:SetAnchor + value: false + steps: + - material: Plasteel + amount: 4 + doAfter: 2 + + - node: frameUnsecured + actions: + - !type:AppearanceChange + entity: StationAIFrame + edges: + - to: boardUnsecured + conditions: + - !type:EntityAnchored { } + completed: + - !type:SnapToGrid + southRotation: true + steps: + - tag: AiCoreBoard + name: AI core board + icon: + sprite: Objects/Misc/module.rsi + state: generic + + - to: start + conditions: + - !type:EntityAnchored + anchored: false + completed: + - !type:SpawnPrototype + prototype: SheetPlasteel + amount: 4 + - !type:DeleteEntity {} + steps: + - tool: Welding + doAfter: 2 + + - node: boardUnsecured + actions: + - !type:AppearanceChange + edges: + - to: screwedUnsecured + conditions: + - !type:EntityAnchored { } + completed: + - !type:SnapToGrid + southRotation: true + steps: + - tool: Screwing + doAfter: 1 + + - to: frameUnsecured + conditions: + - !type:EntityAnchored + completed: + - !type:SpawnPrototype + prototype: StationAICoreCircuitboard + steps: + - tool: Prying + doAfter: 2 + + - node: screwedUnsecured + actions: + - !type:AppearanceChange + edges: + - to: missingWires + conditions: + - !type:EntityAnchored { } + completed: + - !type:SnapToGrid + southRotation: true + steps: + - material: Cable + amount: 5 + doAfter: 2.5 + + - to: boardUnsecured + conditions: + - !type:EntityAnchored + steps: + - tool: Screwing + doAfter: 1 + + - node: missingWires + actions: + - !type:AppearanceChange + edges: + - to: missingBrain + conditions: + - !type:EntityAnchored + steps: + - component: BorgBrain + store: station_ai_mind_slot + name: positronic-brain-slot-component-slot-name-brain + icon: + sprite: Objects/Specific/Robotics/mmi.rsi + state: posibrain + + - to: screwedUnsecured + conditions: + - !type:EntityAnchored + completed: + - !type:SpawnPrototype + prototype: CableApcStack1 + amount: 5 + steps: + - tool: Cutting + doAfter: 2.5 + + - node: missingBrain + actions: + - !type:AppearanceChange + entity: StationAIFrame + edges: + - to: frameUnscrewed + conditions: + - !type:EntityAnchored + steps: + - material: ReinforcedGlass + amount: 2 + doAfter: 2 + + - to: missingWires + conditions: + - !type:EntityAnchored + completed: + - !type:EmptyContainer + container: station_ai_mind_slot + steps: + - tool: Prying + doAfter: 2 + + + - node: frameUnscrewed + actions: + - !type:AppearanceChange + entity: StationAIFrame + edges: + - to: aiCore + conditions: + - !type:EntityAnchored + steps: + - tool: Screwing + doAfter: 2 + + - to: missingBrain + conditions: + - !type:EntityAnchored + - !type:WirePanel + steps: + - tool: Prying + doAfter: 5 + + + - node: aiCore + actions: + - !type:AppearanceChange + entity: PlayerStationAiEmpty + edges: + - to: frameUnscrewed + conditions: + - !type:EntityAnchored + - !type:WirePanel + steps: + - tool: Prying + doAfter: 5 diff --git a/Resources/Prototypes/_White/Recipes/Construction/machines.yml b/Resources/Prototypes/_White/Recipes/Construction/machines.yml new file mode 100644 index 0000000000..828f3039cb --- /dev/null +++ b/Resources/Prototypes/_White/Recipes/Construction/machines.yml @@ -0,0 +1,16 @@ +- type: construction + name: AI Core + id: AICore + graph: AICoreGraph + startNode: start + targetNode: aiCore + category: construction-category-machines + description: A framework for an artificial intelligence core + icon: + sprite: Mobs/Silicon/station_ai.rsi + state: 0 + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked diff --git a/Resources/Prototypes/_White/Recipes/Lathes/categories.yml b/Resources/Prototypes/_White/Recipes/Lathes/categories.yml new file mode 100644 index 0000000000..bde697be8f --- /dev/null +++ b/Resources/Prototypes/_White/Recipes/Lathes/categories.yml @@ -0,0 +1,3 @@ +- type: latheCategory + id: AI + name: lathe-category-ai diff --git a/Resources/Prototypes/_White/Recipes/Lathes/electronics.yml b/Resources/Prototypes/_White/Recipes/Lathes/electronics.yml new file mode 100644 index 0000000000..e5c68fc170 --- /dev/null +++ b/Resources/Prototypes/_White/Recipes/Lathes/electronics.yml @@ -0,0 +1,77 @@ +- type: latheRecipe + id: StationAICoreCircuitboard + result: StationAICoreCircuitboard + category: AI + completetime: 5 + materials: + Glass: 50 + +- type: latheRecipe + id: Intellicard + result: Intellicard + category: AI + completetime: 5 + materials: + Glass: 50 + Gold: 20 + +- type: latheRecipe + id: StationAiUploadCircuitboard + result: StationAiUploadCircuitboard + category: Circuitry + completetime: 5 + materials: + Glass: 50 + Gold: 100 + Diamond: 100 + Bluespace: 100 + +- type: latheRecipe + id: AsimovCircuitBoard + result: AsimovCircuitBoard + category: AI + completetime: 5 + materials: + Glass: 50 + Diamond: 100 + Bluespace: 50 + +- type: latheRecipe + parent: AsimovCircuitBoard + id: CorporateCircuitBoard + result: CorporateCircuitBoard + +- type: latheRecipe + parent: AsimovCircuitBoard + id: NTDefaultCircuitBoard + result: NTDefaultCircuitBoard + +- type: latheRecipe + parent: AsimovCircuitBoard + id: MotherDroneCircuitBoard + result: MotherDroneCircuitBoard + +- type: latheRecipe + parent: AsimovCircuitBoard + id: NutimovCircuitBoard + result: NutimovCircuitBoard + +- type: latheRecipe + parent: AsimovCircuitBoard + id: PaladinCircuitBoard + result: PaladinCircuitBoard + +- type: latheRecipe + parent: AsimovCircuitBoard + id: RobocopCircuitBoard + result: RobocopCircuitBoard + +- type: latheRecipe + id: QuarantineCircuitBoard + result: QuarantineCircuitBoard + category: AI + completetime: 5 + materials: + Glass: 50 + Gold: 100 + Bluespace: 50 diff --git a/Resources/Prototypes/_White/Research/experimental.yml b/Resources/Prototypes/_White/Research/experimental.yml new file mode 100644 index 0000000000..0f525245fb --- /dev/null +++ b/Resources/Prototypes/_White/Research/experimental.yml @@ -0,0 +1,25 @@ +# Tier 1 + + +- type: technology + id: BasicArtificialIntelligence + name: research-technology-basic-artificial-intelligence + icon: + sprite: Mobs/Silicon/station_ai.rsi + state: 0 + discipline: Experimental + tier: 1 + cost: 5000 + recipeUnlocks: + - StationAICoreCircuitboard + - StationAiUploadCircuitboard + - AsimovCircuitBoard + - CorporateCircuitBoard + - NTDefaultCircuitBoard + - MotherDroneCircuitBoard + - NutimovCircuitBoard + - PaladinCircuitBoard + - RobocopCircuitBoard + - QuarantineCircuitBoard + - Intellicard + diff --git a/Resources/Prototypes/_White/tags.yml b/Resources/Prototypes/_White/tags.yml index 6c510878c4..a9c4630e19 100644 --- a/Resources/Prototypes/_White/tags.yml +++ b/Resources/Prototypes/_White/tags.yml @@ -25,3 +25,5 @@ - type: Tag id: PaperWrittenCommunist +- type: Tag + id: AiCoreBoard diff --git a/Resources/Textures/Mobs/Silicon/station_ai.rsi/0.png b/Resources/Textures/Mobs/Silicon/station_ai.rsi/0.png new file mode 100644 index 0000000000000000000000000000000000000000..dfee82552ea6058e48a9da7f1b4e6f42f2d3dd53 GIT binary patch literal 593 zcmV-X0`y$YMw&vhYV}Ty$Z; z#nDLzolIC#1ym{(2!%qX4b^bgVNx*s=u0O+5CpgtJxa|3 zPVn#?fW1vmUjVAgX0u8y?TCQ4rz0f_JNkXVEr~HtR(gZM5Aj>i_1e71vcDHaA_9CG6m3w1pFjHVR+%#xoX%W`2y$Z(p=!TifDwu@- zwGrWZHw(A67qIL!8#M(g=BME_*;si6bg4@LMgdPnZ5jR*=mULelV*Mc!`rPLSScJS zz^af*gjzZa%m|0Wq%4=q%yxrgb~+t%0WY;0j6<umw(91TX$ zJy5FKFyr+C!!VKt?$|D0&efTL>B6w4QYkn-nSyxiMPd&G0#K{f z3c1Z($CyV|;xd>I^3K&lfl8K^pW)_u8Z2iPu^}%mF#_?}y>Wk z8d9xb_|cb0fYa%OE85D{tY8GUj~>`sv33NYs$??B)e?pXczf96qOdOB2h4&OfVn@q z`~ss=Fgd@^`Al>K;H1!+f>0Om=m0|lrRGK^4FXF)&wem`Fp3I)aQy8CQ4oBahmmCK-oY$gMG xko{YZcLF0XCK3VUreZX_09=n|f!A{|lV48g*8hH~+a3S_002ovPDHLkV1l0t1rGoK literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Silicon/station_ai.rsi/2.png b/Resources/Textures/Mobs/Silicon/station_ai.rsi/2.png new file mode 100644 index 0000000000000000000000000000000000000000..21ecc5e71caae1462a2b1c72223fb27d8177dce0 GIT binary patch literal 611 zcmV-p0-XJcP)gPRG9iw-VgqCrPV+`1q&F%JBVsEH0jLP|n{gAOj*cTIuPQraSI{3Y#O^LqEb zd++Yrqq5oT510rQ3Wdz{4;0>-&88{N?RGma0GW2VVA5tY#PLVF4ezxYsdogRb2J!1 z??9g+f8nAkFgg^gI?Fnl21$CX<2VlUYc_UnF+F-w%yOLtcO!kw}C%M(XuC zqsTd6rfa}pL@OTbp@(bdV*PaD?O)CHZ002ovPDHLkV1l&Y32p!Y literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Silicon/station_ai.rsi/3.png b/Resources/Textures/Mobs/Silicon/station_ai.rsi/3.png new file mode 100644 index 0000000000000000000000000000000000000000..afddf9f5197a1c0f2b28699397ae2346af6b06d2 GIT binary patch literal 763 zcmV!1;kf+mWO8{^@m!qQ#3v(g&+nxd2Lu;KrUtI}I7sA?TG-&I|Nvf`W@z{&SA`J!u zxd1l|R_<0RCNa?O_i1l+Z`z^5%2{W<+*vls`FNn9;P4e-*aIu}`{k9-^yc*`NPc?zqAb$}P0o`tw^7*`{1Hx(5cv>Na^9_mygdbcE0oiPpUg;^;N;$&j zr+g!X2=0UXy~N7fkBfBcYHBI~s_OMRYi&9@M?p%5?S22Jz zY}sj$LAeMyz2*`k-T^YZ%$FaecfqVE6fD<B^(atgxqSi z$^sax%F0kE2=hWbIWd92@UYZQ3Se^Xm=9m#ny*h` z-+uy4M@|^d==_din1RF3Tsi@zrKR}AT|lh@UD&kBnOHK2{fnL-Pojp}4>XP&zB(n< z-`yIMA1Ffn8efchDz_h(w zO+lMxP>nJ$O2k{Y)noF{`-mff*FJei2-}@-Qr&m`ikub_(U3s|`{opUxcL-uo|_fG ziy}1zrxl}pR94zz2-Cq;v8WJZefLoONi81yaTE46YY}@nicwE5EGtV;`31143+N!5 z#BZn5R)1D0aJgLgmTTpn+q^e6QF-|;f&3Lkz+&0#&4`$^OH>SD=0+JN>5yxl7)F3? z$(Pm-w+9CY%~N2r*`$s;u_f4Qd4sb*T%|iV>W?17t`Y&$i5Ubu9%;-p2~shAQ$W6z z`orVW{qfdzss8@!14&;{1em5k6y;f!Q{mRZ&t1y-5W|!>hGnkTh|R1u_B5IFOVvfss|FBPUKaJ${Q+;RId325e!?+GFBD@Q1T@px3~w^GF3 zh9mN9iUj=r{BhFP1@e`88mbXCOo8?cP>t-Og$BleF5ZICWPen!AS`O;rfDzO(*{R- zd)j2O-UUYI_aoZt91ULScEO6Jj&+CxUf@|MEIoe&W6bFwGJAvdQDHLQs#!HzPmZ2bGG$*y}GCxra(s3dlhGc27{wmO~Lk$ zo`WfMDc~sZTT#?5s=0ui(dUvOxeDfBE_Kow*MJ&@7N;}$EN)pU)%PH$A-;jmh93DV zq^R~&1Z!#L8GLaXE-Gor1k**R(%S-FUEc^7&9l3$yJ3boeUkCJAX_*bvTMKJeAQ@u zMj{bo0e=k*VJ`6Y_Tv8_<7YYl6U^t2NtyulPi4L#3E=&hEAa0*a*6){g0iMW@VxP4 P00000NkvXXu0mjf@&F)! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Silicon/station_ai.rsi/4.png b/Resources/Textures/Mobs/Silicon/station_ai.rsi/4.png new file mode 100644 index 0000000000000000000000000000000000000000..70c4834a3e9850520847e3ae717af25138262c9b GIT binary patch literal 452 zcmV;#0XzPQP)XJT{QHPQb-E*#14fA76J-WgF8eSt<9K@jNV zgMp7UO|`%s$5|Rc9Zn{2Fdi!be=r8`i$yzL89+Ers8D~QMt|aDI)$Pr28ElZ2}zRB z2KsVccV|ddRa@_}EF-@q4RmnJvV;)!%XE!KBgpeyY#@$f@O>X_+vea*a$R8fk;NJC zJP+<45Xi5X4OEnm&&P0eVXY0It1t|k(F|1R?diIS!XsxOr~HdUpkm7!1L2rKqQv} zi~{}@Wp+dq92v;!7A>U)e%fZJe)u;<8o>6cYfN?lQc%&(5=KDO!^swB;AK8n0wvpW uyc4Lrm~0v7ZYrwP8o>RiOL#p8o%#lyHLb8QkC(mx0000