From d5e43ee14b3584112883e272bc725b7b5f70fdc5 Mon Sep 17 00:00:00 2001 From: DevArchwave <168038123+DevArchwave@users.noreply.github.com> Date: Fri, 22 May 2026 20:00:31 -0300 Subject: [PATCH 01/17] Ports: Hardlight's Port of Far Horizons' Nuclear Reactor (And subsequent fixes) (#895) * Nuclear reactor and gas turbine port (#632) * [PORT] | NUCLEAR GENERATOR (#2242) Co-authored-by: jhrushbe Co-authored-by: funkystationbot Co-authored-by: taydeo * post port fixes * looks like it removed this? --------- Co-authored-by: rottenheadphones Co-authored-by: jhrushbe Co-authored-by: funkystationbot Co-authored-by: taydeo * Nuclear reactor improvements and radiation overhaul reversion (#633) * Merge pull request #456 from jhrushbe/reactor-content-update-3 Reactor Content Update 3 * Merge pull request #471 from jhrushbe/small-reactors Small Reactors * Merge pull request #493 from jhrushbe/reactor-content-update-4 Reactor Content Update 4 * Revert "Merge pull request #250 from warcrazed11/fuckyousm" This reverts commit 90ba49fa6f06b19bf66bd5f2fe5b398d002d68c2, reversing changes made to 0d6f48474ef950a6e266aec9951e69e116328fe1. * reactor shitsa * thought i could get away with leaving that in, linter said no no * WAWA --------- Co-authored-by: mogaiskii Co-authored-by: princess-gurchi * Update nuclear_machines.yml (#642) * Boost nuclear waste rad strength * Increase meltdown radiation * Turbine UI Fix (#640) You can now actually adjust the flow rate and stator load on the turbine. * Nuclear reactor updates. (#971) * Merge pull request #526 from jhrushbe/reactor-content-update-5 Reactor Content Update 5 * Update TurbineSystem.cs * Merge pull request #578 from jhrushbe/reactor-content-update-6 Reactor Content Update 6 * Merge pull request #583 from Far-Horizons-SS14/reactor-content-6-hotfix Fix reactor content update 6 bad import * Merge pull request #591 from jhrushbe/rcu6-hotfix Reactor Content Update 6 Hotfix * Merge pull request #677 from jhrushbe/reactor-content-update-7 Reactor Content Update 7 * Merge pull request #694 from jhrushbe/rcu7-hotfix-1 Reactor Content 7 Hotfix 1 * Merge pull request #809 from jhrushbe/rcu8-hotfix-1 Reactor Content Update 8 Hotfix * build fixes * yamlfixa * appease linter --------- Co-authored-by: mogaiskii Co-authored-by: CorruptOmega <207436787+CorruptOmega@users.noreply.github.com> Co-authored-by: princess-gurchi * Power to the People (#1015) :cl: - tweak: The Nuclear Fabricator Machine Board can now be made in the circuit imprinter with proper research. - add: The Small Nuclear Reactor, Small Turbine, and TEG can now be bought at Cargo. * Port reactor performance optimizations from Far Horizons and Starlight (#1325) * Enhance nuclear reactor performance with optimizations and buffer additions * Fix reactor init indentation * Whoops, duplicate entry, begone. * Revert FH's material pricing changes * VSCode is fucking insane and changed the headers of these files for no reason * Revert FH changes to frontier's changes of the singularity radiation intensity * Wayfarer: Functional Research * access to researchable parts + some reverts * Reverts + Radiation Blocker Protector BP * More wayfarer changes * Nerfing rad sources * Local alerts + New meltdown alarm? * Fix sprite path, actual global sounds * Oh hey I fixed turbine flow. * What was that doing there. * And this too. * Turns out starlight also fixed this just now so I'm making sure the change aligns to theirs. * Removes access lock --------- Co-authored-by: Gilm-Banalz Co-authored-by: rottenheadphones Co-authored-by: jhrushbe Co-authored-by: funkystationbot Co-authored-by: taydeo Co-authored-by: mogaiskii Co-authored-by: princess-gurchi Co-authored-by: TrylobyteWasTaken Co-authored-by: CorruptOmega <207436787+CorruptOmega@users.noreply.github.com> Co-authored-by: Kronyxxx --- .../FissionGenerator/NuclearReactorSystem.cs | 94 ++ .../FissionGenerator/ReactorPartSystem.cs | 40 + .../FissionGenerator/TurbineSystem.cs | 147 +++ .../UI/NuclearReactorBoundUserInterface.cs | 89 ++ .../Power/UI/NuclearReactorWindow.xaml | 150 +++ .../Power/UI/NuclearReactorWindow.xaml.cs | 410 +++++++ .../Power/UI/TurbineBoundUserInterface.cs | 105 ++ .../_FarHorizons/Power/UI/TurbineWindow.xaml | 134 +++ .../Power/UI/TurbineWindow.xaml.cs | 298 +++++ .../Systems/AdminVerbSystem.Smites.cs | 31 + .../GasTurbineMonitorSystem.cs | 252 ++++ .../NuclearCentrifugeComponent.cs | 62 + .../NuclearCentrifugeSystem.cs | 142 +++ .../NuclearReactorMonitorSystem.cs | 195 +++ .../FissionGenerator/NuclearReactorSystem.cs | 1057 +++++++++++++++++ .../ReactorPartSystem.Item.cs | 59 + .../FissionGenerator/ReactorPartSystem.cs | 629 ++++++++++ .../FissionGenerator/TurbineSystem.cs | 704 +++++++++++ .../FissionGenerator/NuclearReactorSystem.cs | 25 + Content.Shared/Materials/MaterialPrototype.cs | 13 + .../Repairable/SharedRepairableSystem.cs | 20 + .../Materials/MaterialProperties.cs | 70 ++ .../Materials/Systems/MaterialSystem.cs | 33 + .../GasTurbineMonitorComponent.cs | 15 + .../GasTurbinePartComponent.cs | 34 + .../NuclearReactorComponent.cs | 370 ++++++ .../NuclearReactorMonitorComponent.cs | 15 + .../NuclearReactorPrefabPrototype.cs | 14 + .../FissionGenerator/ReactorPartComponent.cs | 199 ++++ .../SharedNuclearCentrifugeVisuals.cs | 27 + .../SharedNuclearReactorComponent.cs | 62 + .../SharedNuclearReactorSystem.cs | 129 ++ .../SharedNuclearReactorVisuals.cs | 86 ++ .../SharedReactorPartSystem.cs | 2 + .../SharedTurbineComponent.cs | 63 + .../FissionGenerator/SharedTurbineSystem.cs | 239 ++++ .../FissionGenerator/SharedTurbineVisuals.cs | 28 + .../FissionGenerator/TurbineComponent.cs | 289 +++++ .../Ambience/Objects/attributions.yml | 9 + .../Ambience/Objects/electrical_hum.ogg | Bin 0 -> 95896 bytes .../Ambience/Objects/turbine_room.ogg | Bin 0 -> 23803 bytes .../_FarHorizons/Effects/engine_grump1.ogg | Bin 0 -> 17562 bytes .../_FarHorizons/Effects/engine_grump2.ogg | Bin 0 -> 15483 bytes .../_FarHorizons/Effects/engine_grump3.ogg | Bin 0 -> 17398 bytes .../_FarHorizons/Machines/alarm_beep.ogg | Bin 0 -> 15653 bytes .../_FarHorizons/Machines/alarm_buzzer.ogg | Bin 0 -> 46424 bytes .../_FarHorizons/Machines/attributions.yml | 34 + .../_FarHorizons/Machines/meltdown_siren.ogg | Bin 0 -> 49681 bytes .../_FarHorizons/Machines/reactor_alarm_1.ogg | Bin 0 -> 31642 bytes .../_FarHorizons/Machines/reactor_alarm_2.ogg | Bin 0 -> 18175 bytes .../_FarHorizons/Machines/reactor_alarm_3.ogg | Bin 0 -> 46315 bytes .../_FarHorizons/Machines/relay_click.ogg | Bin 0 -> 6370 bytes Resources/Audio/_WF/Machines/attributions.yml | 4 + .../_WF/Machines/reactor_meltdown_alarm.ogg | Bin 0 -> 188251 bytes .../_FarHorizons/administration/smites.ftl | 7 + .../fission-generator/nuclear-centrifuge.ftl | 4 + .../fission-generator/nuclear-reactor.ftl | 47 + .../fission-generator/reactor-part.ftl | 16 + .../fission-generator/turbine-component.ftl | 77 ++ .../ghost/roles/ghost-role-component.ftl | 6 + .../en-US/_FarHorizons/guidebook/guides.ftl | 2 + .../machine-linking/receiver_ports.ftl | 23 + .../machine-linking/transmitter_ports.ftl | 14 + .../_FarHorizons/materials/materials.ftl | 3 + .../_FarHorizons/research/technologies.ftl | 5 + .../en-US/_FarHorizons/stack/stacks.ftl | 2 + .../_WF/fission-generator/nuclear-reactor.ftl | 13 + .../Catalog/Fills/Crates/emergency.yml | 1 + .../Catalog/Fills/Lockers/engineer.yml | 3 + .../Entities/Structures/Machines/lathe.yml | 1 + .../Prototypes/Guidebook/engineering.yml | 1 + .../Prototypes/Reagents/Materials/glass.yml | 53 +- .../Reagents/Materials/materials.yml | 93 ++ .../Prototypes/Reagents/Materials/metals.yml | 34 +- .../Catalog/Cargo/cargo_engineering.yml | 79 ++ .../Catalog/Fills/Crates/reactor_crates.yml | 43 + .../_FarHorizons/Damage/modifier_sets.yml | 16 + .../_FarHorizons/DeviceLinking/sink_ports.yml | 41 + .../DeviceLinking/source_ports.yml | 23 + .../Machine/nuclear_machines.yml | 29 + .../Devices/Circuitboards/computer.yml | 21 + .../Entities/Objects/Devices/flatpack.yml | 47 + .../Objects/Devices/holoprojectors.yml | 22 + .../Entities/Objects/Materials/ingots.yml | 52 + .../Structures/Holographic/projections.yml | 20 + .../Machines/Computers/computers.yml | 87 ++ .../Machines/nuclear_fabricator.yml | 42 + .../FissionGenerator/gasTurbine_parts.yml | 132 ++ .../FissionGenerator/nuclear_centrifuge.yml | 33 + .../FissionGenerator/nuclear_reactor.yml | 522 ++++++++ .../nuclear_reactor_prefabs.yml | 254 ++++ .../FissionGenerator/reactor_components.yml | 512 ++++++++ .../Generation/FissionGenerator/turbine.yml | 240 ++++ .../FissionGenerator/turbineProjectile.yml | 48 + .../_FarHorizons/Guidebook/engineering.yml | 11 + .../_FarHorizons/Polymorphs/admin.yml | 6 + .../Reagents/Materials/metals.yml | 45 + .../Recipes/Lathes/Packs/engineering.yml | 74 ++ .../Recipes/Lathes/computer_boards.yml | 9 + .../Recipes/Lathes/machine_boards.yml | 9 + .../Recipes/Lathes/reactor_parts.yml | 265 +++++ .../Recipes/Lathes/turbine_parts.yml | 68 ++ .../_FarHorizons/Research/industrial.yml | 59 + .../_FarHorizons/Stacks/Materials/ingots.yml | 6 + Resources/Prototypes/_FarHorizons/tags.yml | 5 + Resources/Prototypes/tags.yml | 3 + .../Guidebook/Engineering/Generators.xml | 11 + .../Engineering/NuclearMaterials.xml | 822 +++++++++++++ .../Guidebook/Engineering/NuclearReactor.xml | 269 +++++ .../Holoprojectors/radiation.rsi/icon.png | Bin 0 -> 774 bytes .../radiation.rsi/inhand-left.png | Bin 0 -> 1189 bytes .../radiation.rsi/inhand-right.png | Bin 0 -> 1253 bytes .../Holoprojectors/radiation.rsi/meta.json | 82 ++ .../Structures/Holo/radiation.rsi/icon.png | Bin 0 -> 1939 bytes .../Structures/Holo/radiation.rsi/meta.json | 30 + .../cargo_icons.rsi/meta.json | 17 + .../cargo_icons.rsi/reactor.png | Bin 0 -> 1708 bytes .../cargo_icons.rsi/turbine.png | Bin 0 -> 1743 bytes .../indicator_lamps/amberdim.png | Bin 0 -> 180 bytes .../indicator_lamps/amberlit.png | Bin 0 -> 180 bytes .../indicator_lamps/bluedim.png | Bin 0 -> 180 bytes .../indicator_lamps/bluelit.png | Bin 0 -> 180 bytes .../indicator_lamps/reddim.png | Bin 0 -> 180 bytes .../indicator_lamps/redlit.png | Bin 0 -> 180 bytes .../nuclear_centrifuge.rsi/centrifuge.png | Bin 0 -> 886 bytes .../centrifuge_onlight.png | Bin 0 -> 263 bytes .../centrifuge_process.png | Bin 0 -> 1822 bytes .../centrifuge_processfull.png | Bin 0 -> 1423 bytes .../nuclear_centrifuge.rsi/meta.json | 47 + .../nuclear_debris.rsi/graphite_damaged_0.png | Bin 0 -> 346 bytes .../graphite_damaged_0_mirrored.png | Bin 0 -> 327 bytes .../nuclear_debris.rsi/graphite_damaged_1.png | Bin 0 -> 344 bytes .../graphite_damaged_1_mirrored.png | Bin 0 -> 341 bytes .../nuclear_debris.rsi/graphite_damaged_2.png | Bin 0 -> 332 bytes .../graphite_damaged_2_mirrored.png | Bin 0 -> 285 bytes .../nuclear_debris.rsi/graphite_damaged_3.png | Bin 0 -> 396 bytes .../graphite_damaged_3_mirrored.png | Bin 0 -> 382 bytes .../nuclear_debris.rsi/graphite_damaged_4.png | Bin 0 -> 323 bytes .../graphite_damaged_4_mirrored.png | Bin 0 -> 276 bytes .../nuclear_debris.rsi/meta.json | 41 + .../nuclear_reactor.rsi/meta.json | 136 +++ .../nuclear_reactor.rsi/reactor.png | Bin 0 -> 5654 bytes .../nuclear_reactor.rsi/reactor_fire.png | Bin 0 -> 292 bytes .../reactor_gas_input_lights.png | Bin 0 -> 1842 bytes .../reactor_gas_output_lights.png | Bin 0 -> 1855 bytes .../reactor_lights_meltdown.png | Bin 0 -> 1547 bytes .../reactor_lights_warning.png | Bin 0 -> 1547 bytes .../nuclear_reactor.rsi/reactor_smoke.png | Bin 0 -> 292 bytes .../reactor_status_active.png | Bin 0 -> 2878 bytes .../reactor_status_meltdown.png | Bin 0 -> 4486 bytes .../reactor_status_overheat.png | Bin 0 -> 8618 bytes .../nuclear_reactor.rsi/reactorbroken.png | Bin 0 -> 94582 bytes .../reactor_component_cap.rsi/base_cap.png | Bin 0 -> 788 bytes .../reactor_component_cap.rsi/control_cap.png | Bin 0 -> 799 bytes .../control_cap_melted_1.png | Bin 0 -> 802 bytes .../control_cap_melted_2.png | Bin 0 -> 803 bytes .../control_cap_melted_3.png | Bin 0 -> 804 bytes .../control_cap_melted_4.png | Bin 0 -> 803 bytes .../reactor_component_cap.rsi/empty_cap.png | Bin 0 -> 196 bytes .../reactor_component_cap.rsi/fuel_cap.png | Bin 0 -> 342 bytes .../fuel_cap_melted_1.png | Bin 0 -> 796 bytes .../fuel_cap_melted_2.png | Bin 0 -> 794 bytes .../fuel_cap_melted_3.png | Bin 0 -> 793 bytes .../fuel_cap_melted_4.png | Bin 0 -> 793 bytes .../reactor_component_cap.rsi/gas_cap.png | Bin 0 -> 797 bytes .../gas_cap_melted_1.png | Bin 0 -> 815 bytes .../gas_cap_melted_2.png | Bin 0 -> 802 bytes .../gas_cap_melted_3.png | Bin 0 -> 812 bytes .../gas_cap_melted_4.png | Bin 0 -> 801 bytes .../reactor_component_cap.rsi/heat_cap.png | Bin 0 -> 773 bytes .../heat_cap_melted_1.png | Bin 0 -> 800 bytes .../heat_cap_melted_2.png | Bin 0 -> 804 bytes .../heat_cap_melted_3.png | Bin 0 -> 797 bytes .../heat_cap_melted_4.png | Bin 0 -> 802 bytes .../reactor_component_cap.rsi/meta.json | 77 ++ .../reactor_part_inserted/arrow_down.png | Bin 0 -> 256 bytes .../reactor_part_inserted/arrow_left.png | Bin 0 -> 271 bytes .../reactor_part_inserted/arrow_right.png | Bin 0 -> 274 bytes .../reactor_part_inserted/arrow_up.png | Bin 0 -> 216 bytes .../reactor_part_inserted/base.png | Bin 0 -> 153 bytes .../reactor_part_inserted/control.png | Bin 0 -> 291 bytes .../reactor_part_inserted/fuel.png | Bin 0 -> 282 bytes .../reactor_part_inserted/gas.png | Bin 0 -> 213 bytes .../reactor_part_inserted/heat.png | Bin 0 -> 183 bytes .../reactor_parts.rsi/default_rod.png | Bin 0 -> 840 bytes .../reactor_parts.rsi/icon.png | Bin 0 -> 840 bytes .../reactor_parts.rsi/meta.json | 20 + .../reactor_parts.rsi/nuclear_waste.png | Bin 0 -> 915 bytes .../small_nuclear_reactor.rsi/meta.json | 135 +++ .../small_nuclear_reactor.rsi/reactor.png | Bin 0 -> 4319 bytes .../reactor_fire.png | Bin 0 -> 384 bytes .../reactor_gas_input_lights.png | Bin 0 -> 2768 bytes .../reactor_gas_output_lights.png | Bin 0 -> 4180 bytes .../reactor_lights_meltdown.png | Bin 0 -> 2396 bytes .../reactor_lights_warning.png | Bin 0 -> 2396 bytes .../reactor_smoke.png | Bin 0 -> 384 bytes .../reactor_status_active.png | Bin 0 -> 2388 bytes .../reactor_status_meltdown.png | Bin 0 -> 2495 bytes .../reactor_status_overheat.png | Bin 0 -> 7184 bytes .../reactorbroken.png | Bin 0 -> 50681 bytes .../small_turbine.rsi/meta.json | 81 ++ .../small_turbine.rsi/static.png | Bin 0 -> 1750 bytes .../small_turbine.rsi/turbine.png | Bin 0 -> 3050 bytes .../small_turbine.rsi/turbine_smoke.png | Bin 0 -> 285 bytes .../small_turbine.rsi/turbine_sparks.png | Bin 0 -> 285 bytes .../small_turbine.rsi/turbinebroken.png | Bin 0 -> 9950 bytes .../small_turbine.rsi/turbinerun.png | Bin 0 -> 16148 bytes .../small_turbine.rsi/turbinerun_00.png | Bin 0 -> 2965 bytes .../small_turbine.rsi/turbinerun_01.png | Bin 0 -> 2980 bytes .../small_turbine.rsi/turbinerun_02.png | Bin 0 -> 3142 bytes .../small_turbine.rsi/turbinerun_03.png | Bin 0 -> 3218 bytes .../small_turbine.rsi/turbinerun_04.png | Bin 0 -> 3458 bytes .../small_turbine.rsi/turbinerun_05.png | Bin 0 -> 3361 bytes .../small_turbine.rsi/turbinerun_06.png | Bin 0 -> 2965 bytes .../small_turbine.rsi/turbinerun_07.png | Bin 0 -> 2953 bytes .../small_turbine.rsi/turbinerun_08.png | Bin 0 -> 2948 bytes .../small_turbine.rsi/turbinerun_09.png | Bin 0 -> 2942 bytes .../small_turbine.rsi/turbinerun_10.png | Bin 0 -> 2937 bytes .../small_turbine.rsi/turbinerun_11.png | Bin 0 -> 2955 bytes .../FissionGenerator/turbine.rsi/meta.json | 82 ++ .../FissionGenerator/turbine.rsi/static.png | Bin 0 -> 1927 bytes .../FissionGenerator/turbine.rsi/turbine.png | Bin 0 -> 4979 bytes .../turbine.rsi/turbine_smoke.png | Bin 0 -> 253 bytes .../turbine.rsi/turbine_sparks.png | Bin 0 -> 253 bytes .../turbine.rsi/turbinebroken.png | Bin 0 -> 12107 bytes .../turbine.rsi/turbinerun.png | Bin 0 -> 27996 bytes .../turbine.rsi/turbinerun_00.png | Bin 0 -> 6213 bytes .../turbine.rsi/turbinerun_01.png | Bin 0 -> 6589 bytes .../turbine.rsi/turbinerun_02.png | Bin 0 -> 6909 bytes .../turbine.rsi/turbinerun_03.png | Bin 0 -> 6869 bytes .../turbine.rsi/turbinerun_04.png | Bin 0 -> 6892 bytes .../turbine.rsi/turbinerun_05.png | Bin 0 -> 6494 bytes .../turbine.rsi/turbinerun_06.png | Bin 0 -> 6015 bytes .../turbine.rsi/turbinerun_07.png | Bin 0 -> 6061 bytes .../turbine.rsi/turbinerun_08.png | Bin 0 -> 6006 bytes .../turbine.rsi/turbinerun_09.png | Bin 0 -> 6034 bytes .../turbine.rsi/turbinerun_10.png | Bin 0 -> 6051 bytes .../turbine.rsi/turbinerun_11.png | Bin 0 -> 6013 bytes .../turbine_parts.rsi/meta.json | 17 + .../turbine_parts.rsi/turbine_blade.png | Bin 0 -> 1038 bytes .../turbine_parts.rsi/turbine_stator.png | Bin 0 -> 1236 bytes .../FissionGenerator/turbine_parts/blade.png | Bin 0 -> 1089 bytes .../FissionGenerator/turbine_parts/stator.png | Bin 0 -> 708 bytes 243 files changed, 11471 insertions(+), 2 deletions(-) create mode 100644 Content.Client/_FarHorizons/Power/Generation/FissionGenerator/NuclearReactorSystem.cs create mode 100644 Content.Client/_FarHorizons/Power/Generation/FissionGenerator/ReactorPartSystem.cs create mode 100644 Content.Client/_FarHorizons/Power/Generation/FissionGenerator/TurbineSystem.cs create mode 100644 Content.Client/_FarHorizons/Power/UI/NuclearReactorBoundUserInterface.cs create mode 100644 Content.Client/_FarHorizons/Power/UI/NuclearReactorWindow.xaml create mode 100644 Content.Client/_FarHorizons/Power/UI/NuclearReactorWindow.xaml.cs create mode 100644 Content.Client/_FarHorizons/Power/UI/TurbineBoundUserInterface.cs create mode 100644 Content.Client/_FarHorizons/Power/UI/TurbineWindow.xaml create mode 100644 Content.Client/_FarHorizons/Power/UI/TurbineWindow.xaml.cs create mode 100644 Content.Server/_FarHorizons/Power/Generation/FissionGenerator/GasTurbineMonitorSystem.cs create mode 100644 Content.Server/_FarHorizons/Power/Generation/FissionGenerator/NuclearCentrifugeComponent.cs create mode 100644 Content.Server/_FarHorizons/Power/Generation/FissionGenerator/NuclearCentrifugeSystem.cs create mode 100644 Content.Server/_FarHorizons/Power/Generation/FissionGenerator/NuclearReactorMonitorSystem.cs create mode 100644 Content.Server/_FarHorizons/Power/Generation/FissionGenerator/NuclearReactorSystem.cs create mode 100644 Content.Server/_FarHorizons/Power/Generation/FissionGenerator/ReactorPartSystem.Item.cs create mode 100644 Content.Server/_FarHorizons/Power/Generation/FissionGenerator/ReactorPartSystem.cs create mode 100644 Content.Server/_FarHorizons/Power/Generation/FissionGenerator/TurbineSystem.cs create mode 100644 Content.Server/_WF/Power/Generation/FissionGenerator/NuclearReactorSystem.cs create mode 100644 Content.Shared/Repairable/SharedRepairableSystem.cs create mode 100644 Content.Shared/_FarHorizons/Materials/MaterialProperties.cs create mode 100644 Content.Shared/_FarHorizons/Materials/Systems/MaterialSystem.cs create mode 100644 Content.Shared/_FarHorizons/Power/Generation/FissionGenerator/GasTurbineMonitorComponent.cs create mode 100644 Content.Shared/_FarHorizons/Power/Generation/FissionGenerator/GasTurbinePartComponent.cs create mode 100644 Content.Shared/_FarHorizons/Power/Generation/FissionGenerator/NuclearReactorComponent.cs create mode 100644 Content.Shared/_FarHorizons/Power/Generation/FissionGenerator/NuclearReactorMonitorComponent.cs create mode 100644 Content.Shared/_FarHorizons/Power/Generation/FissionGenerator/NuclearReactorPrefabPrototype.cs create mode 100644 Content.Shared/_FarHorizons/Power/Generation/FissionGenerator/ReactorPartComponent.cs create mode 100644 Content.Shared/_FarHorizons/Power/Generation/FissionGenerator/SharedNuclearCentrifugeVisuals.cs create mode 100644 Content.Shared/_FarHorizons/Power/Generation/FissionGenerator/SharedNuclearReactorComponent.cs create mode 100644 Content.Shared/_FarHorizons/Power/Generation/FissionGenerator/SharedNuclearReactorSystem.cs create mode 100644 Content.Shared/_FarHorizons/Power/Generation/FissionGenerator/SharedNuclearReactorVisuals.cs create mode 100644 Content.Shared/_FarHorizons/Power/Generation/FissionGenerator/SharedReactorPartSystem.cs create mode 100644 Content.Shared/_FarHorizons/Power/Generation/FissionGenerator/SharedTurbineComponent.cs create mode 100644 Content.Shared/_FarHorizons/Power/Generation/FissionGenerator/SharedTurbineSystem.cs create mode 100644 Content.Shared/_FarHorizons/Power/Generation/FissionGenerator/SharedTurbineVisuals.cs create mode 100644 Content.Shared/_FarHorizons/Power/Generation/FissionGenerator/TurbineComponent.cs create mode 100644 Resources/Audio/_FarHorizons/Ambience/Objects/attributions.yml create mode 100644 Resources/Audio/_FarHorizons/Ambience/Objects/electrical_hum.ogg create mode 100644 Resources/Audio/_FarHorizons/Ambience/Objects/turbine_room.ogg create mode 100644 Resources/Audio/_FarHorizons/Effects/engine_grump1.ogg create mode 100644 Resources/Audio/_FarHorizons/Effects/engine_grump2.ogg create mode 100644 Resources/Audio/_FarHorizons/Effects/engine_grump3.ogg create mode 100644 Resources/Audio/_FarHorizons/Machines/alarm_beep.ogg create mode 100644 Resources/Audio/_FarHorizons/Machines/alarm_buzzer.ogg create mode 100644 Resources/Audio/_FarHorizons/Machines/attributions.yml create mode 100644 Resources/Audio/_FarHorizons/Machines/meltdown_siren.ogg create mode 100644 Resources/Audio/_FarHorizons/Machines/reactor_alarm_1.ogg create mode 100644 Resources/Audio/_FarHorizons/Machines/reactor_alarm_2.ogg create mode 100644 Resources/Audio/_FarHorizons/Machines/reactor_alarm_3.ogg create mode 100644 Resources/Audio/_FarHorizons/Machines/relay_click.ogg create mode 100644 Resources/Audio/_WF/Machines/attributions.yml create mode 100644 Resources/Audio/_WF/Machines/reactor_meltdown_alarm.ogg create mode 100644 Resources/Locale/en-US/_FarHorizons/administration/smites.ftl create mode 100644 Resources/Locale/en-US/_FarHorizons/fission-generator/nuclear-centrifuge.ftl create mode 100644 Resources/Locale/en-US/_FarHorizons/fission-generator/nuclear-reactor.ftl create mode 100644 Resources/Locale/en-US/_FarHorizons/fission-generator/reactor-part.ftl create mode 100644 Resources/Locale/en-US/_FarHorizons/fission-generator/turbine-component.ftl create mode 100644 Resources/Locale/en-US/_FarHorizons/ghost/roles/ghost-role-component.ftl create mode 100644 Resources/Locale/en-US/_FarHorizons/guidebook/guides.ftl create mode 100644 Resources/Locale/en-US/_FarHorizons/machine-linking/receiver_ports.ftl create mode 100644 Resources/Locale/en-US/_FarHorizons/machine-linking/transmitter_ports.ftl create mode 100644 Resources/Locale/en-US/_FarHorizons/materials/materials.ftl create mode 100644 Resources/Locale/en-US/_FarHorizons/research/technologies.ftl create mode 100644 Resources/Locale/en-US/_FarHorizons/stack/stacks.ftl create mode 100644 Resources/Locale/en-US/_WF/fission-generator/nuclear-reactor.ftl create mode 100644 Resources/Prototypes/_FarHorizons/Catalog/Cargo/cargo_engineering.yml create mode 100644 Resources/Prototypes/_FarHorizons/Catalog/Fills/Crates/reactor_crates.yml create mode 100644 Resources/Prototypes/_FarHorizons/Damage/modifier_sets.yml create mode 100644 Resources/Prototypes/_FarHorizons/DeviceLinking/sink_ports.yml create mode 100644 Resources/Prototypes/_FarHorizons/DeviceLinking/source_ports.yml create mode 100644 Resources/Prototypes/_FarHorizons/Entities/Objects/Devices/Circuitboards/Machine/nuclear_machines.yml create mode 100644 Resources/Prototypes/_FarHorizons/Entities/Objects/Devices/Circuitboards/computer.yml create mode 100644 Resources/Prototypes/_FarHorizons/Entities/Objects/Devices/flatpack.yml create mode 100644 Resources/Prototypes/_FarHorizons/Entities/Objects/Devices/holoprojectors.yml create mode 100644 Resources/Prototypes/_FarHorizons/Entities/Objects/Materials/ingots.yml create mode 100644 Resources/Prototypes/_FarHorizons/Entities/Structures/Holographic/projections.yml create mode 100644 Resources/Prototypes/_FarHorizons/Entities/Structures/Machines/Computers/computers.yml create mode 100644 Resources/Prototypes/_FarHorizons/Entities/Structures/Machines/nuclear_fabricator.yml create mode 100644 Resources/Prototypes/_FarHorizons/Entities/Structures/Power/Generation/FissionGenerator/gasTurbine_parts.yml create mode 100644 Resources/Prototypes/_FarHorizons/Entities/Structures/Power/Generation/FissionGenerator/nuclear_centrifuge.yml create mode 100644 Resources/Prototypes/_FarHorizons/Entities/Structures/Power/Generation/FissionGenerator/nuclear_reactor.yml create mode 100644 Resources/Prototypes/_FarHorizons/Entities/Structures/Power/Generation/FissionGenerator/nuclear_reactor_prefabs.yml create mode 100644 Resources/Prototypes/_FarHorizons/Entities/Structures/Power/Generation/FissionGenerator/reactor_components.yml create mode 100644 Resources/Prototypes/_FarHorizons/Entities/Structures/Power/Generation/FissionGenerator/turbine.yml create mode 100644 Resources/Prototypes/_FarHorizons/Entities/Structures/Power/Generation/FissionGenerator/turbineProjectile.yml create mode 100644 Resources/Prototypes/_FarHorizons/Guidebook/engineering.yml create mode 100644 Resources/Prototypes/_FarHorizons/Polymorphs/admin.yml create mode 100644 Resources/Prototypes/_FarHorizons/Reagents/Materials/metals.yml create mode 100644 Resources/Prototypes/_FarHorizons/Recipes/Lathes/Packs/engineering.yml create mode 100644 Resources/Prototypes/_FarHorizons/Recipes/Lathes/computer_boards.yml create mode 100644 Resources/Prototypes/_FarHorizons/Recipes/Lathes/machine_boards.yml create mode 100644 Resources/Prototypes/_FarHorizons/Recipes/Lathes/reactor_parts.yml create mode 100644 Resources/Prototypes/_FarHorizons/Recipes/Lathes/turbine_parts.yml create mode 100644 Resources/Prototypes/_FarHorizons/Research/industrial.yml create mode 100644 Resources/Prototypes/_FarHorizons/Stacks/Materials/ingots.yml create mode 100644 Resources/Prototypes/_FarHorizons/tags.yml create mode 100644 Resources/ServerInfo/_FarHorizons/Guidebook/Engineering/NuclearMaterials.xml create mode 100644 Resources/ServerInfo/_FarHorizons/Guidebook/Engineering/NuclearReactor.xml create mode 100644 Resources/Textures/_FarHorizons/Objects/Devices/Holoprojectors/radiation.rsi/icon.png create mode 100644 Resources/Textures/_FarHorizons/Objects/Devices/Holoprojectors/radiation.rsi/inhand-left.png create mode 100644 Resources/Textures/_FarHorizons/Objects/Devices/Holoprojectors/radiation.rsi/inhand-right.png create mode 100644 Resources/Textures/_FarHorizons/Objects/Devices/Holoprojectors/radiation.rsi/meta.json create mode 100644 Resources/Textures/_FarHorizons/Structures/Holo/radiation.rsi/icon.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Holo/radiation.rsi/meta.json create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/cargo_icons.rsi/meta.json create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/cargo_icons.rsi/reactor.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/cargo_icons.rsi/turbine.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/indicator_lamps/amberdim.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/indicator_lamps/amberlit.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/indicator_lamps/bluedim.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/indicator_lamps/bluelit.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/indicator_lamps/reddim.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/indicator_lamps/redlit.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_centrifuge.rsi/centrifuge.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_centrifuge.rsi/centrifuge_onlight.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_centrifuge.rsi/centrifuge_process.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_centrifuge.rsi/centrifuge_processfull.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_centrifuge.rsi/meta.json create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_debris.rsi/graphite_damaged_0.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_debris.rsi/graphite_damaged_0_mirrored.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_debris.rsi/graphite_damaged_1.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_debris.rsi/graphite_damaged_1_mirrored.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_debris.rsi/graphite_damaged_2.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_debris.rsi/graphite_damaged_2_mirrored.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_debris.rsi/graphite_damaged_3.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_debris.rsi/graphite_damaged_3_mirrored.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_debris.rsi/graphite_damaged_4.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_debris.rsi/graphite_damaged_4_mirrored.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_debris.rsi/meta.json create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_reactor.rsi/meta.json create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_reactor.rsi/reactor.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_reactor.rsi/reactor_fire.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_reactor.rsi/reactor_gas_input_lights.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_reactor.rsi/reactor_gas_output_lights.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_reactor.rsi/reactor_lights_meltdown.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_reactor.rsi/reactor_lights_warning.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_reactor.rsi/reactor_smoke.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_reactor.rsi/reactor_status_active.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_reactor.rsi/reactor_status_meltdown.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_reactor.rsi/reactor_status_overheat.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/nuclear_reactor.rsi/reactorbroken.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/base_cap.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/control_cap.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/control_cap_melted_1.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/control_cap_melted_2.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/control_cap_melted_3.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/control_cap_melted_4.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/empty_cap.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/fuel_cap.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/fuel_cap_melted_1.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/fuel_cap_melted_2.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/fuel_cap_melted_3.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/fuel_cap_melted_4.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/gas_cap.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/gas_cap_melted_1.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/gas_cap_melted_2.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/gas_cap_melted_3.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/gas_cap_melted_4.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/heat_cap.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/heat_cap_melted_1.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/heat_cap_melted_2.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/heat_cap_melted_3.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/heat_cap_melted_4.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi/meta.json create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_part_inserted/arrow_down.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_part_inserted/arrow_left.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_part_inserted/arrow_right.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_part_inserted/arrow_up.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_part_inserted/base.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_part_inserted/control.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_part_inserted/fuel.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_part_inserted/gas.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_part_inserted/heat.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_parts.rsi/default_rod.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_parts.rsi/icon.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_parts.rsi/meta.json create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_parts.rsi/nuclear_waste.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_nuclear_reactor.rsi/meta.json create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_nuclear_reactor.rsi/reactor.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_nuclear_reactor.rsi/reactor_fire.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_nuclear_reactor.rsi/reactor_gas_input_lights.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_nuclear_reactor.rsi/reactor_gas_output_lights.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_nuclear_reactor.rsi/reactor_lights_meltdown.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_nuclear_reactor.rsi/reactor_lights_warning.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_nuclear_reactor.rsi/reactor_smoke.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_nuclear_reactor.rsi/reactor_status_active.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_nuclear_reactor.rsi/reactor_status_meltdown.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_nuclear_reactor.rsi/reactor_status_overheat.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_nuclear_reactor.rsi/reactorbroken.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_turbine.rsi/meta.json create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_turbine.rsi/static.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_turbine.rsi/turbine.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_turbine.rsi/turbine_smoke.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_turbine.rsi/turbine_sparks.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_turbine.rsi/turbinebroken.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_turbine.rsi/turbinerun.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_turbine.rsi/turbinerun_00.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_turbine.rsi/turbinerun_01.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_turbine.rsi/turbinerun_02.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_turbine.rsi/turbinerun_03.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_turbine.rsi/turbinerun_04.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_turbine.rsi/turbinerun_05.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_turbine.rsi/turbinerun_06.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_turbine.rsi/turbinerun_07.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_turbine.rsi/turbinerun_08.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_turbine.rsi/turbinerun_09.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_turbine.rsi/turbinerun_10.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/small_turbine.rsi/turbinerun_11.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine.rsi/meta.json create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine.rsi/static.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine.rsi/turbine.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine.rsi/turbine_smoke.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine.rsi/turbine_sparks.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine.rsi/turbinebroken.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine.rsi/turbinerun.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine.rsi/turbinerun_00.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine.rsi/turbinerun_01.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine.rsi/turbinerun_02.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine.rsi/turbinerun_03.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine.rsi/turbinerun_04.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine.rsi/turbinerun_05.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine.rsi/turbinerun_06.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine.rsi/turbinerun_07.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine.rsi/turbinerun_08.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine.rsi/turbinerun_09.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine.rsi/turbinerun_10.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine.rsi/turbinerun_11.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine_parts.rsi/meta.json create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine_parts.rsi/turbine_blade.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine_parts.rsi/turbine_stator.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine_parts/blade.png create mode 100644 Resources/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/turbine_parts/stator.png diff --git a/Content.Client/_FarHorizons/Power/Generation/FissionGenerator/NuclearReactorSystem.cs b/Content.Client/_FarHorizons/Power/Generation/FissionGenerator/NuclearReactorSystem.cs new file mode 100644 index 000000000000..a05520b9a9b2 --- /dev/null +++ b/Content.Client/_FarHorizons/Power/Generation/FissionGenerator/NuclearReactorSystem.cs @@ -0,0 +1,94 @@ +// SPDX-FileCopyrightText: 2025 jhrushbe +// SPDX-FileCopyrightText: 2025 rottenheadphones +// SPDX-FileCopyrightText: 2025 taydeo +// +// SPDX-License-Identifier: CC-BY-NC-SA-3.0 + +using Content.Client.NodeContainer; +using Content.Shared._FarHorizons.Power.Generation.FissionGenerator; +using Robust.Shared.Map; +using Content.Client.Examine; +using Robust.Client.GameObjects; +using Robust.Client.ResourceManagement; + +namespace Content.Client._FarHorizons.Power.Generation.FissionGenerator; + +public sealed class NuclearReactorSystem : SharedNuclearReactorSystem +{ + [Dependency] private readonly SpriteSystem _sprite = default!; + [Dependency] private readonly IResourceCache _resourceCache = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInit); + + SubscribeLocalEvent(ReactorExamined); + SubscribeLocalEvent(OnAppearanceChange); + } + + private void OnInit(EntityUid uid, NuclearReactorComponent comp, ref ComponentInit args) + { + if (!TryComp(uid, out var sprite)) + return; + + if (!_resourceCache.TryGetResource("/Textures/_FarHorizons/Structures/Power/Generation/FissionGenerator/reactor_component_cap.rsi", out RSIResource? resource)) + return; + + Entity entSprite = (uid, sprite); + var xspace = comp.Gridbounds[0] / 32f; + var yspace = comp.Gridbounds[1] / 32f; + var xoff = comp.Gridbounds[2] / 32f; + var yoff = comp.Gridbounds[3] / 32f; + + var gridWidth = comp.ReactorGridWidth; + var gridHeight = comp.ReactorGridHeight; + + var xAdj = (gridWidth - 1) / 2f; + var yAdj = (gridHeight - 1) / 2f; + + for (var x = 0; x < gridWidth; x++) + { + for (var y = 0; y < gridHeight; y++) + { + var layerID = _sprite.AddRsiLayer(entSprite, "empty_cap", resource.RSI); + _sprite.LayerMapSet(entSprite, FormatMap(x, y), layerID); + _sprite.LayerSetOffset(entSprite, layerID, new((xspace * (y - yAdj)) - xoff, (-yspace * (x - xAdj)) - yoff)); + _sprite.LayerSetColor(entSprite, layerID, Color.Black); + } + } + } + + private static string FormatMap(int x, int y) => "NuclearReactorCap" + x + "/" + y; + + private void ReactorExamined(EntityUid uid, NuclearReactorComponent comp, ClientExaminedEvent args) => Spawn(comp.ArrowPrototype, new EntityCoordinates(uid, 0, 0)); + + private void OnAppearanceChange(EntityUid uid, NuclearReactorComponent comp, ref AppearanceChangeEvent args) + { + for (var x = 0; x < comp.ReactorGridWidth; x++) + { + for (var y = 0; y < comp.ReactorGridHeight; y++) + { + if(comp.VisualData.TryGetValue(new(x,y), out var data)) + UpdateRodAppearance(uid, FormatMap(x,y), data.cap, data.color); + else + UpdateRodAppearance(uid, FormatMap(x, y), "empty_cap", Color.Black); + } + } + } + + private void UpdateRodAppearance(EntityUid uid, string map, string state, Color color) + { + if (!TryComp(uid, out var sprite)) + return; + + Entity entSprite = (uid, sprite); + + if (!_sprite.LayerMapTryGet(entSprite, map, out var layer, false)) + return; + + _sprite.LayerSetRsiState(entSprite, layer, state); + _sprite.LayerSetColor(entSprite, layer, color); + } +} diff --git a/Content.Client/_FarHorizons/Power/Generation/FissionGenerator/ReactorPartSystem.cs b/Content.Client/_FarHorizons/Power/Generation/FissionGenerator/ReactorPartSystem.cs new file mode 100644 index 000000000000..cd477e2aa963 --- /dev/null +++ b/Content.Client/_FarHorizons/Power/Generation/FissionGenerator/ReactorPartSystem.cs @@ -0,0 +1,40 @@ +// SPDX-FileCopyrightText: 2025 jhrushbe +// SPDX-FileCopyrightText: 2025 rottenheadphones +// SPDX-FileCopyrightText: 2025 taydeo +// +// SPDX-License-Identifier: CC-BY-NC-SA-3.0 + +using Content.Shared._FarHorizons.Power.Generation.FissionGenerator; +using Robust.Client.GameObjects; +using Robust.Shared.Prototypes; + +namespace Content.Client._FarHorizons.Power.Generation.FissionGenerator; + +public sealed class ReactorPartSystem : SharedReactorPartSystem +{ + [Dependency] private readonly SpriteSystem _sprite = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAppearanceChange); + SubscribeLocalEvent(OnComponentInit); + } + + private void OnAppearanceChange(EntityUid uid, ReactorPartComponent component, ref AppearanceChangeEvent args) + { + if (args.Sprite == null) + return; + + // Re-enable if/when there are multiple sprites + //if (!_sprite.LayerMapTryGet((uid, args.Sprite), ReactorCapVisualLayers.Sprite, out var layer, false)) + // return; + + _sprite.LayerSetColor((uid, args.Sprite), 0, _proto.Index(component.Material).Color); + } + + private void OnComponentInit(Entity ent, ref ComponentInit args) + => _sprite.LayerSetColor((ent.Owner, EntityManager.GetComponent(ent.Owner)), 0, _proto.Index(ent.Comp.Material).Color); +} \ No newline at end of file diff --git a/Content.Client/_FarHorizons/Power/Generation/FissionGenerator/TurbineSystem.cs b/Content.Client/_FarHorizons/Power/Generation/FissionGenerator/TurbineSystem.cs new file mode 100644 index 000000000000..1696cdce040f --- /dev/null +++ b/Content.Client/_FarHorizons/Power/Generation/FissionGenerator/TurbineSystem.cs @@ -0,0 +1,147 @@ +using Robust.Shared.Map; +using Robust.Client.GameObjects; +using Content.Shared.Repairable; +using Content.Shared._FarHorizons.Power.Generation.FissionGenerator; +using Content.Client.Popups; +using Content.Client.Examine; +using Robust.Client.Animations; +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Popups; + +namespace Content.Client._FarHorizons.Power.Generation.FissionGenerator; + +// Ported and modified from goonstation by Jhrushbe. +// CC-BY-NC-SA-3.0 +// https://github.com/goonstation/goonstation/blob/ff86b044/code/obj/nuclearreactor/turbine.dm + +public sealed class TurbineSystem : SharedTurbineSystem +{ + [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly AnimationPlayerSystem _animationPlayer = default!; + [Dependency] private readonly SpriteSystem _sprite = default!; + + private readonly float _threshold = 1f; + private float _accumulator = 0; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(TurbineExamined); + + SubscribeLocalEvent(OnAnimationCompleted); + + SubscribeLocalEvent(OnInsertAttempt); + SubscribeLocalEvent(OnEjectAttempt); + } + + protected override void OnRepairTurbineFinished(EntityUid uid, TurbineComponent comp, ref RepairDoAfterEvent args) + { + if (args.Cancelled) + return; + + _popupSystem.PopupClient(Loc.GetString("turbine-repair", ("target", uid), ("tool", args.Used!)), uid, args.User); + } + + private void TurbineExamined(EntityUid uid, TurbineComponent comp, ClientExaminedEvent args) => Spawn(comp.ArrowPrototype, new EntityCoordinates(uid, 0, 0)); + + #region Animation + private void OnAnimationCompleted(EntityUid uid, TurbineComponent comp, ref AnimationCompletedEvent args) => PlayAnimation(uid, comp); + + public override void FrameUpdate(float frameTime) + { + _accumulator += frameTime; + if (_accumulator >= _threshold) + { + AccUpdate(); + _accumulator = 0; + } + } + + private void AccUpdate() + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var component)) + { + // Makes sure the anim doesn't get stuck at low RPM + PlayAnimation(uid, component); + } + } + + private void PlayAnimation(EntityUid uid, TurbineComponent comp) + { + if (!TryComp(uid, out var sprite) || !_sprite.TryGetLayer((uid,sprite), TurbineVisualLayers.TurbineSpeed, out var layer, false)) + return; + + var state = "speedanim"; + if (comp.RPM < 1) + { + _animationPlayer.Stop(uid, state); + _sprite.LayerSetRsiState(layer, "turbine"); + comp.AnimRPM = -comp.BestRPM; // Primes it to start the instant it's spinning again + return; + } + + if (Math.Abs(comp.RPM - comp.AnimRPM) > comp.BestRPM * 0.1) + _animationPlayer.Stop(uid, state); // Current anim is stale, time for a new one + + if (_animationPlayer.HasRunningAnimation(uid, state)) + return; + + comp.AnimRPM = comp.RPM; + var layerKey = TurbineVisualLayers.TurbineSpeed; + var time = 0.5f * comp.BestRPM / comp.RPM; + var timestep = time / 12; + var animation = new Animation + { + Length = TimeSpan.FromSeconds(time), + AnimationTracks = + { + new AnimationTrackSpriteFlick + { + LayerKey = layerKey, + KeyFrames = + { + new AnimationTrackSpriteFlick.KeyFrame("turbinerun_00", 0), + new AnimationTrackSpriteFlick.KeyFrame("turbinerun_01", timestep), + new AnimationTrackSpriteFlick.KeyFrame("turbinerun_02", timestep), + new AnimationTrackSpriteFlick.KeyFrame("turbinerun_03", timestep), + new AnimationTrackSpriteFlick.KeyFrame("turbinerun_04", timestep), + new AnimationTrackSpriteFlick.KeyFrame("turbinerun_05", timestep), + new AnimationTrackSpriteFlick.KeyFrame("turbinerun_06", timestep), + new AnimationTrackSpriteFlick.KeyFrame("turbinerun_07", timestep), + new AnimationTrackSpriteFlick.KeyFrame("turbinerun_08", timestep), + new AnimationTrackSpriteFlick.KeyFrame("turbinerun_09", timestep), + new AnimationTrackSpriteFlick.KeyFrame("turbinerun_10", timestep), + new AnimationTrackSpriteFlick.KeyFrame("turbinerun_11", timestep) + } + } + } + }; + _sprite.LayerSetVisible(layer, true); + _animationPlayer.Play(uid, animation, state); + } + #endregion + + private void OnEjectAttempt(EntityUid uid, TurbineComponent comp, ref ItemSlotEjectAttemptEvent args) + { + if (args.Cancelled) + return; + + if (comp.RPM < 1) + return; + + args.Cancelled = true; + } + + private void OnInsertAttempt(EntityUid uid, TurbineComponent comp, ref ItemSlotInsertAttemptEvent args) + { + if (args.Cancelled) + return; + + if (comp.RPM < 1) + return; + + args.Cancelled = true; + } +} diff --git a/Content.Client/_FarHorizons/Power/UI/NuclearReactorBoundUserInterface.cs b/Content.Client/_FarHorizons/Power/UI/NuclearReactorBoundUserInterface.cs new file mode 100644 index 000000000000..3eb10199d4ab --- /dev/null +++ b/Content.Client/_FarHorizons/Power/UI/NuclearReactorBoundUserInterface.cs @@ -0,0 +1,89 @@ +// SPDX-FileCopyrightText: 2025 jhrushbe +// SPDX-FileCopyrightText: 2025 rottenheadphones +// SPDX-FileCopyrightText: 2025 taydeo +// +// SPDX-License-Identifier: CC-BY-NC-SA-3.0 + +using System.Numerics; +using Content.Client.UserInterface; +using Content.Shared._FarHorizons.Power.Generation.FissionGenerator; +using Content.Shared.Atmos.Piping.Binary.Components; +using Content.Shared.Atmos.Piping.Unary.Components; +using Content.Shared.IdentityManagement; +using JetBrains.Annotations; +using Robust.Client.Timing; +using Robust.Client.UserInterface; + +namespace Content.Client._FarHorizons.Power.UI; + +/// +/// Initializes a and updates it when new server messages are received. +/// +[UsedImplicitly] +public sealed class NuclearReactorBoundUserInterface : BoundUserInterface +{ + [Dependency] private readonly IEntityManager _entityManager = default!; + + [ViewVariables] + private NuclearReactorWindow? _window; + + public NuclearReactorBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) + { + } + + protected override void Open() + { + EntityUid? reactorUid = null; + if (_entityManager.TryGetComponent(Owner, out var reactorMonitorComponent)) + { + if (!_entityManager.TryGetEntity(reactorMonitorComponent.reactor, out reactorUid) || reactorUid == null + || !_entityManager.TryGetComponent(reactorUid, out var monitoredReactorComponent) || monitoredReactorComponent.Melted) + return; + } + else if (!_entityManager.TryGetComponent(Owner, out var reactorComponent) || reactorComponent.Melted) + return; + + base.Open(); + + _window = this.CreateWindow(); + if (_entityManager.EntityExists(reactorUid)) + _window.SetEntity(reactorUid.Value, Owner); + else + _window.SetEntity(Owner); + + _window.ItemActionButtonPressed += OnActionButtonPressed; + _window.EjectButtonPressed += OnEjectButtonPressed; + _window.ControlRodModify += OnControlRodModify; + + Update(); + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + if (state is not NuclearReactorBuiState reactorState) + return; + + _window?.Update(reactorState); + } + + private void OnActionButtonPressed(Vector2d vector) + { + if (_window is null ) return; + + SendPredictedMessage(new ReactorItemActionMessage(vector)); + } + + private void OnEjectButtonPressed() + { + if (_window is null) return; + + SendPredictedMessage(new ReactorEjectItemMessage()); + } + + private void OnControlRodModify(float amount) + { + if (_window is null) return; + + SendPredictedMessage(new ReactorControlRodModifyMessage(amount)); + } +} \ No newline at end of file diff --git a/Content.Client/_FarHorizons/Power/UI/NuclearReactorWindow.xaml b/Content.Client/_FarHorizons/Power/UI/NuclearReactorWindow.xaml new file mode 100644 index 000000000000..499c02a9ac4e --- /dev/null +++ b/Content.Client/_FarHorizons/Power/UI/NuclearReactorWindow.xaml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + +